zoukankan      html  css  js  c++  java
  • Dbutils

     commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

     

    DbUtils组件,

    1.       简化jdbc操作

    2.       下载组件,引入jar文件 : commons-dbutils-1.6.jar

     

    |-- DbUtils   关闭资源、加载驱动

    |-- QueryRunner   组件的核心工具类:定义了所有的与数据库操作的方法(查询、更新)

            

    update方法:
    * int update(String sql, Object... params) -->  可执行增、删、改语句
    * int update(Connection con, String sql, Object... parmas) --> 需要调用者提供Connection,这说明本方法不再管理Connection了。支持事务!

    query方法:执行查询
    * T query(String sql, ResultSetHandler rsh, Object... params) --> 可执行查询
     > 它会先得到ResultSet,然后调用rsh的handle()把rs转换成需要的类型!
    * T query(Connection con, String sql, ResultSetHadler rsh, Object... params),支持事务

    ResultSetHandler接口:
    * BeanHandler(单行) --> 构造器需要一个Class类型的参数,用来把一行结果转换成指定类型的javaBean对象
    * BeanListHandler(多行) --> 构造器也是需要一个Class类型的参数,用来把一行结果集转换成一个javabean,那么多行就是转换成List对象,一堆javabean
    * MapHandler(单行) --> 把一行结果集转换Map对象
      > 一行记录:
        sid  sname  age  gender
        1001 zs     99   male
      > 一个Map:
        {sid:1001, sname:zs, age:99, gender:male}
    * MapListHandler(多行) --> 把一行记录转换成一个Map,多行就是多个Map,即List<Map>!
    * ScalarHandler(单行单列) --> 通常用与select count(*) from t_stu语句!结果集是单行单列的!它返回一个Object

     QueryRunner之更新

       QueryRunner的update()方法可以用来执行insert、update、delete语句。

      1.       创建QueryRunner

          构造器:QueryRunner();

     

      2.       update()方法

        int update(Connection con, String sql, Object… params)

      

    @Test
        public void fun1() throws SQLException {
            QueryRunner qr = new QueryRunner();
            String sql = "insert into user values(?,?,?)";
            qr.update(JdbcUtils.getConnection(), sql, "u1", "zhangSan", "123");
        }

     还有另一种方式来使用QueryRunner

      1.       创建QueryRunner

          构造器:QueryRunner(DataSource)

     

      2.       update()方法

          int update(String sql, Object… params)

      这种方式在创建QueryRunner时传递了连接池对象,那么在调用update()方法时就不用再传递Connection了。

    @Test
        public void fun2() throws SQLException {
            QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "insert into user values(?,?,?)";
            qr.update(sql, "u1", "zhangSan", "123");
        }

     

    ResultSetHandler

    我们知道在执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。

    DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。

    DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。

      l  MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!

      l  MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;

      l  BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;

      l  BeanListHandler:多行处理器!把结果集转换成List<Bean>;

      l  ColumnListHandler:多行单列处理器!把结果集转换成List<Object>,使用ColumnListHandler时需要指定某一列的名称或编号

        例如:new ColumListHandler(“name”)表示把name列的数据放到List中。

      l  ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询

        例如select count(*) from tab_student。

     

    QueryRunner之查询

    QueryRunner的查询方法是:

    public <T> T query(String sql, ResultSetHandler<T> rh, Object… params)

    public <T> T query(Connection con, String sql, ResultSetHandler<T> rh, Object… params)

    query()方法会通过sql语句和params查询出ResultSet,然后通过rh把ResultSet转换成对应的类型再返回。

        @Test
        public void fun1() throws SQLException {
            DataSource ds = JdbcUtils.getDataSource();
            QueryRunner qr = new QueryRunner(ds);
            String sql = "select * from tab_student where number=?";
            Map<String,Object> map = qr.query(sql, new MapHandler(), "S_2000");
            System.out.println(map);
        }
        
        @Test
        public void fun2() throws SQLException {
            DataSource ds = JdbcUtils.getDataSource();
            QueryRunner qr = new QueryRunner(ds);
            String sql = "select * from tab_student";
            List<Map<String,Object>> list = qr.query(sql, new MapListHandler());
            for(Map<String,Object> map : list) {
                System.out.println(map);
            }
        }
        
        @Test
        public void fun3() throws SQLException {
            DataSource ds = JdbcUtils.getDataSource();
            QueryRunner qr = new QueryRunner(ds);
            String sql = "select * from tab_student where number=?";
            Student stu = qr.query(sql, new BeanHandler<Student>(Student.class), "S_2000");
            System.out.println(stu);
        }
        
        @Test
        public void fun4() throws SQLException {
            DataSource ds = JdbcUtils.getDataSource();
            QueryRunner qr = new QueryRunner(ds);
            String sql = "select * from tab_student";
            List<Student> list = qr.query(sql, new BeanListHandler<Student>(Student.class));
            for(Student stu : list) {
                System.out.println(stu);
            }
        }
        
        @Test
        public void fun5() throws SQLException {
            DataSource ds = JdbcUtils.getDataSource();
            QueryRunner qr = new QueryRunner(ds);
            String sql = "select * from tab_student";
            List<Object> list = qr.query(sql, new ColumnListHandler("name"));
            for(Object s : list) {
                System.out.println(s);
            }
        }
        
        @Test
        public void fun6() throws SQLException {
            DataSource ds = JdbcUtils.getDataSource();
            QueryRunner qr = new QueryRunner(ds);
            String sql = "select count(*) from tab_student";
            Number number = (Number)qr.query(sql, new ScalarHandler());
            int cnt = number.intValue();
            System.out.println(cnt);
        }

      

    DbUtils提供的封装结果的一些对象:

      1)  BeanHandler: 查询返回单个对象

      2)  BeanListHandler: 查询返回list集合,集合元素是指定的对象

      3)  ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[]

           4)  ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中

            5)  ScalarHandler 查询返回结果记录的第一行的第一列  (在聚合函数统计的时候用)

            6)  MapHandler  查询返回结果的第一条记录封装为map

     

  • 相关阅读:
    GPS 经纬度
    TP5 分页数据加锚点
    修改layui的表单手机、邮箱验证可以为空怎么实现?
    转录调控实战 | 一文解决转录调控问题 | chIP-seq | ATAC-seq
    管家基因 | Human housekeeping genes
    各国脑计划概览
    原创
    RLE Plots: relative log expression
    Polygenic score
    皮尔逊残差 | Pearson residual
  • 原文地址:https://www.cnblogs.com/flei/p/7269018.html
Copyright © 2011-2022 走看看