Dbutils工具

Dbutils工具

由来:我们知道编写一个JDBC程序,需要注册驱动、获取连接、获得执行SQL语句对象、执行SQL语句,这些基本步骤。而有了连接池,简化获取连接的代码同时也重复利用已创建的资源大大提高了程序的效率。但是不难发现获取执行SQL语句对象、执行SQL语句的代码同样也是类似的,于是人们又这两个步骤包装成工具类供我们开发使用,简化代码。
概念:Dbutils工具就是在我们开发JDBC程序时,简化执行SQL语句的工具。
DButils工具使用介绍
1.工具架包引入

工具架包下载地址:http://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi

在这里插入图片描述
在这里插入图片描述

选择二进制文件下载压缩包,解压后将架包引入项目中就可以使用Dbutils工具。同时下载网站还提供了Dbutils工具的源码可以提供参考了解,只需下载来源中的压缩包即可。
2.关键类:QueryRunner
该类底层帮我们完成了获取连接、执行SQL语句、释放资源等步骤
构造器: QueryRunner(DataSource ds)
参数传递一个连接池
3.执行SQL语句之更改记录

public void Update() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DruidJdbc.getDataSource());
        //第一个参数为sql语句字符串,之后的参数为sql语句的参数
        queryRunner.update("update book set number=? where name=?",14,"sfga");
    }

QueryRunner类执行SQL语句的用法与PreparedStatement类的用法类似,同样也是需要先进行SQL语句预编译,再传递参数。
4.执行SQL语句之插入记录

public  void Insert() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DruidJdbc.getDataSource());
        queryRunner.update("insert into book values(?,?,?)","sfga",79.2,12);
    }

5.执行SQL语句之删除记录

public void Delete() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DruidJdbc.getDataSource());
        queryRunner.update("delete from book where name=?","sfga");
    }

6.执行SQL语句之查询记录
与更新记录不同,查询记录会返回一个结果集,而通常在程序中我们需要将结果集封装成我们需要的类,于是Dbutils工具提供了多个类可以将查询的结果集进行封装。查询记录需要调用QueryRunner类的query方法,该方法需要提供至少两个参数,第一个参数为SQL语句字符串,第二个参数Dbutils工具提供的各种类封装结果集,第三个以及之后的参数为SQL语句中参数。
1)使用ResultSetHandler查询一条记录

public void Select() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DruidJdbc.getDataSource());
        Book book = queryRunner.query("select * from book where number=?", new ResultSetHandler<Book>() {
            @Override
            public Book handle(ResultSet resultSet) throws SQLException {
                Book book = new Book();
                if(resultSet.next()){
                    book.setName(resultSet.getString("name"));
                    book.setNumber(resultSet.getInt("number"));
                    book.setPrice(resultSet.getDouble("price"));
                }
                return book;
            }
        },89);
        System.out.println(book);
    }

给QueryRunner类的query方法传递第二个参数为ResultSetHandler类对象时,该方法会返回一个封装好结果集的对象。同时需要注意的时在创建ResultSetHandler时需要提供封装结果集的泛类以及实现ResultSetHandler类的handle方法,handle方法需要实现的是封装结果集的过程,实现的封装结果集的过程其实就是它会返回一个ResultSet结果集对象,而我们需要将数据从结果集取出并将数据储存在我们程序中需要的类。
使用ResultSetHandler查询多条记录

    public void Select() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DruidJdbc.getDataSource());
        List<Book> list = queryRunner.query("select * from book", new ResultSetHandler<List<Book>>() {

            @Override
            public List<Book> handle(ResultSet resultSet) throws SQLException {
                List<Book> list = new ArrayList<>();
                while(resultSet.next()){
                    Book book = new Book();
                    book.setName(resultSet.getString("name"));
                    book.setPrice(resultSet.getDouble("price"));
                    book.setNumber(resultSet.getInt("number"));
                    list.add(book);
                }
                return list;
            }
        });
  }

