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;}}

推薦閱讀