前言: 引出類與對象(oop) -- 為什麼需要類與對象(oop) 例:我有兩隻小狗,有姓名,年齡,性別,怎麼完成該操作? //用變數 String DogName = "小白"; int DogAge = 6; char DogSex= '公' String DogName = "小新"; int ...
前段時間做數據源開發時用到了JDBC,碰到了一個問題,記錄一下。
創建了一個JDBC工具類用來創建連接,並傳入SQL查詢,向調用者返回ResultSet對象,隨後在工具類中關閉連接。
但是調用之後發現ResultSet始終拿不到數據,最後發現 ResultSet隨著工具類中在finally中關閉連接而清空。
百度後發現可以將ResultSet指向CacheRowSetImpl類然後返回的方法,但是部署伺服器編譯的時候提示 “com.sun.rowset.CachedRowSetImpl 是 Sun 的專用 API,在後續的JDK9版本後(包括JDK9)已經刪除”。
原因是CacheRowSetImpl是過時的類,即將在JDK 9的版本中移除,所以不建議使用。
最後,如下所示,既可以給上層返回ResultSet,在上層解析完結果集後還可以關閉連接:
package com.JyoKou.utils;
import java.sql.*;
/**
* 創建JDBC連接工具類
*
* @author JyoKou
* @since 2022年7月7日
*/
public class JDBCUtils {
private final Connection conn;
private final PreparedStatement ps;
public JDBCUtils(String driver, String url, String userName, String password, String sql) {
try {
Class.forName(driver);
this.conn = DriverManager.getConnection(url, userName, password);
this.ps = conn.prepareStatement(sql);
} catch (Exception e) {
e.printStackTrace();
throw new BadRequestException(MsgConstants.MSG);
}
}
/**
* 創建JDBC連接並執行查詢語句
*
* @return ResultSet結果集
* @author JyoKou
* @since 2022年7月7日
*/
public ResultSet getQuery() {
ResultSet rs;
try {
rs = this.ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
throw new BadRequestException(MsgConstants.MSG);
}
return rs;
}
/**
* 關閉連接
*
* @author JyoKou
* @since 2022年7月15日
*/
public void close() {
try {
if (this.ps != null) {
this.ps.close();
}
if (this.conn != null) {
this.conn.close();
}
} catch (Exception e) {
e.printStackTrace();
throw new BadRequestException(MsgConstants.MSG);
}
}
}
調用的時候可以這樣寫:
public Object getDataFromDs(String connectDrivers, BaSysHomepageDatasourceEntity baSysHomepageDatasourceEntity) {
//JDBC執行查詢
JDBCUtils jdbcUtils = new JDBCUtils(connectDrivers
, baSysHomepageDatasourceEntity.getDataUrl()
, baSysHomepageDatasourceEntity.getDataUserName()
, baSysHomepageDatasourceEntity.getDataUserPwd()
, homepageCardQueryData.getQuerySql());
ResultSet resultSet = jdbcUtils.getQuery();
try {
if (resultSet.next()) {
return resultSet.getInt("F_NUM");
} else {
throw new BadRequestException(MsgConstants.MSG);
}
} catch (SQLException e) {
e.printStackTrace();
throw new BadRequestException(MsgConstants.MSG);
} finally {
jdbcUtils.close();
}
}
總結:JDBC工具類使用構造函數對成員變數conn進行構造,然後調用查詢方法拿到結果集進行解析,解析完畢後再使用JDBCUtils.close()關閉成員變數conn連接。