关于Commons-DBUtils
Commons-DBUtils是Apache组织提供的一个开源的JDBC工具类库,它对JDBC进行了简单的封装,学习起来很简单, 而且大大的简化了工作量,关于数据库的操作一般一两句就可以解决问题了,并且不会影响程序的性能。
DBUtils的核心API及工具类:
1、org.apache.commons.dbutils.QueryRunner
2、org.apache.commons.dbutils.ResultSetHandler
3、org.apache.commons.dbutils.DbUtils
QueryRunner类使用
因为JDBC手写比较麻烦,而且有非常多的重复代码。比如获得连接,预编译SQL,释放资源等..那么可以将这些代码抽取出来放到工具类中。将类似的代码进行抽取,大大简化JDBC的编程。其主要功能用来对数据库执行增删改查(insert、delete、update、select),降低了操作数据库的难度。
query():用于执行数据库表信息的查询操作;
update():用于执行数据库表的内容的增加、修改和删除的操作;
QueryRunner对象:核心运行类
1、在一般情况下如果执行CRUD的操作:
构造方法:QueryRunner(DataSource ds);
成员方法:
public int update(String sql,Object… args);
public T query(String sql,ResultSetHandler rsh,Object… args);
2、如果有事务管理的话使用另一套完成CRUD的操作
构造方法:QueryRunner();
成员方法:
public int update(Connection conn,String sql,Object… args);
public T query(Connection conn,String sql,ResultSetHandler rsh,Object… args);
提示:不需要进行事务管理时,可以使用有构造QueryRunner(DataSource ds),因为不进行事务管理,不需要保证拿到的Connection是同一个,只需要传递SQL语句和ResultSetHandler参数就可以此时是自动事务;相反,若要进行事务管理,就必须保证进行的事务拿到的是同一个Connection,否则事务管理会无效,因此必须指定Connection。
ResultSetHandler接口的实现类
DBUtils的使用之ResultSetHandler的实现类一
1、ArrayHandler:把结果集中的第一行数据转成对象数组
public void demo() throws SQLException{
QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
String sql = "select * from account where id = ?" ;
Object[] obj = queryrunner.query(sql,ArrayHandler(),1) ;
system.out.println(Arrays.toString(obj)) ;
}
2、ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中
public void demo() throws SQLException{
QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
String sql = "select * from account" ;
List<Object[]> list = queryrunner.query(sql,ArrayListHandler()) ;
For(Object obj:list){
system.out.println(Arrays.toString(obj)) ;
}
}
DBUtils的使用ResultSetHandler的实现类二(最常用)
1、BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中
public void demo() throws SQLException{
QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource()) ;
String sql = "select * from account where id = ?" ;
Account account = queryrunner.query(sql,new BeanHandler<Account>(Account.class),1) ;
system.out.println(account) ;
}
2、BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里
public void demo() throws SQLException{
QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
String sql = "select * from account" ;
List<Account> list = queryrunner.query(sql,BeanListHandler<Account>(Account.class)) ;
For(Account account:list){
system.out.println(account) ;
}
}
DBUtils的使用之ResultSetHandler的实现类三
1、MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值
public void demo() throws SQLException{
QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
String sql = "select * from account where id = ?" ;
Map<String,Object> map = queryrunner.query(sql,new MapHandler(),1) ;
system.out.println(map) ;
}
2、MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
public void demo() throws SQLException{
QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
String sql = "select * from account" ;
List<Map<String,Object>>list = queryrunner.query(sql,MapListHandler()) ;
For(Map<String,Object> map2:list){
system.out.println(map2) ;
}
}
DBUtils的使用之ResultSetHandler的实现类四(不常用)
1、ColumnListHandler:将结果集中某一列的数据存放到List中
public void demo() throws SQLException{
QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
String sql = "select * from account" ;
List<Object> list = queryrunner.query(sql,new ColumnListHandler("name")) ;
for(Object obj:list){
system.out.println(obj) ;
}
}
2、KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key
public void deme(){
QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource()) ;
String sql = "select * from account" ;
Map<Object,Map<String,Object>> map = QueryRunner.query(sql,new keyedHandler());
for(Object key : map.keySet()){
system.out.println(key+""+map.get(key));
}
}
3、ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object
public void demo(){
QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource()) ;
String sql = "select count(*) from account" ;
Object obj = queryrunner.query(sql,new ScalarHandler()) ;
system.out.println(obj) ;
}
最后附上改写的工具类
public class DBUtils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 获取连接池中的连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
// 获取数据源
public static DataSource getDataSource() {
return dataSource;
}
// 释放释放资源
public static void release(Statement stat, Connection con) {
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
stat = null;
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
con = null;
}
// 释放释放资源
public static void release(ResultSet rs, Statement stat, Connection con) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
release(stat, con);
}
}