Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
DBUtils的使用
一、什么是DBUtils?
1. 介绍
a. DBUtils 是 Java 操作数据库一个封装好的工具,可以简单快捷的使用数据库
b. 对于数据库的读操作,可以把结果集 ResultSet 封装成 List
、Set
、Array
等 Java 集合
c. 对于写操作,只要编写 SQL 语句
d. 可以使用数据源、JBDI
2. 作用
DBUtils 封装了 JDBC 操作,简化了过程,让编程更简洁
二、DBUtils 的三个核心对象
1. QueryRunner 类
主要的方法:
query()
:执行 DQL操作
update()
:执行 DML 操作
batch()
:执行批处理操作
2. ResultSetHandler 接口
用于DQL操作后,封装查询的结果集
3. DBUtils 类
是一个工具类,定义了关闭资源和事务处理的方法
三、DBUtils 的简单使用
- 导入 jar 包,用到MySQL数据库、C3P0、DBUtils,至少导入这三个 jar 包
- 创建一个 QueryRunner 对象,需要数据源
//创建一个 QueryRunner 对象,括号里面需要一个数据源,在另外的包创建
QueryRunner runner = new QueryRunner(C3P0Util.getDataSource());
数据源文件如下图所示,C3P0Util.java 和 C3P0-config.xml 具体代码在文章最后列出
- 定义SQL语句
//定义SQL语句,比如查询学生表的全部信息
String sql = "select * from student";
- DQL 的时候,使用 ArrayListHandler() 封装结果集
//执行sql语句并封装查询结果
List<Object[]> objectList = runner.query(sql, new ArrayListHandler());
- 最后再使用 DBUtils 的 close() 方法释放资源
四、QueryRunner 对象
1. 构造函数
new QueryRunner():事务可以自己控制
也就是说,这个对象调用的方法(query、update、batch)的参数中都需要Connection 对象
2. 普通方法
-
query:(具体例子下面讲)
ArrayHandler
:适合单行多列的情况
ArrayListHandler
:适合多行多列
ColumnListHandler
:适合多行单
KeyedHandler
:适合去多条记录,每条记录封装到 Map 中,再将 Map 封装到另外一个 Map 中,key 为指定字段的值
MapHandler
:适合适合取一行数据,把每一行数据的属性名和属性值封装到 Map 中
MapListHandler
:适合取多条记录,将记录封装到 Map 中 ,再将 Map 封装到 List 中
ScalaHandler
:适合取单行单列的数据
BeanHandler
:适合去读一行数据,并且封装到指定的对象中
BeanListHandler
:适合读取多行数据,并且封装到指定的对象中,并且添加到集合 -
update
Insert:添加数据
@Test
public void testInsert() throws SQLException{
//1. 得到一个QueryRunner对象
QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
//2. 定义SQL语句
String sql = "insert into stu value(?,?,?,?)";
//3.定义一个参数数组
Object[] params = {"1","花无缺",27,"男"}
//4. 执行DML操作
int count = runner.update(conn,sql,params);
}
Update:修改数据
@Test
public viod testUpdate() throws SQLException{
QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
String sql = "update ste set s_name=?,where s_id=?";
Object[] params = {"叶孤城","13"};
int count = runner.update(sql,params);
}
Delete:删除数据
@Test
public viod testDelete() throws SQLException{
QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
String sql = "delete from stu where sid=?";
Object[] params = {"13"};
int count = runner.delete(sql,params);
}
- batch:批量操作
@Test
public void testBatch() throws SQLException{
//1. 得到一个QueryRunner对象
QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
//2. 定义SQL语句
String sql = "insert into stu value(?,?,?,?)";
//3.定义一个参数数组
Object[] params = {
{"1","花无缺",27,"男"}
{"2","小鱼儿",27,"男"}
}
//4. 执行DML操作
int[] count = runner.batch(sql,params);
}
五、ResultSetHandler 接口
方法有很多,上面query
方法里面有提,用法都差不多,都是先构建 QueryRunner
对象,定义SQL语句,在执行方法,这里类举一个,其他的就不一一列举了
MapHandler
:取出一行数据,把每一行的数据的属性名和属性值封装到 Map 中
@Test
public void testMap() throws SQLException{
//1. 得到一个QueryRunner对象
QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
//2. 定义查询所有的SQL语句
String sql = "select * from stu where s_id=?";
//3.执行SQL语句,并封装查询结果
Map<String,Object> map = runner.query(sql,new MapHandler(),"13");
for(Map.Entry<string,Object> entry:map.entrySet()){
String key =entry.getKey();
Object value = entry.getValue();
System.out.println(key);
System.out.println(value);
}
}
六、DBUtils 的事务开发
@Test
public void testInsert() throws SQLException{
//1. 得到一个QueryRunner对象
QueryRunner runner = new QueryRunner();
//2. 得到数据库的连接
Connection conn = C3P0Util.getConnection();
//设置事务不自动提交
conn.setAutoComit(false);
//3. 定义插入的SQL语句
String sql = "insert into stu value(?,?,?,?)";
//4.定义一个参数数组
Object[] params = {"1","花无缺",27,"男"}
//4. 执行DML操作
int count = runner.update(conn,sql,params);
try{
System.out.println(1/0);//假设让程序出错,使它事务回滚
conn.commit();//提交事务
System.out.println("插入数据"+(count == 1? "成功":"失败"));
}catch(Exception e){
e.prinltStackTrace();
conn.rollback();//回滚事务
System.out.println("事务回滚了...");
}
}
七、C3P0Util.java 和 C3P0-config.xml 具体代码(选看)
C3P0Util:
package cn.csdn.utils;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* 使用C3P0连接池得到数据库的连接对象
*
* @author 长歌
* @2020年4月22日下午4:21:31
*/
public class C3P0Util {
private C3P0Util() {
}
// C3P0得到数据源的方式
private static DataSource dataSource = new ComboPooledDataSource();
/**
* 返回数据源对象
*/
public static DataSource getDataSource() {
return dataSource;
}
/**
* 得到数据库的连接对象
*/
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("创建数据库连接失败...");
}
}
/**
* 关闭数据库资源
* @param autoCloseables
*/
public static void close(AutoCloseable... autoCloseables) {
if (autoCloseables == null || autoCloseables.length == 0) {
return;
}
for (AutoCloseable autoCloseable : autoCloseables) {
if (autoCloseable == null) {
continue;
}
// 不关闭conn对象
if (autoCloseable.getClass() != Connection.class) {
try {
autoCloseable.close();
} catch (Exception e) {
System.err.println("关闭数据库资源失败:" + autoCloseable);
autoCloseable = null;
}
}
}
}
}
C3P0-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/csdn</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</default-config>
</c3p0-config>