一、什么是DBUtils及作用

  DBUtils是apache公司写的。DBUtils是java编程中的数据库操作实用工具,小巧简单实用。

  DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。

  1.对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;

  2.对于数据表的写操作,也变得很简单(只需写sql语句)

  3.可以使用数据源,使用JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象

二、DBUtils的三个核心对象

  2.1、QueryRunner类

    QueryRunner中提供对sql语句操作的API.它主要有三个方法:query() 用于执行select,update() 用于执行insert update delete,batch() 批处理。等下下面的会详细的介绍这几种方法的用法。

  2.2、ResultSetHandler接口

    用于定义select操作后,怎样封装结果集.它总共有9个常用的实现类,下面我会详细的为大家介绍怎么去使用。

  2.3、DbUtils类

    它就是一个工具类,定义了关闭资源与事务处理的方法

三、怎么去使用DBUtils框架

  3.1、使用步骤

    导入相对应的jar包

    创建QueryRunner对象

     使用query方法执行select语句

     使用ResultSetHandler封装结果集

     使用DbUtils类释放资源

  3.2、实例

    注:本人使用的是C3P0连接池

  1. import java.sql.ResultSet;
  2. import java.sql.SQLException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import org.apache.commons.dbutils.QueryRunner;
  7. import org.apache.commons.dbutils.ResultSetHandler;
  8. import org.apache.commons.dbutils.handlers.BeanListHandler;
  9. import org.junit.Test;
  10.  
  11. import com.jxlg.domain.User;
  12.  
  13. public class TestSelect {
  14.  
  15. @Test
  16. public void testSelect(){
  17. //创建一个QueryRunner对象
  18. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  19. try {
  20. // new ResultSetHandler<List<User>>告诉我们如何封装结果集
  21. List<User> list = qr.query("select * from user", new ResultSetHandler<List<User>>(){
  22. @Override
  23. //query语句执行select语句后,结果一返回值的形式传递过来
  24. public List<User> handle(ResultSet rs) throws SQLException {
  25. List<User> list = new ArrayList<User>();
  26. while(rs.next()){
  27. User u = new User();
  28. u.setId(rs.getInt(1));
  29. u.setUsername(rs.getString(2));
  30. u.setPassword(rs.getString(3));
  31. u.setEmail(rs.getString(4));
  32. u.setBirthday(rs.getDate(5));
  33. list.add(u);
  34. }
  35. return list;
  36. }
  37.  
  38. });
  39. for (User user : list) {
  40. System.out.println(user);
  41. }
  42. } catch (SQLException e) {
  43. e.printStackTrace();
  44. }
  45.  
  46. }
  47. @Test
  48. public void testSelect2(){
  49. //创建一个QueryRunner对象
  50. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  51. try {
  52. //执行sql语句,返回结果
  53. List<User> list = qr.query("select * from user where id=? and username=?", new BeanListHandler<User>(User.class),1,"tom");
  54. for (User user : list) {
  55. System.out.println(user);
  56. }
  57. } catch (SQLException e) {
  58. e.printStackTrace();
  59. }
  60.  
  61. }
  62. }

