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

JDBC 核心技術深度解析:驅動載入、連線管理、Statement 與 PreparedStatement 最佳實踐

     編輯:Java 綜合教學

JDBC 架構與核心概念

JDBC (Java DataBase Connectivity) 是 Sun 定義的統一 Java 操作資料庫規範。驅動程式實作了標準介面,隱藏廠商細節,實現「做什麼」與「怎麼做」分離。核心四步驟:載入驅動 → 建立連線 → 執行 SQL → 釋放資源。

驅動載入:正確姿勢

不推薦:DriverManager.registerDriver()

  • 導致驅動註冊兩次(驅動類別靜態區塊已自動註冊)。
  • 程式強依賴具體驅動 JAR(如 mysql-connector-java),換資料庫需改碼重編譯。

推薦:Class.forName()

Class.forName("com.mysql.jdbc.Driver"); // 僅需字串,零依賴驅動 JAR 編譯期
  • 不產生重複驅動實例。
  • 僅依賴字串,極易切換資料庫(配合屬性檔)。

核心 API 詳解

1. DriverManager - 服務管理類

  • getConnection(url, user, pwd):取得 Connection。
  • URL 格式:jdbc:mysql://host:port/db?key=value,常用參數 useUnicode=true&characterEncoding=UTF-8。

2. Connection - 資料庫會話核心物件

方法用途
createStatement()建立 Statement 物件
prepareStatement(sql)建立 PreparedStatement(預編譯)
prepareCall(sql)建立 CallableStatement(預存程序)
setAutoCommit(boolean)設定事務自動提交
commit() / rollback()手動提交/回滾事務

原則: 盡量晚建立、盡量早關閉,關閉代碼置於 finally 區塊。

3. Statement - 靜態 SQL 執行

  • executeQuery(sql):查詢,回傳 ResultSet。
  • executeUpdate(sql):增刪改,回傳影響行數。
  • addBatch/executeBatch:批次處理提升效能。

4. ResultSet - 結果集游標操作

  • 預設唯向(TYPE_FORWARD_ONLY),next() 移動游標。
  • 可建立可捲動/可更新結果集:
Statement stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,  // 可捲動,不感知底層變更
    ResultSet.CONCUR_UPDATABLE          // 可更新
);

常用:previous(), absolute(row), beforeFirst(), afterLast(), updateRow()。

5. PreparedStatement - 預編譯語句(核心推薦)

  • 防 SQL 注入: 參數用 ? 佔位符,setXxx(index, value) 綁定,驅動自動轉義。
  • 效能優勢: SQL 預編譯,資料庫緩存執行計畫,重複執行無需再編譯。
  • 程式碼簡潔: 避免字串拼接錯誤。
String sql = "INSERT INTO users(name, age) VALUES(?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "Tom");
ps.setInt(2, 25);
ps.executeUpdate();

完整範例:標準 JDBC 查詢流程

public class JdbcDemo {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8",
                "root", "123456");
            String sql = "SELECT id, username FROM users WHERE age > ?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, 18);
            rs = ps.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getInt("id") + " - " + rs.getString("username"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeQuietly(rs);
            closeQuietly(ps);
            closeQuietly(conn);
        }
    }
    static void closeQuietly(AutoCloseable c) {
        if (c != null) try { c.close(); } catch (Exception ignored) {}
    }
}

進階主題

  • 連線池: 生產環境必須使用(Druid、HikariCP、DBCP2),避免頻繁建立/銷毀連線開銷。
  • 事務控制: conn.setAutoCommit(false) → 業務邏輯 → commit() / rollback()。
  • 大數據處理: setFetchSize、流式讀取 ResultSet、批次 executeBatch。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved