day48-JDBC和连接池04-2

JDBC和连接池04-210.数据库连接池10.5Apache-DBUtils10.5.1resultSet问题

先分析一个问题
在之前的程序中,执行sql语句后返回的结果集存在如下问题:
  1. 关闭connection后,resultSet结果集无法使用
    如果要使用结果集,就不能关闭连接 , 不能关闭连接 , 就会反过来影响别的程序去连接数据库,就会对多并发程序造成很大的影响
  2. resultSet不利于数据的管理
    如果其它的方法或者程序想要使用结果集,也需要一直保持连接 , 影响其他程序对数据库的连接
  3. 使用返回信息也不方便

day48-JDBC和连接池04-2

文章插图
解决方法:
定义一个类,该类的属性和表的字段是对应关系/映射关系,即用类的属性和表的字段(列)关联起来我们把这种类叫做JavaBean,或者POJO,Domain 。
一个Actor对象就对应一条actor表的记录,将Actor对象放入到ArrayList集合中(将结果集的记录封装到ArrayList中)
day48-JDBC和连接池04-2

文章插图
10.5.2土方法完成封装Actor类(JavaBean):
package li.jdbc.datasource;import java.util.Date;/** * Actor对象和actor表的记录对应 */public class Actor {//JavaBean/POJO/Domainprivate 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;}@Overridepublic String toString() {return "\nActor{" +"id=" + id +", name='" + name + '\'' +", sex='" + sex + '\'' +", borndate=" + borndate +", phone='" + phone + '\'' +'}';}}测试程序:
package li.jdbc.datasource;import org.junit.Test;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.Date;public class JDBCUtilsByDruid_Use {//使用土方法尝试解决ResultSet问题==封装=>ArrayList@Testpublic void testSelectToArrayList() {//也可以设置返回值System.out.println("使用druid方式完成");//1.得到连接Connection connection = null;//2.组织一个sql语句String sql = "Select * from actor where id >=?";//3.创建PreparedStatement对象PreparedStatement preparedStatement = null;ResultSet set = null;ArrayList<Actor> list = new ArrayList<>();//创建ArrayList对象,存放actor对象try {connection = JDBCUtilsByDruid.getConnection();preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1, 1);//给?号赋值//执行sql,得到结果集set = preparedStatement.executeQuery();//遍历该结果集while (set.next()) {int id = set.getInt("id");String name = set.getString("name");String sex = set.getString("sex");Date borndate = set.getDate("borndate");String phone = set.getString("phone");//把得到的当前 resultSet的一条记录,封装到一个Actor对象中,并放入arraylist集合list.add(new Actor(id,name,sex,borndate,phone));}System.out.println("list集合数据="+list);//orfor (Actor actor:list) {System.out.println("id="+actor.getId()+"\t"+"name="+actor.getName());}} catch (SQLException e) {e.printStackTrace();} finally {//关闭资源(不是真的关闭连接 , 而是将Connection对象放回连接池中)JDBCUtilsByDruid.close(set, preparedStatement, connection);}//因为ArrayList 和 connection 没有任何关联,所以该集合可以复用//return list;}}
day48-JDBC和连接池04-2

文章插图
10.5.3Apache-DBUtils
  • 基本介绍
    commons-dbutils是Apache组织提供的一个开源 JDBC工具类库,它是对 JDBC的封装,使用dbutils能极大简化 JDBC编码的工作量 。
  • DbUtils类
  1. QueryRunner类:该类封装了SQL的执行,是线程安全的 。可以实现增、删、改、查、批处理
  2. 使用QueryRunner类实现查询
  3. ResultSetHandler接口:该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式
方法解释ArrayHandler将结果集中的第一行数据转成对象数组ArrayListHandler把结果集中的每一行数据都转成一个数组,再存放到List中BeanHandler将结果集中的第一行数据封装到一个对应的JavaBean实例中BeanListHandler将结果集中的每一行数据都封装到一个对应的JavaBean实例中 , 再存放到List中ColumnListHandler将结果集中某一列的数据存放到List中KeyedHandler(name)将结果集中的每行数据都封装到Map中 , 再把这些map再存放到一个map里,其key为指定的keyMapHandler将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值MapListHandler将结果集中的每一行数据都封装到一个Map里,然后再存放到List

推荐阅读