Apache的DBUtils框架学习
http://www.cnblogs.com/xdp-gacl/p/4007225.html
一、commons-dbutils简介
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
commons-dbutilsAPI介绍:
- org.apache.commons.dbutils.QueryRunner
- org.apache.commons.dbutils.ResultSetHandler
工具类
- org.apache.commons.dbutils.DbUtils
二、QueryRunner类使用讲解
该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法:
- 默认的构造方法
- 需要一个 javax.sql.DataSource 来作参数的构造方法。
2.1、QueryRunner类的主要方法
public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。
public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。返回值取决于ResultSetHandler的handle方法的返回值
public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。
2.2、使用QueryRunner类实现CRUD
使用该类库需要导入commons-dbutils-1.7.jar
更新操作:
//使用默认构造器,QueryRunner是线程安全的
QueryRunner qr = new QueryRunner();
@Test
public void testUpdate() {
Connection connection = null;
try {
connection = JdbcUtils_c3p0.getConnection();
String sql = "update name set name = ?"
+ "where id=?";
//只需要获取数据库连接,返回值为更新的行数
qr.update(connection, sql, "gujiaming",1);
}catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils_c3p0.release(connection, null, null);
}
}
查询操作:
@Test
public void testQuery() {
Connection connection = null;
try {
connection = JdbcUtils_c3p0.getConnection();
String sql = "select id,name "
+ "from name";
//这个方法的返回集是根据ResultSetHandle实现类来进行处理的
List<Name> nameList = qr.query(connection, sql,new MyResultSetHandler());
System.out.println("nameList:" + nameList.toString());
}catch (Exception e) {
e.printStackTrace();
}finally {
}
}
/**
* 内部类,实现ResultSetHandler,对查询结果集进行处理
* @author i-scream
*
*/
class MyResultSetHandler implements ResultSetHandler<List<Name>>{
@Override
public List<Name> handle(ResultSet rs) throws SQLException {
List<Name> names = new ArrayList<>();
while(rs.next()) {
Long id = rs.getLong(1);
String name = rs.getString(2);
Name rsName = new Name(id, name);
names.add(rsName);
}
return names;
}
}
打印结果:
nameList:[Name [id=1, name=gujiaming]]
三、ResultSetHandler接口使用讲解
该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。
实现ResultSetHandler接口必须实现handle方法:Object handle (java.sql.ResultSet rs)
3.1、ResultSetHandler接口的实现类
- BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
- BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
- MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
- MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
- ArrayHandler:把结果集中的第一行数据转成对象数组。
- ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
- ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
/**
- BeanHandler: 把结果集的第一条记录转为创建 BeanHandler 对象时传入的 Class
参数对应的对象.
*/
@Test
public void testBeanHanlder(){
Connection connection = null;try {
connection = JDBCTools.getConnection();
String sql = “SELECT id, name customerName, email, birth ” +
“FROM customers WHERE id >= ?”;Customer customer = queryRunner.query(connection, sql, new BeanHandler(Customer.class), 5); System.out.println(customer);
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, null, connection);
}
}
/**
- BeanListHandler: 把结果集转为一个 List, 该 List 不为 null, 但可能为
- 空集合(size() 方法返回 0)
- 若 SQL 语句的确能够查询到记录, List 中存放创建 BeanListHandler 传入的 Class
对象对应的对象.
*/
@Test
public void testBeanListHandler(){
Connection connection = null;try {
connection = JDBCTools.getConnection();
String sql = “SELECT id, name, email, birth ” +
“FROM customers”;List<Customer> customers = queryRunner.query(connection, sql, new BeanListHandler(Customer.class)); System.out.println(customers);
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, null, connection);
}
}
/**
- MapHandler: 返回 SQL 对应的第一条记录对应的 Map 对象.
键: SQL 查询的列名(不是列的别名), 值: 列的值.
*/
@Test
public void testMapHandler(){
Connection connection = null;try {
connection = JDBCTools.getConnection();
String sql = “SELECT id, name, email, birth ” +
“FROM customers”;Map<String, Object> result = queryRunner.query(connection, sql, new MapHandler()); System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, null, connection);
}
}
/**
- MapListHandler: 将结果集转为一个 Map 的 List
- Map 对应查询的一条记录: 键: SQL 查询的列名(不是列的别名), 值: 列的值.
而 MapListHandler: 返回的多条记录对应的 Map 的集合.
*/
@Test
public void testMapListHandler(){
Connection connection = null;try {
connection = JDBCTools.getConnection();
String sql = “SELECT id, name, email, birth ” +
“FROM customers”;List<Map<String, Object>> result = queryRunner.query(connection, sql, new MapListHandler()); System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, null, connection);
}
}
/**
- ScalarHandler: 把结果集转为一个数值(可以是任意基本数据类型和字符串, Date 等)返回
默认返回第一列的值
*/
@Test
public void testScalarHandler(){
Connection connection = null;try {
connection = JDBCTools.getConnection();
String sql = “SELECT name, email ” +
“FROM customers”;Object result = queryRunner.query(connection, sql, new ScalarHandler()); System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, null, connection);
}
}