day48-JDBC和连接池04( 三 )

测试程序:JDBCUtilsByDruid_Use
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.Date;public class JDBCUtilsByDruid_Use {@Testpublic void testSelect() {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;try {connection = JDBCUtilsByDruid.getConnection();/*** Connection是个接口,是由sun公司定义的规范,根据Connection的实现类不同,close方法也不同* mysql的厂商的实现类是直接把连接关闭 , Alibaba的实现是将引用的连接放回到连接池等待下一次引用* 因此在Druid中的close方法并不是真正地关闭连接*/System.out.println(connection.getClass());//运行类型 class com.alibaba.druid.pool.DruidPooledConnectionpreparedStatement = 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");System.out.println(id + "\t" + name + "\t" + sex + "\t" + borndate + "\t" + phone);}} catch (SQLException e) {e.printStackTrace();} finally {//关闭资源(不是真的关闭连接,而是将Connection对象放回连接池中)JDBCUtilsByDruid.close(set, preparedStatement, connection);}}}

day48-JDBC和连接池04

文章插图
注意:
Connection是个接口,是由sun公司定义的规范,根据Connection的实现类不同,close方法也不同
mysql的厂商的实现类是直接把连接关闭,Alibaba的实现是将引用的连接放回到连接池等待下一次引用
因此在Druid中的close方法并不是真正地关闭连接,而是将Connection对象放回连接池中
10.5Apache-DBUtils10.5.1resultSet问题
先分析一个问题
在之前的程序中,执行sql语句后返回的结果集存在如下问题:
  1. 关闭connection后 , resultSet结果集无法使用
    如果要使用结果集,就不能关闭连接,不能关闭连接,就会反过来影响别的程序去连接数据库,就会对多并发程序造成很大的影响
  2. resultSet不利于数据的管理
    如果其它的方法或者程序想要使用结果集,也需要一直保持连接,影响其他程序对数据库的连接
  3. 使用返回信息也不方便

day48-JDBC和连接池04

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

文章插图
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;}}

推荐阅读