JDBC教程,2025版最新講解.超詳細入門教程

以下內容全面詳盡地梳理了 JDBC (Java Database Connectivity)的核心知識點,并在關鍵環節配以示例代碼。若要快速定位,可先查看下方結構:

  1. JDBC 概覽
  2. 驅動加載與注冊
  3. 獲取數據庫連接
  4. 執行 SQL(Statement、PreparedStatement、CallableStatement)
  5. 處理結果集(ResultSet)
  6. 批量操作與批處理
  7. 事務管理
  8. 元數據操作(DatabaseMetaData、ResultSetMetaData)
  9. 異常處理
  10. 連接池與 DataSource
  11. 最佳實踐與性能優化

1. JDBC 概覽

  • 用途:提供 Java 程序訪問各種關系型數據庫(MySQL、Oracle、PostgreSQL 等)的統一 API。
  • 核心接口包java.sql.*
  • 主要角色
    • DriverManager/Driver:驅動注冊、連接分發
    • Connection:管理會話、事務
    • Statement/PreparedStatement/CallableStatement:執行 SQL
    • ResultSet:承載查詢結果
    • DataSource:替代 DriverManager 的連接獲取方式(可集成連接池)

執行過程可總結為:

  1. 驅動加載(現在可以省略)
  2. 獲取數據庫連接
  3. 定義要執行的sql語句
  4. 獲取執行對象
  5. 執行對象執行sql語句,獲取返回結果
  6. 后續處理

2. 驅動加載與注冊

2.1 自動注冊(JDBC 4.0+)

只要在 classpath 中包含相應數據庫的 JDBC 驅動(如 mysql-connector-java.jar),Driver 會通過 SPI 自動注冊,無需顯式調用。

// 不需要 Class.forName(...),直接拿連接即可
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb", "root", "password");

2.2 手動加載(向后兼容)

Class.forName("com.mysql.cj.jdbc.Driver");
// 或者老版本
// Class.forName("com.mysql.jdbc.Driver");

3. 獲取數據庫連接

String url      = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
String user     = "root";
String password = "password";try (Connection conn = DriverManager.getConnection(url, user, password)) {// 使用 conn 
} catch (SQLException e) {e.printStackTrace();
}
  • 常用參數
    • useSSL=false:禁用 SSL
    • serverTimezone=UTC:指定時區
    • autoReconnect=true:自動重連

當然可以,以下是重新整理并擴充后的第4部分內容,加入了 SQL 注入的講解,并對 Statement 的兩個方法做了深入分析,保持原有結構和風格:


4. 獲取執行 SQL 對象,Cnn 獲取

在 JDBC 中,獲取數據庫連接后,我們需要通過執行 SQL 語句與數據庫交互,這一過程通常通過以下三種執行對象實現:

  • Statement:用于執行靜態 SQL 語句(不帶參數),簡單但易受 SQL 注入攻擊;
  • PreparedStatement:預編譯 SQL 語句,支持參數綁定,性能更優、安全性更高;

Statement 的核心方法:

int executeUpdate(String sql)
  • 執行 DML(INSERT、UPDATE、DELETE)DDL(CREATE、DROP)
  • 返回值為 受影響的行數,若為 DDL,通常返回 0(不代表失敗)。
ResultSet executeQuery(String sql)
  • 執行 DQL(SELECT)語句,返回查詢結果集 ResultSet

關于 SQL 注入(SQL Injection)

SQL 注入是一種嚴重的安全漏洞,攻擊者可以通過拼接惡意 SQL 來操控數據庫。例如:

String name = "' OR '1'='1";
String sql = "SELECT * FROM user WHERE name = '" + name + "'";

構造出的 SQL 實際是:

SELECT * FROM user WHERE name = '' OR '1'='1'

where后面的結果將永遠是真的,所以就可以永遠的查詢出來.
將返回所有用戶數據,甚至可用于刪除表結構,極其危險!


4.1 Statement(不預編譯,易受 SQL 注入)

