JDBC 工具類:1.0到3.0版本

一、引言

在 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、用戶名和密碼。
  • 釋放資源:依次關閉ResultSetStatementConnection對象,確保資源被正確釋放。

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 工具類的三個版本展開,從基礎版逐步優化到連接池版,詳細介紹了每個版本的代碼實現、代碼分析和優缺點,希望能滿足你的需求。你可以根據實際情況進行調整和修改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86646.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86646.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實驗室建設案例 | 洛陽職業技術學院—人工智能實驗室

院校簡介 洛陽職業技術學院位于千年古都、牡丹花城、絲路起點洛陽,是一所由洛陽市政府舉辦的公辦高職院校,成立于2011年,辦學歷史可追溯到1945年的豫西公學。學校全面貫徹黨的教育方針,圍繞落實立德樹人根本任務,秉承“…

vue2中,修改對象數組中元素對應的屬性,頁面不更新的問題解決

有如下代碼: // 有一個數組 let dataAry [{name: haha, age: 20},{name: hello, age: 21} ] // 這個數組在模板中使用了v-for進行循環 v-for"one of dataAry" :name"one.name" :address"one.address"// 子組件中使用如下&#xff…

代理模式:控制對象訪問的守門員[特殊字符],優雅實現功能增強與訪問控制!

代理模式:控制對象訪問的守門員🔐,優雅實現功能增強與訪問控制! 文章目錄 代理模式:控制對象訪問的守門員🔐,優雅實現功能增強與訪問控制!前言:為什么需要代理&#xff1…

《人間詞話》PPT課件

《人間詞話》簡介 《人間詞話》是王國維所著的一部文學批評著作。《人間詞話》作于1908~1909年,最初發表于《國粹學報》。該作是作者接受了西洋美學思想之洗禮后,以嶄新的眼光對中國舊文學所作的評論。 《人間詞話》PPT課件下載 夸克網盤分享…

解剖智能運維三基石:Metrics/Logs/Traces

