DBUtils的介绍
一、DBUtils简介
JDBC即Java数据库连接,而DBUtils为工具类,是为数据库连接提供简便的,因为在连接过程中,会出现代码重复,可读性不好,而工具类就是把这些重复的地方封装起来,对代码进行简化,可读性也会增强。
二、JDBC的一般性流程
加载驱动(Driver Manger)
获得链接(Driver Manger,Connection)
获得执行sql对象(Statement,PreparStatement)
解析结果集(ReslutSet)
释放资源(close())
在这五个流程中,都可以使用DBUtils来简化代码。
三个接口
三个API(都是接口,主要依靠底层的实现子类):
org.apache.commons.dbutils.QueryRunner ; 查询器
org.apache.commons.dbutils.ResultSetHandler ; 结果处理器
org.apache.commons.dbutils.Dbutils; 普通工具
QueryRunner: 增删改查 (线程安全)
new QueryRunner(); 它的事务可以手动控制。也就是说此对象调用的方法(如:query、update、batch)参数中要有Connection对象。
new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。
小结:简化了SQL语句
public void testQuery1(){
//之前做法
Connection connection = MyDBUtil.getconnection();
//查看API,QueryRunner的构造方法有4个,2个给Oracle,
//其他两个,一个无参,一个参数为DataSource
DataSource dataSource = MyDBUtil.getDataSource();
QueryRunner QR = new QueryRunner(dataSource);
//查看QueryRunner的成员方法,只需要查看query()的重载方法
//构造方法为一参的有数据源的话,就不用传入connection
//构造方法为无参构造方法的话,就要传入connection
//查询所有用户,需要返回的是所有User的集合
users = new ArrayList<>();
ArrayList<User> users = QR.query("select * from tt_user;",new ResultSetHandler<ArrayList<User>>(){
@Override
public ArrayList<User> handle(ResultSet result){
while(result.next()){
int id = result.getInt("id");
String name = result.getString("name");
User user = new User(id,name);
users.add(user);
}
}
})
}
ResultSetHandler : 结果集处理器
ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
ColumnListHandler:取某一列的数据。封装到List中。
KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
ScalarHandler:适合取单行单列数据
BeanHandler: 将结果集中第一条记录封装到一个指定的javaBean中。
BeanListHandler:将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
小结:对结果集的具体实现的一些API。
public void test1() throws SQLException {
//统一的两句语法:
ComboPooledDataSource dataSource = C3P0Utils.getDataSource();
QueryRunner queryRunner = new QueryRunner(dataSource);
//1.ArrayHandler
Object[] query = queryRunner.query("select * from tt_user where id = ?",
new ArrayHandler(), 5);
//2.ArrayListHandler
List<Object[]> query = queryRunner.query("select * from tt_user ",
new ArrayListHandler());
//3.BeanHandler
User query = queryRunner.query("select * from tt_user ",
new BeanHandler<User>(User.class));
//4.BeanListHandler
User query = queryRunner.query("select * from tt_user ",
new BeanListHandler<User>(User.class));
//5.ColumnListHandler
List<Object> column_ = queryRunner.query("select username from tt_user ",
new ColumnListHandler());
//6.KeyedHandler
Map<Object, Map<String, Object>> query = queryRunner.query("select * from tt_user ",
new KeyedHandler());
//7.MapHandler 把预期的一行的数据,封装到一个map里
Map<String, Object> query =
queryRunner.query("select * from tt_user ",new MapHandler());
//8.MapListHandler 把预期的多行的数据,封装到多个map里
List<Map<String, Object>> query = queryRunner.query("select * from tt_user ",
new MapListHandler());
//9.ScalarHandler 把预期的多行的数据,封装到多个map里
Object query = queryRunner.query(connection,"select count(*) from tt_user ",
new ScalarHandler());
}
DBUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法,做一些诸如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,它里面所有的方法都是静态的。
close():DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭连接、声明和结果(ResultSet)。
LoadDriver(String driveClassName):这一方法装载并注册JDBC驱动程序,如果成功就返回TRUE。使用这种方法,你不需要去捕捉这个异常ClassNotFoundException。使用loadDrive方法,编码就变得更容易理解,你也就得到了一个很好的Boolean返回值,这个返回值会告诉你驱动类是不是已经加载成功了。
总结
使用DBUtils不可能发生资源泄漏。正确的JDBC编码并不困难,但它既耗时又乏味。这种连接往往很难追踪;更干净、更清晰的持久性代码。在数据库中持久化数据所需的代码量大大减少。剩下的代码清楚地表达了您的意图,而不会被资源清理搞得一团糟;从结果集自动填充JavaBean属性。不需要通过调用setter方法将列值手动复制到bean实例中。ResultSet的每一行都可以由一个完全填充的bean实例表示。