一、引言
在 Java 開發中,與數據庫的交互是一項常見且重要的任務。JDBC(Java Database Connectivity)作為 Java 語言訪問數據庫的標準 API,為我們提供了統一的接口來操作各種數據庫。然而,每次進行數據庫操作都編寫大量重復的代碼,如加載驅動、獲取連接、釋放資源等,不僅繁瑣,還容易出錯。因此,我們通常會封裝一個 JDBC 工具類來簡化這些操作。本文將詳細介紹我所編寫的三個不同版本的 JDBC 工具類,分別是基礎版(1.0)、優化版(2.0)和連接池版(3.0)。
二、基礎版(1.0):JDBCUtilsO
2.1 代碼實現
package com.qcby;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class JDBCUtilsO {/*** 加載驅動的方法 static*/public static void loadDriver() {try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(Exception e){e.printStackTrace();}}//獲取鏈接public static Connection getconnect() {loadDriver();Connection conn = null;try{conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "123456");} catch (Exception e) {e.printStackTrace();}return conn;}//釋放資源public static void close(Connection conn, Statement stmt, ResultSet rs) {if(rs != null) {try{rs.close();} catch (Exception e) {e.printStackTrace();}}if(stmt != null) {try{stmt.close();} catch (Exception e) {e.printStackTrace();}}if(conn != null) {try{conn.close();}catch (Exception e) {e.printStackTrace();}}}
}
2.2 代碼分析
- 加載驅動:通過
Class.forName("com.mysql.cj.jdbc.Driver")
加載 MySQL 的 JDBC 驅動。 - 獲取連接:使用
DriverManager.getConnection
方法獲取數據庫連接,需要硬編碼數據庫的 URL、用戶名和密碼。 - 釋放資源:依次關閉
ResultSet
、Statement
和Connection
對象,確保資源被正確釋放。
2.3 優缺點
- 優點:代碼簡單易懂,適合初學者理解 JDBC 的基本操作流程。
- 缺點:
- 數據庫連接信息硬編碼在代碼中,不利于維護和修改。
- 每次獲取連接都需要重新加載驅動,效率較低。
三、優化版(2.0):JdbcUtils
3.1 代碼實現
package com.qcby;import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class JdbcUtils {private static final String driverclass;private static final String url;private static final String username;private static final String password;static {//加載屬性文件Properties prop = new Properties();InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");if (in == null) {System.out.println("找不到配置文件");}try{prop.load(in);} catch (Exception e) {e.printStackTrace();}//給常量賦值driverclass = prop.getProperty("driverclass");url = prop.getProperty("url");username = prop.getProperty("username");password = prop.getProperty("password");}/*** 加載驅動*/public static void loadDriver() throws ClassNotFoundException, SQLException {try{//加載驅動類Class.forName(driverclass);}catch (ClassNotFoundException e){e.printStackTrace();}}/*** 獲取鏈接 返回鏈接對象* @return*/public static Connection getConnection() {//加載驅動//獲取到鏈接對象,返回連接對象;Connection conn = null;try {conn = DriverManager.getConnection(url, username, password);} catch (SQLException e) {e.printStackTrace();}return conn;}public static void close(Connection conn, Statement stmt, ResultSet rs) {if (rs != null) {try {rs.close();} catch (Exception e) {e.printStackTrace();}}if (stmt != null) {try{stmt.close();}catch (Exception e){e.printStackTrace();}}if (conn != null) {try{conn.close();} catch (Exception e) {e.printStackTrace();}}}
}
?
3.2 代碼分析
- 配置文件加載:通過
Properties
類加載jdbc.properties
配置文件,將數據庫連接信息存儲在配置文件中,避免了硬編碼。 - 靜態代碼塊:在類加載時執行靜態代碼塊,確保驅動只加載一次。
- 獲取連接:從配置文件中讀取數據庫連接信息,使用
DriverManager.getConnection
方法獲取連接。
3.3 優缺點
- 優點:
- 數據庫連接信息存儲在配置文件中,便于維護和修改。
- 驅動只加載一次,提高了效率。
- 缺點:每次獲取連接都需要創建新的連接對象,頻繁創建和銷毀連接會消耗大量的系統資源。
?
四、連接池版(3.0):JDBCUtilsC
4.1 代碼實現
package com.qcby;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class JDBCUtilsC {//連接池對象private static DataSource DATA_SOURCE;static {//加載屬性文件Properties prop = new Properties();InputStream input = JDBCUtilsC.class.getClassLoader().getResourceAsStream("jdbc.properties");try{//加載屬性文件prop.load(input);//創建連接池對象DATA_SOURCE = DruidDataSourceFactory.createDataSource(prop);}catch(Exception e){e.printStackTrace();}}/*** 從連接池中獲取鏈接,返回*/public static Connection getConnection() {Connection conn = null;try{conn = DATA_SOURCE.getConnection();} catch (Exception e) {e.printStackTrace();}return conn;}public static void close(Connection conn, Statement stmt, ResultSet rs){if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}
?
4.2 代碼分析
- 連接池的使用:使用阿里巴巴的 Druid 連接池,通過
DruidDataSourceFactory.createDataSource
方法創建連接池對象。 - 獲取連接:從連接池中獲取連接,而不是每次都創建新的連接對象。
- 釋放資源:關閉連接時,實際上是將連接歸還給連接池,而不是真正的關閉。
4.3 優缺點
- 優點:
- 連接池可以復用連接對象,減少了頻繁創建和銷毀連接的開銷,提高了系統的性能。
- 連接池可以對連接進行管理,如連接的超時、最大連接數等,提高了系統的穩定性。
- 缺點:引入了第三方依賴,增加了項目的復雜度。
五、總結
通過對三個不同版本的 JDBC 工具類的介紹,我們可以看到,隨著版本的升級,工具類的性能和可維護性都得到了顯著的提升。基礎版適合初學者了解 JDBC 的基本操作,優化版通過配置文件和靜態代碼塊提高了代碼的可維護性和效率,而連接池版則通過連接池的使用進一步提高了系統的性能和穩定性。在實際開發中,我們應該根據項目的需求選擇合適的版本。
希望本文對你理解 JDBC 工具類的優化過程有所幫助。如果你有任何問題或建議,歡迎在評論區留言。
以上博客圍繞 JDBC 工具類的三個版本展開,從基礎版逐步優化到連接池版,詳細介紹了每個版本的代碼實現、代碼分析和優缺點,希望能滿足你的需求。你可以根據實際情況進行調整和修改。