3秒知識卡 三基石關系: Metrics(指標)→ 系統脈搏(CPU/錯誤率) Logs(日志)→ 事件日記(錯誤堆棧/用戶行為) Traces(追蹤)→ 血緣地圖(…

從代碼學習深度學習 - 情感分析:使用卷積神經網絡 PyTorch版

文章目錄 前言加載數據集一維卷積最大時間匯聚層textCNN模型定義模型加載預訓練詞向量訓練和評估模型總結前言 在之前的章節中,我們探討了如何使用循環神經網絡(RNN)來處理序列數據。今天,我們將探索另一種強大的模型——卷積神經網絡(CNN)——并將其應用于自然語言處理…

深入解析分布式訓練基石:ps-lite源碼實現原理

分布式機器學習框架是現代推薦、廣告和搜索系統的核心支撐。面對海量訓練數據和高維稀疏特征,參數服務器(Parameter Server, PS) 架構應運而生。作為早期經典實現的ps-lite因其簡潔性和完整性,成為理解PS原理的絕佳切入點。本文將…

IDEA 插件開發:Internal Actions 與 UI Inspector 快速定位 PSI

在開發 IntelliJ 平臺插件的過程中,你常常需要搞清楚 某個 IDE 彈框背后是如何操作 PSI(Program Structure Interface) 的。下面這篇筆記將介紹如何通過 Internal Actions、UI Inspector 以及調試技巧快速定位 PSI 調用鏈。 1. 啟用 Internal…

26考研|數學分析:多元函數微分學

前言 本章我們將進行多元函數微分學的學習,多元函數微分學與一元函數微分學相對應,涉及到可微性、中值定理、泰勒公式等諸多問題的探討與研究,本章難度較大,在學習過程中需要進行深度思考與分析,才能真正掌握這一章的…

數星星--二分

https://www.matiji.net/exam/brushquestion/17/4498/F16DA07A4D99E21DFFEF46BD18FF68AD 二分思路不難&#xff0c;關鍵的區間內個數的確定 #include<bits/stdc.h> using namespace std; #define N 100011 #define inf 0x3f3f3f3f typedef long long ll; typedef pair&…

Oracle/PostgreSQL/MSSQL/MySQL函數實現對照表

函數列表清單 函數作用OraclePOSTGRESQLMSSQLMYSQL求字符串長度LENGTH(str)LENGTH(str)LEN(str)LENGTH(str)字符切割SUBSTR(str,index,length)SUBSTR(str,index,length)SUBSTRING(str,index,length)SUBSTRING(str,index,length)字符串連接str1||str2||str3...strNstr1||str2||…

pycharm客戶端安裝教程

二、 pycharm客戶端安裝 打開pycharm官網&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows 選擇其他版本 選擇2018社區版本&#xff0c;點擊下載 雙擊下載的安裝程序(第一個彈框允許)&#xff0c;選擇下一步 更改安裝路徑&#xff0c;在pycah…

博圖SCL語言中用戶自定義數據類型(UDT)使用詳解

博圖SCL語言中用戶自定義數據類型&#xff08;UDT&#xff09;使用詳解 一、UDT概述 用戶自定義數據類型&#xff08;UDT&#xff09;是TIA Portal中強大的結構化工具&#xff0c;允許將多個相關變量組合成單一數據結構。UDT本質是可重用的數據模板&#xff0c;具有以下核心優…

Vscode自定義代碼快捷方式

首選項>配置代碼片段 >新建全局代碼片段 (也可以選擇你的語言 為了避免有的時候不生效 選擇全局代碼) {"console.log": { //名字"prefix": "log",//prefix 快捷鍵 &#xff1a; log"body": ["console.log($1);", //b…

ESP32 008 MicroPython Web框架庫 Microdot 實現的網絡文件服務器

以下是整合了所有功能的完整 main.py(在ESP32 007 MicroPython 適用于 Python 和 MicroPython 的小型 Web 框架庫 Microdot基礎上)&#xff0c;實現了&#xff1a; Wi?Fi 自動連接&#xff08;支持靜態 IP&#xff09;&#xff1b;SD 卡掛載&#xff1b;從 /sd/www/ 讀取 HTML…

Mcp-git-ingest Quickstart

目錄 配置例子 文檔github鏈接&#xff1a;git_ingest.md 配置 {"mcpServers": {"mcp-git-ingest": {"command": "uvx","args": ["--from", "githttps://github.com/adhikasp/mcp-git-ingest", "…

(LeetCode 面試經典 150 題) 27.移除元素

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路詳解&#xff1a; 樣例模擬&#xff1a; 代碼&#xff1a; C代碼&#xff1a; Java代碼&#xff1a; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接…

MySQL之事務原理深度解析

MySQL之事務原理深度解析 一、事務基礎&#xff1a;ACID特性的本質1.1 事務的定義與核心作用1.2 ACID特性的內在聯系 二、原子性與持久性的基石&#xff1a;日志系統2.1 Undo Log&#xff1a;原子性的實現核心2.2 Redo Log&#xff1a;持久性的保障2.3 雙寫緩沖&#xff08;Dou…

JUC:5.start()與run()

這兩個方法都可以使線程進行運行&#xff0c;但是start只能用于第一次運行線程&#xff0c;后續要繼續運行該線程需要使用run()方法。如果多次運行start()方法&#xff0c;會出現報錯。 初次調用線程使用run()方法&#xff0c;無法使線程運行。 如果你對一個 Thread 實例直接調…

微服務中解決高并發問題的不同方法!

如果由于流量大而在短時間內幾乎同時發出請求&#xff0c;或者由于服務器不穩定而需要很長時間來處理請求&#xff0c;并發問題可能會導致數據完整性問題。 示例問題情況 讓我們假設有一個邏輯可以檢索產品的庫存并將庫存減少一個&#xff0c;如上所述。此時&#xff0c;兩個請…