String name = "張三";
String sql = "SELECT id, name FROM user WHERE name = '" + name + "'";
try (Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql)
) {while (rs.next()) {System.out.println(rs.getInt("id") + ": " + rs.getString("name"));}
}

優點:簡單,適合一次性、非常簡單的 SQL;
缺點:拼接字符串,極易受 SQL 注入攻擊不能復用或預編譯,性能差。


4.2 PreparedStatement(預編譯,防注入、性能更優)

String sql = "SELECT id, name FROM user WHERE name = ? AND age > ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, "張三");pstmt.setInt(2, 18);try (ResultSet rs = pstmt.executeQuery()) {while (rs.next()) {System.out.println(rs.getInt("id") + ": " + rs.getString("name"));}}
}

優點:

  • 使用 占位符 ? 實現參數綁定,不拼接字符串,有效防止 SQL 注入
  • SQL 會被 預編譯并緩存,適合多次執行,提高效率
  • 自動轉義字符串,避免因特殊字符出錯

缺點:相比 Statement 書寫稍復雜,不適合拼接動態結構的 SQL(如條件列名)。


Statement vs PreparedStatement 詳細對比

特性StatementPreparedStatement
SQL 預編譯是(可緩存執行計劃)
防 SQL 注入能力差(需要手動拼接字符串)強(使用參數綁定)
性能(重復執行場景)差(每次都解析)優(執行計劃可復用)
可讀性與維護性差(大量拼接容易混亂)高(結構清晰,安全)
支持占位符 ?
使用場景簡單、臨時查詢正式項目、復雜參數、安全性要求高場合

5. 處理結果集(ResultSet)

  • 指針導航.next(), .first(), .last(), .absolute(n)(需指定 TYPE_SCROLL)
  • 獲取列值getInt(), getString(), getDate()
  • 按列名或列索引
  • 類型轉換注意:避免隱式類型轉換帶來的性能/精度問題
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {int    id   = rs.getInt(1);String name = rs.getString("name");Date   dob  = rs.getDate("dob");// ...
}

6. 批量操作與批處理

批量執行可顯著提升大量插入/更新的性能。

String sql = "INSERT INTO user(name, age) VALUES(?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {conn.setAutoCommit(false);  // 關閉自動提交for (int i = 1; i <= 1000; i++) {pstmt.setString(1, "User" + i);pstmt.setInt(2, 20 + (i % 30));pstmt.addBatch();if (i % 200 == 0) {pstmt.executeBatch();conn.commit();  // 分批提交}}// 提交剩余pstmt.executeBatch();conn.commit();
}

7. 事務管理Cnn對象負責管理

try {conn.setAutoCommit(false);  // 開啟事務// 操作1// 操作2// ...conn.commit();              // 提交事務
} catch (SQLException e) {conn.rollback();            // 回滾事務
} finally {conn.setAutoCommit(true);   // 恢復默認
}
  • 隔離級別conn.setTransactionIsolation(...)
  • 保存點Savepoint sp = conn.setSavepoint("sp1"); conn.rollback(sp);

8. 元數據操作

8.1 DatabaseMetaData

DatabaseMetaData dbMeta = conn.getMetaData();
System.out.println("Database product: " + dbMeta.getDatabaseProductName());
System.out.println("Driver version: " + dbMeta.getDriverVersion());

8.2 ResultSetMetaData

ResultSetMetaData rsMeta = rs.getMetaData();
int columnCount = rsMeta.getColumnCount();
for (int i = 1; i <= columnCount; i++) {System.out.println("Column " + i + ": " + rsMeta.getColumnName(i)+ " (" + rsMeta.getColumnTypeName(i) + ")");
}

9. 異常處理

  • SQLException
    • .getErrorCode():數據庫錯誤碼
    • .getSQLState():標準 SQLState
  • 資源釋放:強烈推薦使用 try-with-resources 自動關閉 ConnectionStatementResultSet
try (Connection conn =;PreparedStatement pstmt = conn.prepareStatement(...);ResultSet rs = pstmt.executeQuery();
) {// ...
} catch (SQLException e) {System.err.println("Error Code: " + e.getErrorCode());System.err.println("SQL State : " + e.getSQLState());e.printStackTrace();
}

