首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JDBC 技術架構與核心 API 完整介紹

     編輯:Java 相關知識

前言

JDBC (Java Database Connectivity) 是 Java 應用程式存取關聯式資料庫的標準 API。設計目標:提供**統一介面**、**資料庫獨立性**、**支援基本 SQL 功能**、建立在既有標準 (X/Open SQL CLI / ODBC) 之上、保持簡單與強型別。本文系統整理 JDBC 架構、核心介面、驅動類型、使用情境與安全性考量。

設計目標與哲學

  • SQL 階層 API:專注執行 SQL 語句與結果處理,高層 ORM (Hibernate, MyBatis) 建立在此之上。
  • 遵循 SQL 標準:要求驅動至少支援 ANSI SQL-2 Entry Level;允許傳遞資料庫專屬 SQL 擴充功能。
  • 建立在既有介面上:易於實作 JDBC-ODBC Bridge、原生驅動、中介軟體協定驅動。
  • 與 Java 風格一致:命名慣例、例外處理、集合介面風格統一。
  • 保持簡單:單一機制完成特定任務,避免重複 API。
  • 強型別:編譯期發現型別錯誤,必要時支援動態型別存取。
  • 常見任務簡單化:無參數查詢、單一結果集處理極簡單;複雜功能 (OUT 參數、大物件、多結果集) 亦可支援。
  • 功能對應獨立方法:而非旗標參數控制行為,降低學習曲線。

雙層架構

┌─────────────────────────────────────┐
│      應用程式 (Application)         │
│  使用 java.sql.* 介面 (JDBC API)    │
├─────────────────────────────────────┤
│      DriverManager                  │  ← 驅動管理、連線取得
├─────────────────────────────────────┤
│      JDBC Driver 介面 (SPI)         │  ← 廠商實作
│  Connection, Statement,             │
│  PreparedStatement, CallableStatement,│
│  ResultSet, DatabaseMetaData, ...   │
├─────────────────────────────────────┤
│      資料庫 (DBMS)                  │
└─────────────────────────────────────┘

核心介面 (java.sql.*)

介面職責關鍵方法
DriverManager驅動註冊、連線取得getConnection(url, props), registerDriver()
Connection資料庫會話、交易控制、元資料createStatement(), prepareStatement(), commit/rollback(), getMetaData()
Statement執行靜態 SQLexecuteQuery(), executeUpdate(), execute()
PreparedStatement預編譯參數化 SQL (防注入、效能)setXxx(index, val), executeUpdate/query()
CallableStatement呼叫預存程序 (OUT/INOUT 參數)registerOutParameter(), getXxx(index)
ResultSet結果集游標導航與資料提取next(), getXxx(colIndex/Name), absolute(), updateXxx()
DatabaseMetaData資料庫結構、能力、版本資訊getTables(), getColumns(), supportsTransactions()
ResultSetMetaData結果集欄位資訊getColumnCount(), getColumnLabel(), getColumnType()

四類 JDBC 驅動

類型名稱架構優點缺點
Type 1JDBC-ODBC BridgeJDBC → ODBC → DBMS支援所有有 ODBC 驅動的 DB需客戶端安裝 ODBC、效能差、JDK 8 移除
Type 2Native-APIJDBC → Native Client Lib → DBMS比 Type 1 快需安裝 Native Library、可攜性差
Type 3Network ProtocolJDBC → Middleware Server → DBMS純 Java 客戶端、支援多種 DB中介層複雜、效能有額外開銷
Type 4Thin / Pure JavaJDBC → DBMS Native Protocol (TCP)純 Java、無安裝、效能最佳、標準選擇各 DB 需專屬驅動

現代標準:Type 4 (如 MySQL Connector/J, PostgreSQL JDBC, Oracle JDBC Thin, Microsoft JDBC Driver for SQL Server)。

標準連線流程

// 1. 載入驅動 (JDBC 4.0+ SPI 自動載入,可省略)
Class.forName("com.mysql.cj.jdbc.Driver");

// 2. 建立連線
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
Connection conn = DriverManager.getConnection(url, "user", "pass");

// 3. 建立 Statement
try (Statement stmt = conn.createStatement()) {
    // 4. 執行查詢
    try (ResultSet rs = stmt.executeQuery("SELECT id, name FROM users")) {
        // 5. 處理結果
        while (rs.next()) {
            System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
        }
    }
} // 自動關閉 stmt, rs
// 6. 關閉連線 (或交由連線池管理)
conn.close();

PreparedStatement 參數化查詢 (必採用)

String sql = "SELECT * FROM users WHERE email = ? AND status = ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
    ps.setString(1, email);
    ps.setInt(2, 1);
    try (ResultSet rs = ps.executeQuery()) { /* ... */ }
}

優點:防 SQL 注入、查詢計畫重用、型別安全、可讀性。

交易控制

conn.setAutoCommit(false);
try {
    // 多條更新...
    conn.commit();
} catch (SQLException e) {
    conn.rollback();
    throw e;
} finally {
    conn.setAutoCommit(true);
}

大物件 (LOB) 處理

  • BLOB:ps.setBinaryStream(), rs.getBinaryStream()
  • CLOB:ps.setCharacterStream(), rs.getCharacterStream()
  • 大資料**務必使用串流**,避免記憶體溢位。

使用情境與安全性

情境特徵安全考量
Applet (舊)瀏覽器沙箱、不可信限制本地檔案/網路存取、只能連回來源主機
Application本地信任程式碼完整檔案/網路存取權限
Trusted Applet簽名驗證通過等同 Application 權限
三層架構Client → Middle Tier → DB中介層集中授權、連線池、稽核

驅動程式安全責任

  • 共享 TCP 連線時,必須對每個呼叫者檢查 SecurityManager.checkConnect(host, port)
  • 本地檔案存取檢查 checkRead/write()
  • JNI 原生驅動:假設最壞情況,拒絕不可信程式碼存取
  • JDBC-ODBC Bridge:驗證 DSN 來源主機匹配

元資料應用

DatabaseMetaData meta = conn.getMetaData();
System.out.println("DB: " + meta.getDatabaseProductName() + " " + meta.getDatabaseProductVersion());
System.out.println("Driver: " + meta.getDriverName() + " " + meta.getDriverVersion());

// 列出所有表
try (ResultSet tables = meta.getTables(null, null, "%", new String[]{"TABLE"})) {
    while (tables.next()) {
        System.out.println(tables.getString("TABLE_NAME"));
    }
}

現代最佳實務建議

  1. 使用連線池:HikariCP (預設 Spring Boot 2+)、Druid、DBCP2。絕不手動管理連線。
  2. JDBC 4.2+ 新特性:try-with-resources、getObject(Class<T>)、LocalDate/LocalDateTime 直接對應、executeLargeUpdate()。
  3. 參數化查詢 100%:杜絕字串拼接 SQL。
  4. 批次更新:ps.addBatch() + executeBatch() 大量寫入優化。
  5. 監控與調優:慢查詢日誌、連線池指標 (使用率、等待時間)、Statement 緩存命中率。

結語

JDBC 是 Java 資料存取的基石。掌握核心介面、驅動類型、連線池、交易控制、參數化查詢與安全性模型,是建構健壯、高效、安全資料庫應用的前提。現代開發多透過 Spring JDBC、MyBatis、JOOQ 等框架封裝 JDBC,但理解底層運作機制仍是排查效能問題、解決資料一致性 Bug、設計高併發架構的關鍵能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved