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

JDBC 技術全景:從 ODBC 演進到 Java 數據庫連接的標準化之路

     編輯:Java 相關知識

前言:JDBC 是什麼?

JDBC(Java Database Connectivity)是用於執行 SQL 語句的 Java API,由一組用 Java 編寫的類與接口組成。它為數據庫應用開發者、前台工具開發者提供統一標準接口,使開發者能用純 Java編寫完整數據庫應用,實現真正的「Write Once, Run Everywhere」。

一、從 ODBC 到 JDBC 的歷史必然

ODBC 架構回顧

ODBC(Open Database Connectivity):C 語言實現的標準數據訪問接口,四大組件:

  • 應用程序接口:屏蔽驅動差異,提供統一 SQL 編程接口
  • 驅動管理器:加載數據庫驅動
  • 數據庫驅動:實現 ODBC 函數調用,處理特定 DBMS 語法差異
  • 數據源:數據 + OS + DBMS + 網絡平台

JDBC 誕生動因

  1. Java 爆發(1995 年後),大量數據庫應用需 Java 原生 API
  2. 早期被迫在 Java 中調用 C 版 ODBC → 失去平台無關性、面向對象等 Java 核心優勢
  3. ODBC 自身缺陷:非面向對象、指針操作複雜、易出錯、學習曲線陡峭
  4. Sun 決定開發Java 原生數據庫 API → JDK 1.1 正式納入標準組件

二、JDBC 技術本質與核心價值

三大核心任務

  1. 建立數據庫連接
  2. 發送 SQL 語句
  3. 處理返回結果

底層 API 定位

  • 直接調用 SQL 命令,勝任基礎數據操作
  • 構建高層 API 與工具的基石(SQLJ 預處理器、ORM 映射工具)

兩大高層演進方向

  1. SQLJ(嵌入式 SQL 預處理器):Java 變量直接在 SQL 中使用,預處理器轉為 JDBC 代碼
  2. 對象/關係映射(ORM):表行 → 對象實例,列值 → 對象屬性,程序員操作對象,SQL 內部生成

JDBC vs ODBC vs Microsoft 新 API (RDO/ADO/OLE DB)

維度ODBCJDBCRDO/ADO/OLE DB
語言綁定CJavaCOM/Visual Basic
面向對象否是是(封裝層)
指針操作大量無封裝隱藏
學難度高(簡繁混雜)低(簡單即簡單)中
部署模式客戶機需裝驅動/管理器純 Java 驅動可自動下載、跨平台Windows 綁定
本質關係基於 X/OPEN SQL CLI基於 ODBC 設計特徵,強化 Java 風格ODBC「漂亮包裝」

三、JDBC 兩層與三層架構模式

兩層模型

Java Applet/應用 直接連接數據庫。需 JDBC 驅動直連 DB。Client/Server 結構,網絡可為 Intranet/Internet。

三層模型

命令發送至中間層,中間層發 SQL 給數據庫,結果回傳中間層再返回用戶。

  • MIS 偏好:中間層控制訪問、協同更新
  • 用戶享受高層易用 API,中間層轉換為底層調用
  • 性能潛力:連接池、緩存、批量處理

趨勢:中間層早期用 C/C++ 保性能,隨 Java 優化編譯器(JIT、AOT)成熟,Java 實現中間層日益主流。JDBC 是 Java 中間層訪問數據庫的關鍵。

四、JDBC 核心編程步驟與代碼範式

標準六步法

  1. 構建 JDBC URL:jdbc:subprotocol:subname//host:port/dbname(如 jdbc:mysql://192.168.3.143:3306/zfvims)
  2. 加載驅動:Class.forName("com.mysql.jdbc.Driver") 或系統屬性 jdbc.drivers
  3. 獲取連接:DriverManager.getConnection(url, user, pwd) → Connection
  4. 創建 Statement:conn.createStatement() → Statement(靜態 SQL)或 PreparedStatement(動態參數化 SQL)
  5. 執行與結果處理:
    • 查詢:executeQuery(sql) → ResultSet,游標遍歷 next()、getXxx()
    • 更新:executeUpdate(sql) → 影響行數
  6. 關閉資源:ResultSet → Statement → Connection 逆序關閉,必在 finally 塊

完整範例:MySQL 查詢省份表

public class JdbcDemo {
    public static Connection getConnection() throws SQLException {
        try { Class.forName("com.mysql.jdbc.Driver"); }
        catch (ClassNotFoundException e) { throw new SQLException("驅動加載失敗", e); }
        return DriverManager.getConnection(
            "jdbc:mysql://192.168.3.143:3306/zfvims", "lavasoft", "password");
    }
    
    public static void queryProvinces() {
        String sql = "SELECT code, name FROM province ORDER BY code";
        try (Connection conn = getConnection();
             Statement stmt = conn.createStatement(
                 ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
             ResultSet rs = stmt.executeQuery(sql)) {
            
            while (rs.next()) {
                System.out.println(rs.getString("code") + " " + rs.getString("name"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

五、JDBC 避坑指南(生產級鐵律)

  1. Connection 必須在 finally / try-with-resources 中關閉——防洩漏導致連接池耗盡
  2. Statement、ResultSet 縮小作用域——用完即關,不作為類字段長期持有
  3. Statement 可復用,但同一時刻僅關聯一個 ResultSet——最後一次查詢結果有效
  4. ResultSet 隨 Connection/Statement 關閉自動關閉——但显式關閉更安全
  5. 優先使用 PreparedStatement——防 SQL 注入、預編譯性能優、參數化清晰
  6. 批量操作用 addBatch/executeBatch——大幅降低網絡往返
  7. 事務邊界明確:setAutoCommit(false)、commit/rollback、finally 恢復 autoCommit

總結

JDBC 是 Java 數據訪問的基石與標準。從 ODBC 演進而來,保留 CLI 設計精華,注入 Java 面向對象、平台無關、安全健壯基因。無論上層框架如何演進(Hibernate、MyBatis、Spring Data、jOOQ),JDBC 核心模型(DriverManager → Connection → Statement → ResultSet)永不落伍。精通 JDBC,是精通所有 Java 數據訪問技術的前提。

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