10. 連接池與 DataSource

10.1 為什么使用連接池

  • 連接創建開銷大
  • 重復使用可提升性能

10.2 常見連接池

  • HikariCP(高性能)
  • Apache DBCP
  • C3P0

10.3 DataSource 示例(HikariCP)

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/testdb");
config.setUsername("root");
config.setPassword("password");
config.setMaximumPoolSize(10);DataSource ds = new HikariDataSource(config);// 獲取連接
try (Connection conn = ds.getConnection()) {// ...
}

11. 最佳實踐與性能優化

  1. 使用 PreparedStatement 防止 SQL 注入、提升性能。
  2. 合理設置批量大小,避免長事務占用資源。
  3. 關閉不必要的自動提交,批量操作時手動管理事務。
  4. 使用連接池,避免頻繁創建銷毀連接。
  5. 定期監控慢查詢,并為頻繁訪問的字段添加索引。
  6. 盡量只查詢所需列,避免 SELECT *
  7. 及時關閉資源,防止連接泄漏(try-with-resources)。

IDEA調試總結:

更通俗、貼近實際編程操作的語言來重新解釋 IntelliJ IDEA 中調試時常用的快捷鍵,避免術語,讓你一看就懂:


IDEA 調試快捷鍵(簡單易懂版)

功能Windows / LinuxmacOS說明(通俗解釋)
啟動調試Shift + F9Control + D像運行程序一樣運行,但可以中途停下來看代碼狀態
停止調試Ctrl + F2Command + F2停掉整個程序
一步一步執行代碼(當前行)F8F8當前行執行完再停在下一行(如果是循環,就跳下一次)
進入方法體中去看具體執行F7F7如果當前行是一個函數調用,按它會跳進去函數里看細節
跳出當前方法返回上一層Shift + F8Shift + F8如果你已經進了方法里,按這個會回到調用這個方法的地方
執行到光標處停下Alt + F9Option + F9讓程序一直跑到你當前鼠標點的位置再停下(省得一直按F8)
繼續往下執行程序F9Command + Option + RF9程序繼續往下跑,直到遇到下一個斷點
設置或取消斷點Ctrl + F8Command + F8在代碼左邊點一下,紅點就是斷點,程序會在這里暫停

常用調試輔助操作

功能Windows / LinuxmacOS說明
查看某個變量的值鼠標懸停鼠標懸停把鼠標放在變量上面,就會顯示它當前的值
手動輸入表達式查看結果Alt + F8Option + F8彈出一個窗口,你可以輸入變量或表達式看結果,比如 a + b
查看所有斷點Ctrl + Shift + F8Command + Shift + F8可以集中管理所有斷點
快速查看變量內容Ctrl + Shift + ICommand + Shift + I不用跳轉,臨時查看變量內容

舉個簡單例子:

public class Demo {public static void main(String[] args) {int a = 10;int b = 20;int c = add(a, b);  // 👉 在這里打斷點System.out.println("結果是:" + c);}public static int add(int x, int y) {return x + y;}
}

如果你在 int c = add(a, b); 那一行打斷點:

  • Shift + F9 開始調試;
  • 程序會停在 add(a, b) 那一行;
  • F8,它會直接執行完這一行然后到下一行;
  • F7,它會跳進 add() 方法里面
  • 在方法中可以繼續按 F8 看一步步怎么返回結果;
  • 再按 Shift + F8 就可以返回到 main() 繼續調試;
  • 最后按 F9 可以直接讓程序跑完。

如果你還不熟練,可以先只記住這兩個:

