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

SQL Server 2005 JDBC 驅動統一獲取自增鍵:getGeneratedKeys 實戰

     編輯:Java 相關知識

背景痛點:異資料庫自增鍵獲取不一致

  • SQL Server 2000:`INSERT ...; SELECT @@IDENTITY` 單語句可行
  • MySQL:需分兩句 `executeUpdate()` + `executeQuery('SELECT LAST_INSERT_ID()')`,併發下有競態風險
  • JDBC 3.0 標準:`Statement.getGeneratedKeys()` 統一介面,但 SQL Server 2000 驅動不支援

解決方案:升級 SQL Server 2005 JDBC 驅動

Microsoft SQL Server 2005 JDBC Driver 1.1 完整支援 JDBC 3.0 `getGeneratedKeys()`,實現跨資料庫統一代碼。

驅動下載與關鍵差異

# 下載 (舊版連結,現建議用最新 12.x 版本)
# https://download.microsoft.com/download/.../sqljdbc_1.1.1501.101_chs.exe
項目SQL Server 2000 驅動SQL Server 2005 驅動
JDBC URL`jdbc:microsoft:sqlserver://host:1433;DatabaseName=db``jdbc:sqlserver://host:1433;DatabaseName=db`
Driver Class`com.microsoft.jdbc.sqlserver.SQLServerDriver``com.microsoft.sqlserver.jdbc.SQLServerDriver`
Jar 檔`msbase.jar`, `mssqlserver.jar`, `msutil.jar``sqljdbc.jar` (單檔)

⚠️ 類名 `jdbc`/`sqlserver` 順序互換,極易寫錯導致 `ClassNotFoundException`。

部署注意

  • `sqljdbc.jar` 放入 Tomcat `common/lib` (或 `WEB-INF/lib`),勿只依賴系統 CLASSPATH
  • 租用主機需確認提供商支援 2005 驅動

統一代碼範本

public String executeInsertReturnKey(String sql) throws SQLException {
    Connection conn = null;
    PreparedStatement pstmt = null;
    try {
        conn = getConnection();
        // 關鍵:Statement.RETURN_GENERATED_KEYS
        pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        pstmt.executeUpdate();
        
        try (ResultSet rs = pstmt.getGeneratedKeys()) {
            if (rs.next()) {
                return rs.getString(1); // 取第一欄自增值
            }
        }
        return "-1"; // 未取得
    } catch (SQLException e) {
        throw new SQLException("執行失敗: " + e.getMessage() + " SQL: " + sql, e);
    } finally {
        closeQuietly(pstmt, conn);
    }
}

跨資料庫驗證矩陣

資料庫驅動版本支援 getGeneratedKeys備註
SQL Server 2005+sqljdbc 1.1+✅單檔 jar,URL/Class 全變
MySQLConnector/J 3.1+✅需 URL 加 `useGeneratedKeys=true`
PostgreSQLJDBC 4.0+✅支援 `RETURNING` 子句
Oracleojdbc6+⚠️ 部分需指定索引/欄位名 `prepareStatement(sql, new String[]{"ID"})`

最佳實踐總結

  1. 統一使用 `PreparedStatement + RETURN_GENERATED_KEYS + getGeneratedKeys()`
  2. 資料庫遷移時只需換驅動 Jar 與 URL,業務代碼零修改
  3. 併發環境下避免 `SELECT @@IDENTITY` / `LAST_INSERT_ID()` 獨立查詢的競態
  4. 新專案直接使用 SQL Server 2012+ 驅動 (mssql-jdbc 12.x),支援 JDBC 4.3、Java 11+
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved