问题引入
- 关闭 connection 后,resultSet 结果集无法使用
- resultSet 不利于数据的管理
- commons——dbutils 是Apache组织提供的一个开源 JDBC 工具类库,它是对JDBC的封装,使用 dbutils 能极大简化 JDBC 编码的工作量
DBUtils类
- QueryRunner类:该类封装了sql的执行,是线程安全的,可以实现增删改查以及批处理
- ResultSetHandler接口:该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式
package com.ftn.jdbc.JDBCutils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
//使用 apache-DBUtils 工具类 + Druid 连接池完成对表的 crud 操作
public class DBUtils_Use {
//使用 apache-DBUtils 工具类 + Druid 连接池完成返回的结果是 resultSet 结果集
@Test
public void testDBUtils_many() throws SQLException {
//1.得到连接
Connection connection = JDBCUtilsByDruid.getConnection();
//2.使用 DBUtils 相关类和接口,先引入相关的 dbutils.jar包,加入本项目
//3.再创建 QueryRunner
String sql = "select * from actor where id>=?";
QueryRunner queryRunner = new QueryRunner();
//4.执行相关方法,返回 ArrayList 结果集
// 1.query 方法就是执行了 sql 语句,将返回的 resultSet 结果集封装到 ArrayList 集合中
// 2.new BeanListHandler<>(Actor.class): 在将 resultSet->Actor 对象->封装到 ArrayList
// 底层使用反射机制获取 Actor类的属性,然后进行封装
// 3.底层得到的 resultSet 以及 preparedstatement 会在 query 中关闭
List list = queryRunner.query(connection, sql, new BeanListHandler<>(Actor.class), 2);
//5.输出集合的信息
for (Actor actor : list) {
System.out.print(actor);
}
JDBCUtilsByDruid.close(null, null, connection);
}
//使用 apache-DBUtils 工具类 + Druid 连接池完成返回的结果是单行记录,返回类型为实体类 Actor
@Test
public void testDBUtils_Single() throws SQLException {
//1.得到连接
Connection connection = JDBCUtilsByDruid.getConnection();
//2.使用 DBUtils 相关类和接口,先引入相关的 dbutils.jar包,加入本项目
//3.再创建 QueryRunner
String sql = "select * from actor where id=?";
QueryRunner queryRunner = new QueryRunner();
//返回单条记录,即单个对象,使用的 Handler是 BeanHandler
Actor actor = queryRunner.query(connection, sql, new BeanHandler<>(Actor.class), 1);
System.out.println(actor);
JDBCUtilsByDruid.close(null, null, connection);
}
//使用 apache-DBUtils 工具类 + Druid 连接池完成返回的结果是单行单列记录,返回类型为 Object
@Test
public void testDBUtils_Scalar() throws SQLException {
//1.得到连接
Connection connection = JDBCUtilsByDruid.getConnection();
//2.使用 DBUtils 相关类和接口,先引入相关的 dbutils.jar包,加入本项目
//3.再创建 QueryRunner
String sql = "select name from actor where id=?";
QueryRunner queryRunner = new QueryRunner();
//返回单条记录,即单个对象,使用的 Handler是 BeanHandler
Object query = queryRunner.query(connection, sql, new ScalarHandler<>(), 1);
System.out.println(query);
JDBCUtilsByDruid.close(null, null, connection);
}
//使用 apache-DBUtils 工具类 + Druid 连接池完成 DML 操作
@Test
public void testDBUtils_DML() throws SQLException {
//1.得到连接
Connection connection = JDBCUtilsByDruid.getConnection();
//2.使用 DBUtils 相关类和接口,先引入相关的 dbutils.jar包,加入本项目
//3.再创建 QueryRunner
String sql = "update actor set name='jary' where id=?";
QueryRunner queryRunner = new QueryRunner();
// (1).执行 DML 操作是 queryRunner.update()
// (2).返回值是受影响的行数
int i = queryRunner.update(connection, sql, 1);
System.out.println(i>0?"执行成功":"执行没有影响到表");
JDBCUtilsByDruid.close(null, null, connection);
}
}