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);