JDBC--DBUtils的使用

1、commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。

2、相关API:

--org.apache.commons.dbutils.QueryRunner

--org.apache.commons.dbutils.ResultSetHandle

--工具类:org.apache.commons.dbutils.DbUtils

3、使用QueryRunner进行更新操作:

--update方法:可执行delete,insert,update的sql语句

public void testQueryRunner_update(){
    Connection conn = null;
    //创建QueryRunner的实现类
    QueryRunner queryRunner = new QueryRunner();
    String sql = "DELETE FROM customers WHERE id > ?";
    
    try{
        //获取数据库连接
        conn = JDBCUtils.getConnection();
        //调用QueryRunner的update方法实现更新操作
        int rows = queryRunner.update(conn, sql, 97);
        System.out.println(rows + "rows deleted.");
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        //释放数据库资源
        JDBCUtils.release(conn, null, null);
    }
}

 4、使用QueryRunner进行查询操作:

--使用QuneryRunner的query()方法进行查询时,需要传入对应的ResultSetHandler的实现类对象以完成对结果集的处理,其返回类型取决于ResultSetHandler中handle方法的返回类型,可以使用以下几种ResultSetHandler:

--1)自定义结果集处理:

/**
*自定义ResultSetHandler,并重写handle方法,对结果集进行处理
*/
class MyResultSetHandler implements ResultSetHandler{
    @Override
    public Object handle(ResultSet rs) throws SQLException {
        List<Customer> list = new ArrayList<>();
        while(rs.next()){
            BigDecimal id = rs.getBigDecimal(1);
            String name = rs.getString(2);
            Date birth = rs.getDate(3);
            
            Customer customer = new Customer(id, name, birth);
            list.add(customer);
        }
        return list;
    }
    
}

@Test
public void testResultSetHandler(){
    Connection conn = null;
    QueryRunner queryRunner = new QueryRunner();
    try{
        conn = JDBCUtils.getConnection();
        String sql = "SELECT id \"id\", name \"name\", birth \"birth\" FROM customers where id < 5";
        Object customers = queryRunner.query(conn, sql,
                new MyResultSetHandler());
        
        System.out.println(customers);
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        JDBCUtils.release(conn, null, null);
    }
}

--源码分析queryRunner.query()方法

 1 public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh,Object... params) throws SQLException {
 2     PreparedStatement stmt = null;
 3     ResultSet rs = null;
 4     T result = null;
 5     try {
 6         stmt = this.prepareStatement(conn, sql);
 7         this.fillStatement(stmt, params);
 8         rs = this.wrap(stmt.executeQuery());
 9         result = rsh.handle(rs);
10     } catch (SQLException e) {
11         this.rethrow(e, sql, params);
12     } finally {
13         try {
14             close(rs);
15         } finally {
16             close(stmt);
17         }
18     }
19     return result;
20 }

上面的方法中,在获取到结果集之后(第8行),将调用传入的ResultSetHandler对象的handle方法对结果集处理(第9行),这里将调用自定义的实现类中的handle方法。

--2)BeanHandler:将查询的结果集的第一条记录转化为传入的对应的class类的对象并返回:

 Customer customer = queryRunner.query(conn, sql,new BeanHandler(Customer.class));
 System.out.println(customer);

--3)BeanListHandler:将查询的结果集转化为传入的对应的class类的对象列表并返回:

 List<Customer> customers = queryRunner.query(conn, sql,new BeanListHandler(Customer.class));
 System.out.println(customers);

--4)MapHandler:将查询的结果集的第一条记录转化为Map并返回,其中key值对应列名,value对应列的值:

 Map<String, Object> customer = queryRunner.query(conn, sql,new MapHandler());
 System.out.println(customer);

--5)MapLsitHandler:将查询的结果集转化为MapList并返回,其中key值对应列名,value对应列的值:

List<Map<String, Object>> customers = queryRunner.query(conn, sql,new MapListHandler());
System.out.println(customers);

--6)ScalarHandler:将结果集的第一行第一列转化的数据成数值(可以是基础类型、String类和Date类):

String sql = "SELECT name FROM customers WHERE id = 5";
String name = (String)queryRunner.query(conn, sql,new ScalarHandler());
System.out.println(name);

 

posted on 2015-12-02 16:14  _taoGe  阅读(301)  评论(0编辑  收藏  举报