四、DBUtils三个核心对象详解

  4.1、QueryRunner对象

    4.1.1、构造函数

         new QueryRunner(); 它的事务可以手动控制。
                    也就是说此对象调用的方法(如:query、update、batch)参数中要有Connection对象。
           new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。
                              此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。

    4.1.2、常用方法

        

                 

        

        

        

  4.2、ResultSetHandler接口

    4.2.1、它有9个结果处理器

      ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
      ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
      ColumnListHandler:取某一列的数据。封装到List中。
      KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
      MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
      MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
      ScalarHandler:适合取单行单列数据
      BeanHandler
      BeanListHandler

    4.2.2、实例

       

  1. import static org.junit.Assert.*;
  2.  
  3. import java.sql.SQLException;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Map.Entry;
  7.  
  8. import org.apache.commons.dbutils.QueryRunner;
  9. import org.apache.commons.dbutils.handlers.ArrayHandler;
  10. import org.apache.commons.dbutils.handlers.ArrayListHandler;
  11. import org.apache.commons.dbutils.handlers.BeanHandler;
  12. import org.apache.commons.dbutils.handlers.ColumnListHandler;
  13. import org.apache.commons.dbutils.handlers.KeyedHandler;
  14. import org.apache.commons.dbutils.handlers.MapHandler;
  15. import org.apache.commons.dbutils.handlers.MapListHandler;
  16. import org.apache.commons.dbutils.handlers.ScalarHandler;
  17. import org.junit.Test;
  18.  
  19. import com.jxlg.domain.User;
  20.  
  21. public class TestResultSetHandler {
  22.  
  23. @Test
  24. public void test1() {
  25. //ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
  26. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  27. try {
  28. Object[] o = qr.query("select * from user where id=?", new ArrayHandler(),5);
  29. for (Object object : o) {
  30. System.out.println(object);
  31. }
  32. } catch (SQLException e) {
  33. e.printStackTrace();
  34. }
  35.  
  36. }
  37.  
  38. @Test
  39. public void test2() throws SQLException {
  40. //ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
  41. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  42. List<Object[]> list = qr.query("select * from user", new ArrayListHandler());
  43. for (Object[] objects : list) {
  44. for (Object object : objects) {
  45. System.out.println(object);
  46. }
  47. System.out.println("----------------------");
  48. }
  49. }
  50.  
  51. @Test
  52. public void test3() throws SQLException {
  53. //ColumnListHandler:取某一列的数据。封装到List中
  54. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  55. List<Object> list = qr.query("select username,password from user ", new ColumnListHandler(1));
  56. for (Object object : list) {
  57. System.out.println(object);
  58. }
  59. }
  60.  
  61. @Test
  62. public void test4() throws SQLException {
  63. //KeyedHandler:取多条记录,每一条记录封装到一个Map中,
  64. //再把这个Map封装到另外一个Map中,key为指定的字段值。
  65. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  66. //大的Map的key是表中的某列数据,小的Map的key是表的列名,所以大的map的key用的是Object类型,小的是String。
  67. Map<Object, Map<String, Object>> map = qr.query("select * from user", new KeyedHandler(1));
  68. for (Map.Entry<Object, Map<String,Object>> m : map.entrySet()) {
  69. System.out.println(m);//就是id至,因为设置了“1”.
  70. for (Map.Entry<String, Object> mm : m.getValue().entrySet()) {
  71. System.out.println(mm);//取出小map中的key和value
  72. }
  73. System.out.println("--------------------");
  74. }
  75.  
  76. }
  77.  
  78. @Test
  79. public void test5() throws SQLException {
  80. //MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
  81. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  82. Map<String, Object> map = qr.query("select * from user", new MapHandler());
  83. for (Map.Entry<String, Object> m : map.entrySet()) {
  84. System.out.println(m.getKey()+"\t"+m.getValue());
  85. //默认取第一行数据,需要去其它行用where加条件
  86. }
  87. }
  88.  
  89. @Test
  90. public void test6() throws SQLException {
  91. //MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
  92. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  93. List<Map<String, Object>> list = qr.query("select * from user", new MapListHandler());
  94.  
  95. for (Map<String, Object> map : list) {
  96. for (Map.Entry<String, Object> m : map.entrySet()) {
  97. System.out.println(m);
  98. }
  99. System.out.println("-----------");
  100. }
  101. }
  102.  
  103. @Test
  104. public void test7() throws SQLException {
  105. //ScalarHandler:适合取单行单列数据
  106. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  107. Object o = qr.query("select * from user", new ScalarHandler(2));
  108. System.out.println(o);
  109. }
  110.  
  111. @Test
  112. public void test8() throws SQLException {
  113. //BeanHandler:适合取单行单列数据
  114. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  115. User user = qr.query("select * from user", new BeanHandler<User>(User.class));
  116. System.out.println(user);
  117. }
  118.  
  119. }

 五、使用DBUtils做一个增删改查的例子

  

  1. import static org.junit.Assert.*;
  2.  
  3. import java.sql.SQLException;
  4. import java.util.Date;
  5.  
  6. import javax.crypto.spec.OAEPParameterSpec;
  7.  
  8. import org.apache.commons.dbutils.QueryRunner;
  9. import org.junit.Test;
  10.  
  11. public class TestInCURD {
  12.  
  13. @Test
  14. public void testInsert() {
  15. //创建一个QueryRunner对象
  16. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  17. try {
  18. qr.update("insert into user (username,password,email,birthday)values(?,?,?,?)", "guapi","4646","guapi@163.com",new Date());
  19. } catch (SQLException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. @Test
  24. public void testUpdate() {
  25. //创建一个QueryRunner对象
  26. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  27. try {
  28. qr.update("update user set username=?,password=? where id=4 ", "meizimeizi","520520");
  29. } catch (SQLException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33.  
  34. @Test
  35. public void testDelete() {
  36. //创建一个QueryRunner对象
  37. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  38. try {
  39. qr.update("delete from user where id=? ",4);
  40. } catch (SQLException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44.  
  45. @Test
  46. public void testBatch() {
  47. //创建一个QueryRunner对象
  48. QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  49. try {
  50. Object[][] params = new Object[10][]; //高维代表执行多少次sql语句
  51. for(int i =0;i<params.length;i++){
  52. params[i] =new Object[]{"guapi"+i,"4646","guapi@163.com",new Date()};
  53. }
  54.  
  55. qr.batch("insert into user (username,password,email,birthday)values(?,?,?,?)", params );
  56. } catch (SQLException e) {
  57. e.printStackTrace();
  58. }
  59. }
  60.  
  61. }

2017-03-06

JavaWeb之DBUtils的更多相关文章

  1. [JavaWeb]关于DBUtils中QueryRunner的一些解读.

    前言:[本文属于原创分享文章, 转载请注明出处, 谢谢.]前面已经有文章说了DBUtils的一些特性, 这里再来详细说下QueryRunner的一些内部实现, 写的有错误的地方还恳请大家指出. Que ...

  2. 【JavaWeb】DbUtils入门之QueryRunner

    DbUtils简介 根据官网的介绍,DbUtils是一种 JDBC Utility Component (翻译过来大概就是:JDBC实用部件),故名思意,和数据库操作有关 官网上的简介也称之为 JDB ...

  3. JavaWeb之DButils整理

    一.DBUtils介绍  apache 什么是dbutils,它的作用 DBUtils是java编程中的数据库操作实用工具,小巧简单实用. 用前导包!!!DBUtils包!!! 二.DBUtils的三 ...

  4. JavaWeb基础—dbutils的简单入门

    简明入门教程,参考:https://www.cnblogs.com/CQY1183344265/p/5854418.html 进行此章节之前,介绍一个JdbcUtils的再次的简单封装 (例如后面需要 ...

  5. 【转载】JavaWeb之DBUtils QueryRunner类对数据表的增、删、查(8种结果集处理方式)、改操作

    一.使用QueryRunner类,实现对数据表的 insert delete update package com.shuhuadream.queryrunner; import java.sql.C ...

  6. [JavaWeb]关于DBUtils中QueryRunner的一些解读(转)

    QueryRunner类 QueryRunner中提供对sql语句操作的API它主要有三个方法 query() 用于执行select update() 用于执行insert/update/delete ...

  7. Javaweb学习笔记8—DBUtils工具包

    今天来讲javaweb的第8阶段学习. DBUtils技术,DBUtils是我们操作数据库很常用的功能,虽然后期使用都是它的封装结果,但是也需要掌握. 老规矩,首先先用一张思维导图来展现今天的博客内容 ...

  8. javaweb学习总结—Apache的DBUtils框架学习

    注明: 本文转载自http://www.cnblogs.com/xdp-gacl/p/4007225.html 一.commons-dbutils简介 commons-dbutils 是 Apache ...

  9. JavaWeb学习总结(十四)--Apache的DBUtils

    一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

随机推荐

  1. CentOS Linux解决 Device eth0 does not seem to be present

    通过OVF部署Linux主机后提示 ringing up interface eth0:  Device eth0 does not seem to be present,delaying initi ...

  2. codeforces 755D. PolandBall and Polygon

    D. PolandBall and Polygon time limit per test 4 seconds memory limit per test 256 megabytes input st ...

  3. 用mui框架开发手机app项目实践中的那些事儿

    http://www.yilingsj.com/xwzj/2015-04-29/260.html 最近在玩mui框架,坑的我是:西湖的水,全都是眼泪!!! 公司的手机app要进行改版,我率先想到的是j ...

  4. 常见JS挂马方法及如何防止网站被黑客挂马?

    最近有朋友说自己的网站平时并未作弊,文章也都是原创的,更新很稳定.可不知道为什么网站突然就被各大搜索引擎降权了,一直找不到原因.最后发现是网站被挂马了,导致网站被连累了.在此,借助马海祥博客的平台,给 ...

  5. webx学习

    webx框架学习指南 http://openwebx.org/docs/Webx3_Guide_Book.html webx学习(一)——初识webx webx学习(二)——Webx Framewor ...

  6. 一篇完整的FlexBox布局指南

    一篇完整的FlexBox布局指南 转载请标注本文链接并附带以下信息: 译:Cydiacen 作者:CHRIS COYIER 原文:A Complete Guide to Flexbox 原文更新于 2 ...

  7. hessian原理解析一(客户端分析)

    hessian 是一款开源的二进制远程通讯协议,使用简单方法提供了RMI功能,主要用于面向对象的消息通信. 优点:跨平台.多语言支持.使用简单 缺点:传递复杂对象性能会下降,不适合安全性高的应用 一 ...

  8. HDU2063(二分图最大匹配)

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. canvas小程序-快跑程序员

    canvas不用说html5带来的好东西,游戏什么的,么么哒 记得有一天玩手机游戏,就是一个跳跃过柱子那种,其实元素很简单啊,app能开发,借助html5 canvas也可以啊, 于是就开始了. -- ...

  10. 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)

    版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...