1.Apache—DBUtils84661.1首先分析一个问题846
1.关闭connection后,resultset结果集无法使用
2.resultset不利于数据管理
3.示意图
1.2用自己的土方法解决847com中的代码.stulzl.dbutils_My_DBUtilspackage 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 847public 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.创建preparedStatent对象 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表记录对应 847public 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基本介绍8481.commonsdbutils是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_USEpackage 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;//使用DBUTilss +数据连接池(德鲁伊),crud完成表actor 848public 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=? 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); }}
1.5表与JavaBean的类型映射关系851