Java JDBC的初步了解

文章目錄

    • 基本流程
    • 注冊驅動的兩種方法
    • DriverManager
      • DriverManager 的核心作用
      • 核心原理
      • 自動注冊驅動的機制
      • 關鍵方法
    • 示例代碼: 連接Mysql數據庫
      • Statement
      • PreparedStatement

JDBC全稱Java DataBase Connectivity。

定義: JDBC 是 Java 語言中用于連接和執行 SQL 操作的標準接口。

功能: 提供統一的方式訪問關系型數據庫(如 MySQL、Oracle、PostgreSQL 等)。

核心包: java.sql 和 javax.sql。

基本流程

  1. 加載并注冊驅動
  2. 建立數據庫連接
  3. 創建 Statement 對象
  4. 執行sql語句
  5. 處理結果集 (ResultSet)
  6. 釋放資源 (直接close)

注冊驅動的兩種方法

以mysql為例

第一種:

DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
  • 手動創建一個驅動實例,并顯式注冊到 DriverManager
  • DriverManager 會將這個驅動添加到它的驅動列表中,以便后續用 getConnection() 建立數據庫連接。

第二種(推薦)

Class.forName("com.mysql.cj.jdbc.Driver")
  • 利用 Java 的反射機制加載這個類,并執行它的靜態代碼塊
  • com.mysql.cj.jdbc.Driver 的靜態代碼塊中已經調用了
DriverManager.registerDriver(new Driver());
所以自動完成了驅動注冊。  

DriverManager

DriverManager 是 Java JDBC(Java Database Connectivity)API 的核心類之一,它負責管理數據庫驅動并協調應用程序與數據庫之間的連接。

DriverManager 的核心作用

功能說明
驅動注冊接受驅動類注冊(DriverManager.registerDriver()
驅動管理內部維護一個已注冊驅動的列表
獲取連接通過 getConnection() 方法,找到能處理特定 JDBC URL 的驅動并返回連接

核心原理

驅動注冊機制

  • JDBC 驅動類實現了 java.sql.Driver 接口
  • 驅動類的靜態代碼塊中通常會調用:
DriverManager.registerDriver(new Driver());

這就把該驅動對象注冊到 DriverManager 的內部驅動列表中。

  • 也可以手動注冊:
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());

驅動列表

  • DriverManager 內部維護了一個 List<Driver>,用于存儲所有注冊的 JDBC 驅動
  • 這個列表是線程安全的(使用了同步機制)

獲取連接

getConnection() 的調用

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "pass");

執行流程如下:

    1. 遍歷內部注冊的驅動列表
    2. 每個驅動調用 acceptsURL(url) 判斷是否支持這個 URL
    3. 找到支持的驅動后,調用它的 connect() 方法返回一個 Connection 對象
    4. 如果沒有任何驅動支持這個 URL,會拋出 SQLException

自動注冊驅動的機制

從 JDBC 4.0 開始(Java 6 起),支持SPI 自動注冊機制

  • 驅動 JAR 包中包含 META-INF/services/java.sql.Driver 文件
  • 文件內容為驅動的全限定類名,如:com.mysql.cj.jdbc.Driver
  • 當類加載器加載驅動 jar 時,JDK 會自動加載并注冊驅動類,無需顯式寫 Class.forName(...)

所以可以直接寫:

Connection conn = DriverManager.getConnection(...);

關鍵方法

方法說明
getConnection(String url, String user, String password)根據 URL、用戶名、密碼獲取數據庫連接
getDrivers()獲取當前已注冊的所有驅動
registerDriver(Driver driver)手動注冊驅動(通常不需要直接調用)
deregisterDriver(Driver driver)從注冊列表中移除驅動
getDrivers()獲取所有已注冊的驅動實例
setLogWriter(PrintWriter)設置日志輸出流
setLoginTimeout(int seconds)設置連接超時時間

示例代碼: 連接Mysql數據庫

package JDBC;import java.sql.*;public class demo1 {public static void main(String[] args) {String url="jdbc:mysql://localhost:3307/test";String user="root";String password="root";try{//1.加載驅動Class.forName("com.mysql.cj.jdbc.Driver");//2.建立連接Connection conn= DriverManager.getConnection(url,user,password);//3.創建StatementStatement stmt = conn.createStatement();//4.執行sql語句ResultSet rs = stmt.executeQuery("select * from users");//5.處理結果集while(rs.next()){String username = rs.getString("user");//列名的方式String pass = rs.getString(2);//列下標的方式System.out.println("username:"+username+" password:"+pass);}//6.關閉資源rs.close();stmt.close();conn.close();}catch (Exception e){e.printStackTrace();System.out.println(e.getMessage());}}
}

在這里插入圖片描述

Statement

Statement sql語句的主要操作函數有三個

executeQuery() //執行select查詢語句
executrupdate() //可以執行insert,update,delect,CREATE 之類的
execute() //執行任意語句

PreparedStatement

PreparedStatement其sql語句是在其獲取命令執行對象時就以及寫入了預編譯語句。其要進行sql執行只要對其參數進行傳入即可

PreparedStatement pstmt = conn.prepareStatement("select * from users where user=?");
pstmt.setString(1,"xpw");
ResultSet rs2 = pstmt.executeQuery();
rs2.next();
System.out.println("預編譯查詢\t用戶名:"+rs2.getString("user")+" 密碼:"+rs2.getString("password"));//預編譯查詢	用戶名:xpw 密碼:123

需要注意的是所得到的ResultSet類的實例,其初始的索引是不在第一行的,我們想獲取內容需要先使用next使得索引內移

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

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

相關文章

[netty5: ChunkedInput ChunkedWriteHandler]-源碼分析

ChunkedInput ChunkedInput<B> 是 Netty 中用于按塊讀取不定長數據流的接口&#xff0c;常配合 ChunkedWriteHandler 實現流式寫入&#xff0c;支持如文件、流、HTTP 和 WebSocket 等多種數據源。 實現類簡要說明ChunkedFile用于將常規文件按塊傳輸&#xff08;使用傳統…

QT 第十二講 --- 控件篇 LineEdit,TextEdit與ComboBox

前言&#xff1a;歡迎進入 QT 控件世界的第十二講&#xff01;在上一講《QT 第十一講 --- 控件篇 LCDnumber&#xff0c;ProgressBar與CalenderWidget》中&#xff0c;我們探索了用于信息展示和狀態反饋的控件&#xff1a;精準的數字顯示器 LCD Number、直觀的進度指示器 Progr…

VSCode遇到的一些小毛病(自動保存、運行后光標不再處于編輯區)

1. 右鍵點擊Run Code沒有觸發自動保存 1. 打開 VS Code 設置&#xff08;Ctrl ,&#xff09; 2. 搜索&#xff1a;code runner save 3. 勾選你需要的 2. 運行后光標仍然處于編輯區&#xff08;容易誤輸入&#xff09; 1. 打開 VS Code 設置&#xff08;Ctrl ,&#xff09; 2.…

Maixcam的使用2

1.單文件和項目&#xff08;多個 py 文件項目/模塊化&#xff09;# 在編寫代碼時&#xff0c;一般兩種模式&#xff0c;執行單個文件&#xff0c;或者執行一個完成項目&#xff08;包含多個 py 文件或者其它資源文件&#xff09;。 單文件模式&#xff1a;MaixVision 創建或者…

征信系統架構思想:打造商業信任基石_東方仙盟—仙盟創夢IDE

一、建設必要性在復雜的商業環境中&#xff0c;企業面臨多元交易對象與業務場景&#xff0c;準確評估合作方信用狀況及潛在價值的難度顯著增加。傳統經驗判斷和簡單背景調查存在局限性&#xff0c;難以滿足現代商業決策需求&#xff0c;因此構建科學的征信體系具有現實必要性。…

網安-XSS-pikachu

介紹 XSS&#xff0c;即跨站腳本攻擊&#xff0c;是指攻擊者利用Web服務器中的代碼漏洞&#xff0c;在頁面中嵌入客戶端腳本&#xff08;通常是一段由JavaScript編寫的惡意代碼&#xff09;&#xff0c;當信任此Web服務器的用戶訪問 Web站點中含有惡意腳本代碼的頁面&#xff…

算法入門——字典樹(C++實現詳解)

字典樹&#xff08;Trie&#xff09;是處理字符串匹配的高效數據結構&#xff0c;廣泛應用于搜索提示、拼寫檢查等場景。本文將帶你從零掌握字典樹的原理與實現&#xff01; 一、什么是字典樹&#xff1f; 字典樹&#xff08;Trie&#xff09;是一種樹形數據結構&#xff0c;…

SpringBoot整合SpringCache緩存

SpringBoot整合SpringCache使用緩存 文章目錄SpringBoot整合SpringCache使用緩存1.介紹2.SpringBoot整合1.導入xml依賴2.配置yml3.使用EnableCaching啟用SpringCache4.Cacheable5.CachePut6.CacheEvict7. Caching8.CacheConfig3.其他屬性配置1.keyGenerator 屬性2. cacheManage…

WPF學習筆記(20)Button與控件模板

Button與控件模板一、 Button默認控件模板詳解二、自定義按鈕模板一、 Button默認控件模板詳解 WPF 中的大多數控件都有默認的控件模板。 這些模板定義了控件的默認外觀和行為&#xff0c;包括控件的布局、背景、前景、邊框、內容等。 官方文檔&#xff1a;https://learn.mic…

藍天居士自傳(1)

藍天居士何許人&#xff1f; 藍天居士是我的筆名&#xff0c;也可以說是號。就好像李白號青蓮居士、歐陽修號六一居士一樣。筆者本名彭昊 —— 一個有不少重名重姓者的名字。 筆者小的時候上語文課&#xff0c;無論是小學、初中抑或是高中&#xff0c;都會有魯迅&#xff08;…

短劇系統開發定制全流程解析:從需求分析到上線的專業指南

一、短劇行業數字化趨勢與系統開發必要性在短視頻內容爆發式增長的時代背景下&#xff0c;短劇作為一種新興的內容形式正在迅速崛起。數據顯示&#xff0c;2023年中國短劇市場規模已突破300億元&#xff0c;用戶規模達到4.5億&#xff0c;年增長率超過200%。這一迅猛發展的市場…

getBoundingClientRect() 詳解:精準獲取元素位置和尺寸

getBoundingClientRect() 是 JavaScript 中一個強大的 DOM API&#xff0c;用于獲取元素在視口中的精確位置和尺寸信息。它返回一個 DOMRect 對象&#xff0c;包含元素的坐標、寬度和高度等關鍵幾何信息。 基本用法 const element document.getElementById(myElement); cons…

EXCEL 基礎技巧

來源&#xff1a;WPS 官網 初步了解WPS表格-WPS學堂https://www.wps.cn/learning/course/detail/id/635.html 1、格式刷 1.1使用格式刷隔行填充顏色。 首先設置部分表格顏色&#xff0c;選中此區域&#xff0c;雙擊點擊格式刷&#xff0c;然后選中其他表格區域。 這樣就可以…

【RK3568 編譯rtl8723DU驅動】

RK3568 編譯rtl8723DU驅動 編譯源碼1.解壓rtl8723du2.修改Makefile 驗證1.加載模塊2.開啟wifi 在驅動開發中&#xff0c;驅動的編譯與集成是實現設備功能的關鍵環節。本文聚焦于基于 RK3568 處理器平臺編譯 RTL8723DU WiFi/BT 二合一模塊驅動的完整流程&#xff0c;涵蓋源碼編譯…

基于Simulink的二關節機器人獨立PD控制仿真

文章目錄 理論模型仿真窗口控制函數目標函數仿真 本文是劉金琨. 機器人控制系統的設計與MATLAB仿真的學習筆記。 理論模型 對于二關節機器人系統&#xff0c;其動力學模型為 D ( q ) q C ( q , q ˙ ) q ˙ r D(q)\ddot qC(q,\dot q)\dot q r D(q)q?C(q,q˙?)q˙?r 式…

【技術架構解析】國產化雙復旦微FPGA+飛騰D2000核心板架構

本文就一款基于飛騰D2000核心板與兩片高性能FPGA的國產化開發主板進行技術解析&#xff0c;包括系統架構、主要硬件模塊、關鍵接口及軟件環境&#xff0c;重點闡述各子系統間的數據路徑與協同工作方式&#xff0c;旨在為行業內同類產品設計與應用提供參考。 隨著國產化要求的加…

Python 數據分析:計算,分組統計1,df.groupby()。聽故事學知識點怎么這么容易?

目錄1 示例代碼2 歡迎糾錯3 論文寫作/Python 學習智能體1 示例代碼 直接上代碼。 def grpby1():xls "book.xls"df pd.DataFrame(pd.read_excel(xls, engine"xlrd"))print(df)"""序號 分類 銷量0 1 文學 51 2 計算機…

【解決“此擴展可能損壞”】Edge瀏覽器(chrome系列通殺))擴展損壞?一招保留數據快速修復

引言 如果你想保留你的數據&#xff0c;敲重點&#xff1a;不要點擊修復&#xff0c;不要修復&#xff0c;不要修復 在使用 Microsoft Edge 瀏覽器時&#xff0c;您可能會遇到擴展程序顯示“此擴展程序可能已損壞”的提示&#xff0c;且啟用按鈕無法點擊。這一問題讓許多用戶感…

AI專業化應用加速落地,安全治理挑戰同步凸顯

7月2日&#xff0c;2025全球數字經濟大會在北京國家會議中心開幕。本屆大會以“建設數字友好城市”為主題&#xff0c;聚焦數字技術對城市發展的影響。開幕式上&#xff0c;一首完全由AI生成的MV成為焦點——從歌詞、譜曲、演唱到視頻制作全流程AI生成&#xff0c;展現人工智能…

Python統一調用多家大模型API指南

隨著大模型技術的快速發展&#xff0c;市場上出現了越來越多的LLM服務提供商&#xff0c;包括OpenAI、Anthropic、Google、百度、阿里云等。作為開發者&#xff0c;我們經常需要在不同的模型之間切換&#xff0c;或者同時使用多個模型來滿足不同的業務需求。本文將詳細介紹如何…