1. Apache—DBUtils 846
1.1 先分析一个问题 846
1.关闭connection后,resultSet结果集无法使用
2.resultSet不利于数据的管理
3.示意图
1.2 用自己的土方法来解决 847
代码在com.stulzl.dbutils_
My_DBUtils
package com.stulzl.dbutils_;
import com.stulzl.jdbcutils_druid.JDBCUtils_Druid;
import org.junit.jupiter.api.Test;
import java.sql.*;
import java.util.ArrayList;
//用自己的土方法来解决将ResultSet封装到 ArrayList 847
public class My_DBUtils {
//用自己的土方法来解决 847
@Test
public void /*ArrayList*/ testSelectToArrayList(){
System.out.println("使用druid工具类方式完成");
//1.得到连接
Connection connection = null;
//2.组织一个sql语句
String sql = "select * from actor where id>=?";
PreparedStatement preparedStatement=null;
ResultSet set = null;
//创建一个ArrayList集合,因为我们需要将ResultSet封装到 ArrayList存放actor对象
ArrayList list = new ArrayList<>();
try {
connection = JDBCUtils_Druid.getConnection();
//3.创建preparedStatement对象
preparedStatement = connection.prepareStatement(sql);
//4. 给占位符赋值
preparedStatement.setInt(1,1);
//执行,得到结果集
set = preparedStatement.executeQuery();
//遍历该结果集
while(set.next()){
int id = set.getInt("id");//这里提示("id")可以直接写,也可以写数字(按对应顺序)
String name = set.getString("name");
String sex = set.getString("sex");
Date borndate = set.getDate("borndate");
String phone = set.getString("phone");
//把得到的 resultset 的记录,封装到 Actor 对象,放入到 list 集合
list.add(new Actor(id,name,sex,borndate,phone));
}
System.out.println("list集合数据="+list);
//遍历集合取数据
for(Actor actor:list){
System.out.println("id=" + actor.getId() + "\t" + actor.getName());
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭资源
JDBCUtils_Druid.close(set,preparedStatement,connection);
}
//因为 ArrayList 和 connection 没有任何关联,所以该集合可以复用.
//return list;
}
}
Actor类
package com.stulzl.dbutils_;
import java.util.Date;
//Actor对象和actor表记录对应 847
public class Actor {
private Integer id;
private String name;
private String sex;
private Date borndate;
private String phone;
//无参构造器
public Actor() {
}
//有参构造器
public Actor(Integer id, String name, String sex, Date borndate, String phone) {
this.id = id;
this.name = name;
this.sex = sex;
this.borndate = borndate;
this.phone = phone;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBorndate() {
return borndate;
}
public void setBorndate(Date borndate) {
this.borndate = borndate;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "\nActor{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", borndate=" + borndate +
", phone='" + phone + '\'' +
'}';
}
}
1.3 基本介绍 848
1.commons dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的封装,
使用dbutils能极大简化jdbc编码的工作量。
DbUtils类
1. QueryRunner类: 该类封装了SQL的执行,是线程安全的。可以实现增、删、改、查、批处理
2.使用QueryRunner类实现查询
ResultSetHandler接口:该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式
1.4 应用实例 848-851
使用DBUtils +数据连接池(德鲁伊)方式,完成对表actor的crud
代码在com.stulzl.dbutils_
DBUtils_USE
package com.stulzl.dbutils_;
import com.stulzl.jdbcutils_druid.JDBCUtils_Druid;
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;
//使用DBUtils +数据连接池(德鲁伊)方式,完成对表actor的crud 848
public class DBUtils_USE {
@Test
public void testQueryMany() throws SQLException {//返回结果是多行的情况
//1. 使用druid得到连接
Connection connection = JDBCUtils_Druid.getConnection();
//2. 使用 DBUtils 类和接口 , 先引入 DBUtils 相关的 jar , 加入到本 Project
//3. 创建 QueryRunner
QueryRunner queryRunner = new QueryRunner();
//4. 就可以执行相关的方法,返回 ArrayList 结果集
String sql = "select * from actor where id >= ?";
// 注意: sql 语句也可以查询部分列
//String sql = "select id, name from actor where id >= ?";
// 老韩解读
//(1) query 方法就是执行 sql 语句,得到 resultset --->封装到 --> ArrayList 集合中
//(2) 返回集合
//(3) connection: 连接
//(4) sql : 执行的 sql 语句
//(5) new BeanListHandler<>(Actor.class): (多行多列)在将 resultset -> Actor 对象 ->
// 封装到 ArrayList 底层使用反射机制(Actor.class) 去获取 Actor 类的属性,然后进行封装
//(6) 1 就是给 sql 语句中的 ? 赋值,可以有多个值,因为是可变参数 Object... params
//(7) 底层得到的 resultset ,会在 query方法 关闭, 也会关闭 PreparedStatment预处理
List list =
queryRunner.query(connection, sql, new BeanListHandler<>(Actor.class), 1);
System.out.println("输出集合的信息");
for (Actor actor : list) {
System.out.print(actor);
}
//释放资源
JDBCUtils_Druid.close(null,null,connection);
}
//演示 apache-dbutils + druid 完成返回的结果集是单行记录(单个对象) 840
@Test
public void testQuerySingle() throws SQLException {
//1. 使用druid得到连接
Connection connection = JDBCUtils_Druid.getConnection();
//2. 使用 DBUtils 类和接口 , 先引入 DBUtils 相关的 jar , 加入到本 Project
//3. 创建 QueryRunner
QueryRunner queryRunner = new QueryRunner();
//4. 就可以执行相关的方法
String sql = "select * from actor where id = ?";
// 因为我们返回的单行记录<--->单个对象--单行多列即一行数据 , 使用的是 BeanHandler返回 单个对象
Actor actor = queryRunner.query(connection, sql, new BeanHandler<>(Actor.class), 3);
System.out.println(actor);//输出
//释放资源
JDBCUtils_Druid.close(null,null,connection);
}
//演示 apache-dbutils + druid 完成查询结果是单行单列-返回的就是 object
@Test
public void testScalar() throws SQLException {
//1. 使用druid得到连接
Connection connection = JDBCUtils_Druid.getConnection();
//2. 使用 DBUtils 类和接口 , 先引入 DBUtils 相关的 jar , 加入到本 Project
//3. 创建 QueryRunner
QueryRunner queryRunner = new QueryRunner();
//4. 就可以执行相关的方法
String sql = "select name from actor where id = ?";
//解读: 因为返回的是一个对象--单行单列即一个数据, 使用的 handler 就是 ScalarHandler
Object obj = queryRunner.query(connection, sql, new ScalarHandler(), 3);
System.out.println(obj);
//释放资源
JDBCUtils_Druid.close(null,null,connection);
}
//演示 apache-dbutils + druid 完成 dml (update, insert ,delete)
@Test
public void testDML() throws SQLException {
//1. 使用druid得到连接
Connection connection = JDBCUtils_Druid.getConnection();
//2. 使用 DBUtils 类和接口 , 先引入 DBUtils 相关的 jar , 加入到本 Project
//3. 创建 QueryRunner
QueryRunner queryRunner = new QueryRunner();
//组织sql语句
//String sql = "update actor set name=? where id=?";
//String sql = "insert into actor values(null, ?, ?, ?, ?)";
String sql = "delete from actor where id = ?";
//int affectedRow = queryRunner.update(connection, sql, "张三丰", 3);
//int affectedRow = queryRunner.update(connection, sql,"林青霞", "女", "1966-10-10", "116");
int affectedRow = queryRunner.update(connection, sql, 2);
System.out.println(affectedRow > 0 ? "执行成功" : "执行没有影响到表");
//释放资源
JDBCUtils_Druid.close(null,null,connection);
}
}