与查询一条记录不同的是,查询多条记录返回的是封装好数据的一个链表。也就是说在实现封装结果集的过程中,我们不仅需要实现封装一条记录,还要将多条记录放入一个集合对象中,返回改集合对象。
2)使用ArrayHandler查询一条记录

public void Select() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DruidJdbc.getDataSource());
        Object[] objects =  queryRunner.query("select * from book where name=?",new ArrayHandler(),"疯狂讲义");
        System.out.println(Arrays.toString(objects));

    }

使用ArrayHandler查询一条记录需要给query方法传递第二个参数为一个ArrayHandler类对象,该类会将查询到的一条记录封装到一个Object数组中,其实就是就是将记录的每一列数据用Object对象储存,而多列数据合在一起就是一个Object数组。
使用ArrayHandler查询多条记录

 public void Select() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DruidJdbc.getDataSource());
        List<Object[]> list = queryRunner.query("select * from book",new ArrayListHandler());
        }

    }

该方法会返回一个Obect数组集合类,集合中每个Object数组就是一条记录
3)使用BeanHandler将一条记录封装到一个JavaBean中

public void Select() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DruidJdbc.getDataSource());
        Book book = queryRunner.query("select * from book where name=?",new BeanHandler<Book>(Book.class),"疯狂讲义");
    }

使用BeanHandler查询一条记录需要给query传递第二个参数为一个BeanHandler对象,该方法会返回一个封装好数据的对象。需要注意的是在创建BeanHandler对象时需要传递封装数据的类泛型以及它的类加载,同时对于封装数据类,该类的每一个成员变量需要提供相应的getter和setter方法,因为使用BeanHandler类封装的原理就是通过调用封装数据类的属性即成员变量对应的getter方法来封装记录的。如例代码中封装数据类Book中有成员变量name,那必须提供相应的getName()和setName()方法,同时方法名不能随意取,必须为setName(),且成员变量名应和数据库列名相同才能封装,若封装数据类中成员变量没有对应数据库的列名则为默认初始化。
使用BeanListHandler将多条记录封装到List集合中

 public void Select() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DruidJdbc.getDataSource());
        List<Book> bookList = queryRunner.query("select * from book",new BeanListHandler<Book>(Book.class));
  }

该方法会放回一个集合,该集合中储存了多个封装数据类对象
4)使用MapHandler查询一条记录并封装到一个Map里

public void Select() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DruidJdbc.getDataSource());
        Map<String,Object> bookMap =  queryRunner.query("select * from book where name=?",new MapHandler(),"疯狂讲义");
    }

使用MapHandler查询一条记录需要给query方法传递第二个参数为一个MapHandle类。该方法会将一条记录封装到一个Map集合中,每一对键值对对应着数据库中的列名与数据值,返回一个Map集合。
使用MapListHandler查询多条记录并封装到Map的List中

 public void Select() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DruidJdbc.getDataSource());
        List<Map<String,Object>> bookList =  queryRunner.query("select * from book",new MapListHandler());
    
    }

该方法返回一个储存了多个Map集合对象的List集合。每一个Map集合对应着数据库的一条记录,而多条记录封装为一个List集合。
7.执行SQL语句其他方法
QueryRunner类还有其他执行SQL语句方法,如执行多条SQL语句的bath方法,这些方法大多和PreparedStatement类的方法相同。

总结

Dbutils工具更加简化了我们的代码,我们只需一个连接池和一个SQL语句字符串就可以执行一个SQL语句。但是这一类工具仍然存在不足,如执行SQL语句需要我们编写字符串,对于SQL语句的字符串中表明、列名都不能以参数的形式来编写,就导致了有时就一个列名不同其他都相同仍要重新编写一个SQL语句字符串,即便用字符串来拼接简化代码,对于大项目这仍太麻烦。于是对于数据访问层框架MyBatis由此诞生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值