Apache—DBUtils简介
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
API介绍:
- org.apache.commons.dbutils.QueryRunner
- org.apache.commons.dbutils.ResultSetHandler
工具类
- org.apache.commons.dbutils.DbUtils
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 : 执行一个不需要置换参数的查询操作。
- public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
- public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。
代码示例:
@Test
public void testQuery(){ //2 使用期update方法
String sql = "select * from t_user";
Connection connection = null; try {
connection = MysqlUtils.getConnection();
/**
* query方法的返回值取决于其ResultSetHandler参数的handle方法的返回值
*/
List<User> list = queryRunner.query(connection, sql, new BeanListHandler<User>(User.class));
System.out.println(list.size());
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} @Test
public void testUpdate(){ //2 使用期update方法
String sql = "update t_user set password = ? where username = ?";
Connection connection = null; try {
connection = MysqlUtils.getConnection();
queryRunner.update(connection, sql,"cheng", "zhong");
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
} }
ResultSetHandler接口
- ArrayHandler:把结果集中的第一行数据转成对象数组。
- ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
- BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
- BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
- ColumnListHandler:将结果集中某一列的数据存放到List中。
- KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
- MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
- MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
其中选择比较重要的做示例:
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
/**
* BeanHandler: 把结果集的第一条记录转为创建 BeanHandler 对象时传入的 Class
* 参数对应的对象.
*/
@Test
public void testBeanHanlder(){
Connection connection = null; try {
connection = MysqlUtils.getConnection();
String sql = "select * from t_user WHERE uid >= ?"; User user = queryRunner.query(connection, sql, new BeanHandler<User>(User.class), 5); System.out.println(user.toString());
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
/**
* BeanListHandler: 把结果集转为一个 List, 该 List 不为 null, 但可能为
* 空集合(size() 方法返回 0)
* 若 SQL 语句的确能够查询到记录, List 中存放创建 BeanListHandler 传入的 Class
* 对象对应的对象.
*/
@Test
public void testBeanListHandler(){
Connection connection = null; try {
connection = MysqlUtils.getConnection();
String sql = "select * from t_user"; List<User> userList = queryRunner.query(connection,sql, new BeanListHandler<User>(User.class)); System.out.println(userList);
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
/**
* MapHandler: 返回 SQL 对应的第一条记录对应的 Map 对象.
* 键: SQL 查询的列名(不是列的别名), 值: 列的值.
*/
@Test
public void testMapHandler(){
Connection connection = null; try {
connection = MysqlUtils.getConnection();
String sql = "select * from t_user"; Map<String, Object> result = queryRunner.query(connection,
sql, new MapHandler()); System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
/**
* MapListHandler: 将结果集转为一个 Map 的 List
* Map 对应查询的一条记录: 键: SQL 查询的列名(不是列的别名), 值: 列的值.
* 而 MapListHandler: 返回的多条记录对应的 Map 的集合.
*/
@Test
public void testMapListHandler(){
Connection connection = null; try {
connection = MysqlUtils.getConnection();
String sql = "select * from t_user"; List<Map<String, Object>> result = queryRunner.query(connection,
sql, new MapListHandler()); System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}