數據庫連接管理--Java連接數據庫的幾種方式

1.數據庫連接管理

1.1 使用JDBC獲取連接

JDBC是Java標準庫提供的API,用于連接和操作關系型數據庫。它是最基礎、最常用的數據庫連接方式。

步驟:

  1. 加載數據庫驅動。
  2. 建立連接。
  3. 創建Statement或PreparedStatement對象。
  4. 執行SQL查詢或更新。
  5. 處理結果集。
  6. 關閉連接。
 private static final String URL = "jdbc:mysql://localhost:3306/pet_management?useSSL=false&serverTimezone=UTC";private static final String USER = "root";private static final String PASSWORD = "226774";public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {// 1. 加載數據庫驅動Class.forName("com.mysql.cj.jdbc.Driver");// 2. 建立數據庫連接connection = DriverManager.getConnection(URL, USER, PASSWORD);// 3. 創建 PreparedStatement 并設置參數String sql = "SELECT id,`name`,species,age FROM pets WHERE age > ?";preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,"3");// 4. 執行查詢resultSet = preparedStatement.executeQuery();// 5. 處理結果集while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");String species = resultSet.getString("species");int age = resultSet.getInt("age");System.out.println("ID: " + id + ", Name: " + name +",Species"+species+ ", Age: " + age);}} catch (ClassNotFoundException e) {System.err.println("數據庫驅動未找到: " + e.getMessage());} catch (SQLException e) {System.err.println("數據庫連接失敗: " + e.getMessage());} finally {// 6. 關閉資源try {if (resultSet != null) resultSet.close();if (preparedStatement != null) preparedStatement.close();if (connection != null) connection.close();} catch (SQLException e) {System.err.println("資源關閉失敗: " + e.getMessage());}}}

由于獲取數據庫連接資源比較繁瑣,因此要對數據庫連接進行管理。
對數據庫連接進行配置化管理連接串,用戶名,密碼以及驅動類,配置化管理就是把相關的字符串放入到一個文件中,這個文件可以是接口,可以是properties文件,可以是xml文件。

1.2 使用接口方法獲取連接

1.創建接口

public interface DBconfig {//把連接的地址,用戶名,密碼作為常量封裝到接口中public static final String URL = "jdbc:mysql://localhost:3306/pet_management?useSSL=false&serverTimezone=UTC";public static final String USER = "root";public static final String PASSWORD = "226774";
}

2.創建連接工具類

public class ConnectionHelp {//靜態代碼塊,調用類時只加載一次static{try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}//構造私有化,不能再創建ConnectionHelp對象private ConnectionHelp(){}//創建數據庫連接,封裝到方法中public static Connection getCon() throws SQLException {Connection connection = DriverManager.getConnection(DBconfig.URL,DBconfig.USER,DBconfig.PASSWORD);return connection;}
}

3.調用連接并測試查詢語句

public class TestConnection {public static void main(String[] args) throws SQLException {//調用連接方法ConnectionHelp.getCon();String sql = "select * from pets where id = ?";PreparedStatement preparedStatement = ConnectionHelp.getCon().prepareStatement(sql);preparedStatement.setInt(1,1);ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()){String name = resultSet.getString("name");String species = resultSet.getString("species");int age = resultSet.getInt("age");System.out.println("姓名:"+name + " \t種類:" + species + " \t年齡:" + age);}}
}

1.3 使用properties文件獲取連接

? properties文件是一個文本文件,用key=value這樣的方法進行保存數據,由于不需要編譯,所以在idea中,要放入到資源文件夾(scr/main/resources)中。

1.創建config.properties配置文件

driverName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/pet_management?useSSL=false&serverTimezone=UTC
username=root
userpass=226774

2.創建鏈接工具類

 private static  String driverName;private static  String url;private static  String userName;private static  String userPass;static{InputStream in = ConnectionHelp2.class.getResourceAsStream("/conf.properties");Properties prop = new Properties();try {prop.load(in);driverName = prop.getProperty("driverName");url = prop.getProperty("url");userName = prop.getProperty("username");userPass = prop.getProperty("userpass");Class.forName(driverName);} catch (Exception e) {throw new RuntimeException(e);}}private ConnectionHelp2(){}public static Connection getCon() throws SQLException {Connection connection = DriverManager.getConnection(url,userName,userPass);return connection;}

3.調用連接并測試

此處與方法2相同,不同的是連接工具類的差異,以及調用時使用的連接工具類不同ConnectionHelp2.getCon();

public static void main(String[] args) throws SQLException {ConnectionHelp2.getCon();String sql = "select * from pets where id = ?";PreparedStatement preparedStatement = ConnectionHelp2.getCon().prepareStatement(sql);preparedStatement.setInt(1,1);ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()){String name = resultSet.getString("name");String species = resultSet.getString("species");int age = resultSet.getInt("age");System.out.println("姓名:"+name + " \t種類:" + species + " \t年齡:" + age);}}

4.擴展:使用第三方組件讀取properties文件

第三方組件:非java的jdk提供的標準類,由非官方提供的類功能包

建議看一個第三方包,國產組件:hutool,指南位置:https://plus.hutool.cn/pages/index/

使用第三方組件的標準流程

1.要根據官網/maven依賴查詢網址,把組件依賴添加到項目中

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.35</version></dependency>

2.使用hutool進行數據庫連接的方法

Props props = new Props("conf.properties");
System.out.println(props.getStr("driverName"));Props props = new Props("conf.properties");// 從屬性文件中獲取屬性String driver = props.getStr("driverName");String url = props.getProperty("url");String user = props.getProperty("username");String pass = props.getProperty("userpass");// 加載驅動Class.forName(driver);//創建與數據庫的連接Connection connection = DriverManager.getConnection(url,user,pass);

1.4 使用數據庫連接池

1.什么是連接池

連接池(Connection Pool)是一種用于管理數據庫連接的技術。它的核心思想是預先創建并維護一組數據庫連接,當應用程序需要與數據庫交互時,從連接池中獲取一個連接,使用完畢后將連接歸還給連接池,而不是每次都創建新的連接或關閉連接。

2.為什么使用連接池

在傳統的數據庫連接方式中,每次與數據庫交互時都需要創建新的連接,使用完畢后關閉連接。這種方式存在以下問題:

  • 性能開銷大:創建和關閉數據庫連接是非常耗時的操作,頻繁地創建和關閉連接會嚴重影響系統性能。

  • 資源浪費:數據庫連接是有限的資源,頻繁創建和關閉連接會導致資源浪費,甚至可能導致數據庫連接耗盡。

  • 難以管理:在高并發場景下,頻繁創建和關閉連接會導致數據庫連接數激增,增加數據庫的負擔。

連接池通過復用數據庫連接,解決了上述問題:

  • 減少創建和關閉連接的開銷:連接池中的連接是預先創建好的,應用程序直接從連接池中獲取連接,使用完畢后歸還,避免了頻繁創建和關閉連接的開銷。

  • 提高資源利用率:連接池中的連接可以被多個請求復用,減少了資源浪費。

  • 控制連接數:連接池可以限制最大連接數,避免數據庫連接數過多導致數據庫崩潰。

3.如何理解連接池

可以將連接池類比為“共享單車”:

1.連接池:就像一個共享單車停放點,里面停放著一定數量的單車(數據庫連接)。

2.應用程序:就像需要使用單車的人。

3.獲取連接:當應用程序需要與數據庫交互時,從連接池中“借”一輛單車(獲取一個連接)。

4.使用連接:應用程序使用這個連接與數據庫交互。

5.歸還連接:使用完畢后,應用程序將連接“歸還”給連接池,而不是銷毀它。

通過這種方式,連接池實現了連接的復用,避免了頻繁創建和關閉連接的開銷。

4.使用druid連接池的步驟

步驟一:下載依賴

 <!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>

步驟二:編寫配置文件,注意根據本地的配置進行修改

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/pet_management
username=root
password=226774
InitialSize=5
MaxActive=20
MaxWait=3000

步驟三:把配置文件導入到連接池類中

public static DataSource dataSource;static {Props props = new Props("druid.properties");try {dataSource = DruidDataSourceFactory.createDataSource(props);} catch (Exception e) {throw new RuntimeException(e);}}public static Connection getCon() throws SQLException {return dataSource.getConnection();}

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

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

相關文章

如何使用Spring boot框架實現圖書管理系統

使用 Spring Boot 框架實現圖書管理系統可以按照以下步驟進行&#xff0c;涵蓋了從項目搭建、數據庫設計、后端接口開發到前端頁面展示的整個流程。 1. 項目搭建 可以使用 Spring Initializr&#xff08;https://start.spring.io/ &#xff09;來快速創建一個 Spring Boot 項目…

【網絡安全 | 漏洞挖掘】賬戶接管+PII+原漏洞繞過

文章目錄 前言正文前言 本文涉及的所有漏洞測試共耗時約三周,成果如下: 訪問管理面板,成功接管目標列出的3000多家公司。 獲取所有員工的真實指紋、機密文件及個人身份信息(PII)。 繞過KYC認證,成功接管電話號碼。 繞過此前發現的漏洞。 正文 在測試目標時,我發現了一…

深度學習學習筆記(34周)

目錄 摘要 Abstracts 簡介 Hourglass Module&#xff08;Hourglass 模塊&#xff09; 網絡結構 Intermediate Supervision&#xff08;中間監督&#xff09; 訓練過程細節 評測結果 摘要 本周閱讀了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…

JVM類文件結構深度解析:跨平臺基石與字節碼探秘

目錄 一、類文件&#xff1a;Java生態的通用語言 1.1 字節碼的橋梁作用 1.2 類文件核心優勢 二、類文件二進制結構剖析 2.1 整體結構布局 2.2 魔數與版本控制 2.3 常量池&#xff1a;類文件的資源倉庫 2.4 訪問標志位解析 三、核心數據結構詳解 3.1 方法表結構 3.2 …

wps中zotero插件消失,解決每次都需要重新開問題

參考 查看zotero目錄 D:\zotero\integration\word-for-windows 加載項點擊 dotm即可 長期解決 把dom 復制到 C:\Users\89735\AppData\Roaming\kingsoft\office6\templates\wps\zh_CN還是每次都需要重新開的話 重新加載一下

如何設計合理的樹狀結構表:平衡查詢效率與維護效率

樹狀結構廣泛應用于數據建模中&#xff0c;例如 商品分類、組織架構、權限管理 等場景。合理設計樹形結構的數據庫表&#xff0c;能夠有效提升 查詢效率 和 維護效率。本文將探討如何在設計時平衡這兩者&#xff0c;詳細介紹常用的幾種樹狀結構存儲方式及其適用場景。 一、樹狀…

List 接口中的 sort 和 forEach 方法

List 接口中的 sort 和 forEach 方法是 Java 8 引入的兩個非常實用的函數&#xff0c;分別用于 排序 和 遍歷 列表中的元素。以下是它們的詳細介紹和用法&#xff1a; sort 函數 功能 對列表中的元素進行排序。 默認使用自然順序&#xff08;如數字從小到大&#xff0c;字符…

深度學習驅動的車牌識別:技術演進與未來挑戰

一、引言 1.1 研究背景 在當今社會&#xff0c;智能交通系統的發展日益重要&#xff0c;而車牌識別作為其關鍵組成部分&#xff0c;發揮著至關重要的作用。車牌識別技術廣泛應用于交通管理、停車場管理、安防監控等領域。在交通管理中&#xff0c;它可以用于車輛識別、交通違…

GitCode 助力至善云學:構建智慧教育平臺

項目倉庫&#xff1a; 前端&#xff1a;https://gitcode.com/Fer_Amiya/vue-ZhiShanYunXue-Client 后端&#xff1a;https://gitcode.com/Fer_Amiya/go-ZhiShanYunXue-Server 突破傳統教學困境&#xff0c;探索教育新解法 傳統教學的習題講評環節&#xff0c;教師面臨著難以…

系統架構設計師備考策略

一、備考痛點 系統架構設計師考試以 知識體系龐雜、實踐性強 著稱&#xff0c;官方教材《系統架構設計師教程&#xff08;第2版&#xff09;》厚達 700 余頁&#xff0c;若盲目通讀耗時費力。根據近三年考情分析&#xff0c;“抓重點 分層突破 實戰輸出” 是高效通關的核心策…

nnUNet V2修改網絡——加入MultiResBlock模塊

更換前,要用nnUNet V2跑通所用數據集,證明nnUNet V2、數據集、運行環境等沒有問題 閱讀nnU-Net V2 的 U-Net結構,初步了解要修改的網絡,知己知彼,修改起來才能游刃有余。 MultiRes Block 是 MultiResUNet 中核心組件之一,旨在解決傳統 U-Net 在處理多尺度醫學圖像時的局…

verilog基礎知識

一,Verilog和VHDL區別 全世界高層次數字系統設計領域中,應用Verilog和VHDL的比率是80%和20%;這兩種語言都是用于數字電路系統設計的硬件描述語言, 而且都已經是 IEEE 的標準。 VHDL 是美國軍方組織開發的,VHDL1987年成為標準;Verilog 是由一個公司的私有財產轉化而來,…

HarmonyOS 開發套件 介紹——下篇

HarmonyOS 開發套件 介紹——下篇 在HarmonyOS的生態中&#xff0c;開發套件作為支撐整個系統發展的基石&#xff0c;為開發者提供了豐富而強大的工具和服務。本文將深入繼續介紹HarmonyOS SDK、ArkCompiler、DevEco Testing、AppGallery等核心組件&#xff0c;幫助開發者全面掌…

小懌學習日記(七) | Unreal引擎燈光架構

燈光的布局對于HMI場景中車模的展示效果有著舉足輕重的地位。本篇內容將簡單介紹ES3.1的相關知識&#xff0c;再深入了解Unreal引擎中車模的燈光以及燈光架構。 一、關于ES3.1 1.1 什么是ES3.1 ES3.1這個概念對于美術的同學可能比較陌生&#xff0c;ES3.1指的是OpenGL ES3.1&…

【洛谷排序算法】P1012拼數-詳細講解

這道題本質上是通過確定數字的拼接順序來得到最大拼接數&#xff0c;雖然主要思路是利用字符串及其比較規則來實現&#xff0c;但也可以基于數組結合一些轉換操作來解決&#xff0c;以下是大致思路和代碼示例&#xff1a; 【算法思路】 首先將輸入的數字存儲在數組中。然后自…

2025前端框架最新組件解析與實戰技巧:Vue與React的革新之路

作者&#xff1a;飛天大河豚 引言 2025年的前端開發領域&#xff0c;Vue與React依然是開發者最青睞的框架。隨著Vue 3的全面普及和React 18的持續優化&#xff0c;兩大框架在組件化開發、性能優化、工程化支持等方面均有顯著突破。本文將從最新組件特性、使用場景和編碼技巧三…

基于YOLO11深度學習的運動鞋品牌檢測與識別系統【python源碼+Pyqt5界面+數據集+訓練代碼】

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

Docker 部署AnythingLLM

兩個指令搞定 1.下載鏡像 docker pull mintplexlabs/anythingllm 2.運行容器 export STORAGE_LOCATION$HOME/anythingllm mkdir -p $STORAGE_LOCATION chmod -R 777 $STORAGE_LOCATION touch "$STORAGE_LOCATION/.env" docker run -d -p 3001:3001 \ --cap-add SY…

java開發——為什么要使用動態代理?

舉個例子&#xff1a;假如有一個殺手專殺男的&#xff0c;不殺女的。代碼如下&#xff1a; public interface Killer {void kill(String name, String sex);void watch(String name); }public class ManKiller implements Killer {Overridepublic void kill(String name, Stri…

Moonshot AI 新突破:MoBA 為大語言模型長文本處理提效論文速讀

前言 在自然語言處理領域&#xff0c;隨著大語言模型&#xff08;LLMs&#xff09;不斷拓展其閱讀、理解和生成文本的能力&#xff0c;如何高效處理長文本成為一項關鍵挑戰。近日&#xff0c;Moonshot AI Research 聯合清華大學、浙江大學的研究人員提出了一種創新方法 —— 混…