Apache—DBUtils简介

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
API介绍:

org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler

工具类

org.apache.commons.dbutils.DbUtils

QueryRunner类 

public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。
public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。
public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。

代码示例:

 1   @Test
 2     public void testQuery(){
 3 
 4         //2 使用期update方法
 5         String sql = "select * from t_user";
 6         Connection connection = null;
 7 
 8         try {
 9             connection = MysqlUtils.getConnection();
10             /**
11              * query方法的返回值取决于其ResultSetHandler参数的handle方法的返回值
12              */
13             List<User> list = queryRunner.query(connection, sql, new BeanListHandler<User>(User.class));
14             System.out.println(list.size());
15         } catch (SQLException e) {
16             e.printStackTrace();
17         }finally {
18             try {
19                 connection.close();
20             } catch (SQLException e) {
21                 e.printStackTrace();
22             }
23         }
24     }
25 
26     @Test
27     public void testUpdate(){
28 
29         //2 使用期update方法
30         String sql = "update t_user set password = ? where username = ?";
31         Connection connection = null;
32 
33         try {
34             connection = MysqlUtils.getConnection();
35             queryRunner.update(connection, sql,"cheng", "zhong");
36         } catch (SQLException e) {
37             e.printStackTrace();
38         }finally {
39             try {
40                 connection.close();
41             } catch (SQLException e) {
42                 e.printStackTrace();
43             }
44         }
45 
46     }

 ResultSetHandler接口 

ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

其中选择比较重要的做示例:

BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。

 1     /**
 2      * BeanHandler: 把结果集的第一条记录转为创建 BeanHandler 对象时传入的 Class
 3      * 参数对应的对象.
 4      */
 5     @Test
 6     public void testBeanHanlder(){
 7         Connection connection = null;
 8 
 9         try {
10             connection = MysqlUtils.getConnection();
11             String sql = "select * from t_user WHERE uid >= ?";
12 
13             User user = queryRunner.query(connection, sql, new BeanHandler<User>(User.class), 5);
14 
15             System.out.println(user.toString());
16         } catch (Exception e) {
17             e.printStackTrace();
18         } finally{
19             try {
20                 connection.close();
21             } catch (SQLException e) {
22                 e.printStackTrace();
23             }
24         }
25     }

BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

 1   /**
 2      * BeanListHandler: 把结果集转为一个 List, 该 List 不为 null, 但可能为
 3      * 空集合(size() 方法返回 0)
 4      * 若 SQL 语句的确能够查询到记录, List 中存放创建 BeanListHandler 传入的 Class
 5      * 对象对应的对象.
 6      */
 7     @Test
 8     public void testBeanListHandler(){
 9         Connection connection = null;
10 
11         try {
12             connection = MysqlUtils.getConnection();
13             String sql = "select * from t_user";
14 
15             List<User> userList = queryRunner.query(connection,sql, new BeanListHandler<User>(User.class));
16 
17             System.out.println(userList);
18         } catch (Exception e) {
19             e.printStackTrace();
20         } finally{
21             try {
22                 connection.close();
23             } catch (SQLException e) {
24                 e.printStackTrace();
25             }
26         }
27     }

MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

 1    /**
 2      * MapHandler: 返回 SQL 对应的第一条记录对应的 Map 对象.
 3      * 键: SQL 查询的列名(不是列的别名), 值: 列的值.
 4      */
 5     @Test
 6     public void testMapHandler(){
 7         Connection connection = null;
 8 
 9         try {
10             connection = MysqlUtils.getConnection();
11             String sql = "select * from t_user";
12 
13             Map<String, Object> result = queryRunner.query(connection,
14                     sql, new MapHandler());
15 
16             System.out.println(result);
17         } catch (Exception e) {
18             e.printStackTrace();
19         } finally{
20             try {
21                 connection.close();
22             } catch (SQLException e) {
23                 e.printStackTrace();
24             }
25         }
26     }

MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

 1  /**
 2      * MapListHandler: 将结果集转为一个 Map 的 List
 3      * Map 对应查询的一条记录: 键: SQL 查询的列名(不是列的别名), 值: 列的值.
 4      * 而 MapListHandler: 返回的多条记录对应的 Map 的集合.
 5      */
 6     @Test
 7     public void testMapListHandler(){
 8         Connection connection = null;
 9 
10         try {
11             connection = MysqlUtils.getConnection();
12             String sql = "select * from t_user";
13 
14             List<Map<String, Object>> result = queryRunner.query(connection,
15                     sql, new MapListHandler());
16 
17             System.out.println(result);
18         } catch (Exception e) {
19             e.printStackTrace();
20         } finally{
21             try {
22                 connection.close();
23             } catch (SQLException e) {
24                 e.printStackTrace();
25             }
26         }
27     }