Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
本篇首先介绍几个关于Dbutils的核心API,然后介绍Dbutils的基本原理,
并整体介绍一下关于Dbutils的使用流程。
QueryRunner
QueryRunner类是用于操作SQL语句执行数据库操作的类。该类的常用方法有:
query(),用于执行数据库表信息的查询操作;
update(),用于执行数据库表的内容的增加、修改和删除的操作;
batch(),用于执行SQL语句中的批处理的操作
QueryRunner的构造方法常用的有两个,
public QueryRunner() {
super();
}
使用无参数的构造时事务是手动控制,需要人为的开事务关事务
public QueryRunner(DataSource ds) {
super(ds);
}
使用有参数的构造方式时,事务是自动控制的,一条SQL语句一个事务,不需要人为的控制。
注意当使用带有数据库连接池的参数得到QueryRunner时,使用QueryRunner的方法只需要传递SQL语句和ResultSetHandler参数就可以,此时是自动事务;但是当不使用带数据库连接池的参数来获得QueryRunner时,使用QueryRunner的方法需要多传递一个Connection连接对象,而且可以人为的开关事务。
也就是这么使用:
QueryRunner runner=new QueryRunner();
runner.query(Connection,sql,ResultSetHandler,Object... param);
runner.update(Connection,sql,Object...param);
runner.batch(Connection con,sql,Object[][] objs);
QueryRunner runner=new QueryRunner(DataSource ds);
runner.query(sql,ResultSetHandler,Object... param);
runner.update(sql,Object...param);
runner.batch(sql,Object[][] objs);
ResultSetHandler
ResultSetHandler是一个接口,用于定义结果集的封装。当然Dbutils也定义了9个关于ResultSetHandler的实现类方便直接使用。
@Test
public void selectTest() throws SQLException{
String sql="select * from book where id > ?";
QueryRunner runner=new QueryRunner();
Connection conn=DataSourceUtil.getConnection();
List<Book> list = runner.query(conn,sql, new ResultSetHandler<List<Book>>(){
public List<Book> handle(ResultSet rs) throws SQLException {
List<Book> list=new ArrayList<Book>();
while(rs.next()){
Book book=new Book();
book.setId(rs.getInt("id"));
book.setName(rs.getString("name"));
book.setPrice(rs.getDouble("price"));
list.add(book);
}
return list;
}
},2);
for (Book book: list) {
System.out.println(book);
}
DbUtils.close(conn);
}
ResultSetHandler的九个实现类:
ArrayHandler, 将结果集中第一条记录封装到Object[],数组中的每一个元素就是记录中的字段值。
Object[] obj = runner.query(sql, new ArrayHandler());
System.out.println(Arrays.toString(obj));
[1, Spring实战, 45.5]
ArrayListHandler, 将结果集中每一条记录封装到Object[],数组中的每一个元素就是记录中的字段值。在将这些数组装入到List集合。
List<Object[]> list = runner.query(sql, new ArrayListHandler());
for(Object[] obj : list){
System.out.println(Arrays.toString(obj));
}
[1, Spring实战, 45.5]
[2, Spring Boot实战, 55.6]
[3, Docker实战, 55.6]
[4, Docker实战, 30.9]
[5, JavaEE开发大全, 60.5]
[9, Android大全, 70.5]
[10, Android大全, 70.5]
BeanHandler, 将结果集中第一条记录封装到一个javaBean中。
Book book = runner.query(sql, new BeanHandler<Book>(Book.class));
System.out.println(book);
Book [id=1, name=Spring实战, price=45.5]
BeanListHandler, 将结果集中每一条记录封装到javaBean中,在将javaBean封装到List集合.
List<Book> list = runner.query(sql, new BeanListHandler<Book>(Book.class));
System.out.println(list);
[Book [id=1, name=Spring实战, price=45.5], Book [id=2, name=Spring Boot实战, price=55.6], Book [id=3, name=Docker实战, price=55.6], Book [id=4, name=Docker实战, price=30.9], Book [id=5, name=JavaEE开发大全, price=60.5], Book [id=9, name=Android大全, price=70.5], Book [id=10, name=Android大全, price=70.5]]
ColumnListHandler, 将结果集中指定列的值封装到List集合.
List<Object> list = runner.query(sql, new ColumnListHandler("name"));
System.out.println(list);
[Spring实战, Spring Boot实战, Docker实战, Docker实战, JavaEE开发大全, Android大全, Android大全]
MapHandler, 将结果集中第一条记录封装到Map集合中,集合的 key就是字段名称,value就是字段值
Map<String, Object> map = runner.query(sql, new MapHandler());
System.out.println(map);
{price=45.5, name=Spring实战, id=1}
MapListHandler, 将结果集中每一条记录封装到Map集合中,集合的 key就是字段名称,value就是字段值,在将这些Map封装到List集合
List<Map<String,Object>> list = runner.query(sql, new MapListHandler());
System.out.println(list);
[{price=45.5, name=Spring实战, id=1}, {price=55.6, name=Spring Boot实战, id=2}, {price=55.6, name=Docker实战, id=3}, {price=30.9, name=Docker实战, id=4}, {price=60.5, name=JavaEE开发大全, id=5}, {price=70.5, name=Android大全, id=9}, {price=70.5, name=Android大全, id=10}]
KeyedHandler,在使用指定的列的值做为一个Map集合的key,值为每一条记录的Map集合封装。
Map<Object, Map<String, Object>> map = runner.query(sql, new KeyedHandler("name"));
System.out.println(map);
{Spring Boot实战={price=55.6, name=Spring Boot实战, id=2}, Android大全={price=70.5, name=Android大全, id=10}, Docker实战={price=30.9, name=Docker实战, id=4}, JavaEE开发大全={price=60.5, name=JavaEE开发大全, id=5}, Spring实战={price=45.5, name=Spring实战, id=1}}
ScalarHandler 进行单值查询 select count(*) from account;
String sql="select count(*) from book";
QueryRunner runner=new QueryRunner(DataSourceUtil.getDataSource());
Object obj = runner.query(sql, new ScalarHandler());
System.out.println(obj);
7
Dbutils
Dbutils类提供了若干个静态的方法,用于关闭资源、以及事务的rollback和commit操作。
close(Connection)
closeQuietly(Connection)
commitAndClose(Connection)
commitAndCloseQuietly(Connection)
loadDriver(String)
loadDriver(ClassLoader, String)
......