  • 👉 F8一步一步往下執行
  • 👉 F7進入函數體里看看里面是怎么執行的

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

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

相關文章

PyTorch中nn.Module詳解和綜合代碼示例

在 PyTorch 中&#xff0c;nn.Module 是神經網絡中最核心的基類&#xff0c;用于構建所有模型。理解并熟練使用 nn.Module 是掌握 PyTorch 的關鍵。一、什么是 nn.Module nn.Module 是 PyTorch 中所有神經網絡模塊的基類。可以把它看作是“神經網絡的容器”&#xff0c;它封裝了…

深入解析三大Web安全威脅:文件上傳漏洞、SQL注入漏洞與WebShell

文章目錄文件上傳漏洞SQL注入漏洞WebShell三者的核心關聯&#xff1a;攻擊鏈閉環文件上傳漏洞 文件上傳漏洞&#xff08;File Upload Vulnerability&#xff09; 當Web應用允許用戶上傳文件但未實施充分的安全驗證時&#xff0c;攻擊者可上傳惡意文件&#xff08;如WebShell、…

【對比】群體智能優化算法 vs 貝葉斯優化

在機器學習、工程優化和科學計算中&#xff0c;優化算法的選擇直接影響問題求解的效率與效果。群體智能優化算法&#xff08;Swarm Intelligence, SI&#xff09;和貝葉斯優化&#xff08;Bayesian Optimization, BO&#xff09;是兩種截然不同的優化范式&#xff0c;分別以不同…

LLMs之Agent:ChatGPT Agent發布—統一代理系統將研究與行動無縫對接,開啟智能助理新時代

LLMs之Agent&#xff1a;ChatGPT Agent發布—統一代理系統將研究與行動無縫對接&#xff0c;開啟智能助理新時代 目錄 OpenAI重磅發布ChatGPT Agent—統一代理系統將研究與行動無縫對接&#xff0c;開啟智能助理新時代 第一部分&#xff1a;Operator 和深度研究的自然演進 第…

Linux726 raid0,raid1,raid5;raid 創建、保存、停止、刪除

RAID創建 創建raid0 安裝mdadm yum install mdadm mdadm --create /dev/md0 --raid-devices2 /dev/sdb5 /dev/sdb6 [rootsamba caozx26]# mdadm --create /dev/md0 --raid-devices2 /dev/sdb3 /dev/sdb5 --level0 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev…

深入剖析 MetaGPT 中的提示詞工程:WriteCode 動作的提示詞設計

今天&#xff0c;我想和大家分享關于 AI 提示詞工程的文章。提示詞&#xff08;Prompt&#xff09;是大型語言模型&#xff08;LLM&#xff09;生成高質量輸出的關鍵&#xff0c;而在像 MetaGPT 這樣的 AI 驅動軟件開發框架中&#xff0c;提示詞的設計直接決定了代碼生成的可靠…

關于 ESXi 中 “ExcelnstalledOnly 已禁用“ 的解決方案

第一步&#xff1a;使用ssh登錄esxi esxcli system settings advanced list -o /User/execInstalledOnly可能會得到以下內容 esxcli system settings advanced list -o /User/execInstalledOnlyPath: /User/ExecInstalledOnlyType: integerInt Value: 0Default Int Value: 1Min…

HTML5 Canvas 繪制圓弧效果

HTML5 Canvas 繪制圓弧效果 以下是一個使用HTML5 Canvas繪制圓弧的完整示例&#xff0c;你可以直接在瀏覽器中運行看到效果&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"view…

智能Agent場景實戰指南 Day 18:Agent決策樹與規劃能力

【智能Agent場景實戰指南 Day 18】Agent決策樹與規劃能力 開篇 歡迎來到"智能Agent場景實戰指南"系列的第18天&#xff01;今天我們將深入探討智能Agent的核心能力之一&#xff1a;決策樹與規劃能力。在現代業務場景中&#xff0c;Agent需要具備類似人類的決策能力…

AI 編程工具 Trae 重要的升級。。。

大家好&#xff0c;我是櫻木。 今天打開 Trae &#xff0c;已經看到它進行圖標升級&#xff0c;之前的圖標&#xff0c;國際和國內版本長得非常像&#xff0c;現在做了很明顯的區分&#xff0c;這點給 Trae 團隊點個贊。 自從 Claude 使出了壓力以來&#xff0c;Cursor 鎖區&…

排序算法,咕咕咕

1.選擇排序void selectsort(vector<int>& v) { for(int i0;i<v.size()-1;i) {int minii;for(int ji1;j<v.size();j){if(v[i]>v[j]){minij;}}if(mini!i)swap(v[i],v[mini]); } }2.堆排序void adjustdown(vector<int>& v,int root,int size) { int …

數據庫查詢系統——pyqt+python實現Excel內查課

一、引言 數據庫查詢系統處處存在&#xff0c;在教育信息化背景下&#xff0c;數據庫查詢技術更已深度融入教務管理場景。本系統采用輕量化架構&#xff0c;結合Excel課表&#xff0c;通過PythonPyQt5實現跨平臺桌面應用&#xff0c;以實現簡單查課效果。 二、GUI界面設計 使用…

base64魔改算法 | jsvmp日志分析并還原

前言 上一篇我們講了標準 base64 算法還原&#xff0c;為了進一步學習 base64 算法特點&#xff0c;本文將結合 jsvmp 日志&#xff0c;實戰還原出 base64 魔改算法。 為了方便大家學習&#xff0c;我將入參和上篇文章一樣&#xff0c;入參為 Hello, World!。 插樁 在js代碼中&…

vue3筆記(2)自用

目錄 一、作用域插槽 二、pinia的使用 一、Pinia 基本概念與用法 1. 安裝與初始化 2. 創建 Store 3. 在組件中使用 Store 4. 高級用法 5、storeToRefs 二、Pinia 與 Vuex 的主要區別 三、為什么選擇 Pinia&#xff1f; 三、定義全局指令 1.封裝通用 DOM 操作&#…

大模型面試回答,介紹項目

1. 模型準備與轉換&#xff08;PC端/服務器&#xff09;你先在PC上下載或訓練好大語言模型&#xff08;如HuggingFace格式&#xff09;。用RKLLM-Toolkit把模型轉換成瑞芯微NPU能用的專用格式&#xff08;.rkllm&#xff09;&#xff0c;并可選擇量化優化。把轉換好的模型文件拷…

Oracle 19.20未知BUG導致oraagent進程內存泄漏

故障現象查詢操作系統進程的使用排序&#xff0c;這里看到oraagent的物理內存達到16G&#xff0c;遠遠超過正常環境&#xff08;正常環境在19.20大概就是100M多一點&#xff09;[rootorastd tmp]# ./hmem|more PID NAME VIRT(kB) SHARED(kB) R…

嘗試幾道算法題,提升python編程思維

一、跳躍游戲題目描述&#xff1a; 給定一個非負整數數組 nums&#xff0c;你最初位于數組的第一個下標。數組中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最后一個下標。示例&#xff1a;輸入&#xff1a;nums [2,3,1,1,4] → 輸出&#xff1a;True輸入…

【菜狗處理臟數據】對很多個不同時間序列數據的文件聚類—20250722

目錄 具體做法 可視化方法1&#xff1a;PCA降維 可視化方法2、TSNE降維可視化&#xff08;非線性降維&#xff0c;更適合聚類&#xff09; 可視化方法3、輪廓系數評判好壞 每個文件有很多行列的信息&#xff0c;每列是一個駕駛相關的數據&#xff0c;需要對這些文件進行聚類…

Qwen-MT:翻得快,譯得巧

我們再向大家介紹一位新朋友&#xff1a;機器翻譯模型Qwen-MT。開發者朋友們可通過Qwen API&#xff08;qwen-mt-turbo&#xff09;&#xff0c;來直接體驗它又快又準的翻譯技能。 本次更新基于強大的 Qwen3 模型&#xff0c;進一步使用超大規模多語言和翻譯數據對模型進行訓練…

在 OceanBase 中,使用 TO_CHAR 函數 直接轉換日期格式,簡潔高效的解決方案

SQL語句SELECT TO_CHAR(TO_DATE(your_column, DD-MON-YY), YYYY-MM-DD) AS formatted_date FROM your_table;關鍵說明&#xff1a;核心函數&#xff1a;TO_DATE(30-三月-15, DD-MON-YY) → 將字符串轉為日期類型TO_CHAR(..., YYYY-MM-DD) → 格式化為 2015-03-30處理中文月份&a…