day48-JDBC和连接池04-2

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

【day48-JDBC和连接池04-2】先分析一个问题
在之前的程序中 , 执行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;}}

经验总结扩展阅读