zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    Dragon Balls_并查集
    Farm Irrigation_并查集||dfs
    The trouble of Xiaoqian_多重背包&&完全背包
    Difference Is Beautiful
    Bone Collector II_第k大背包
    Dividing_多重背包
    Milk
    coins_多重背包
    钱币兑换问题_完全背包&&拆分&&母函数
    多项式链表多项式相加
  • 原文地址:https://www.cnblogs.com/tengtao93/p/5011225.html
Copyright © 2011-2022 走看看