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

JDBC 獲取新增記錄自增主鍵的完整指南

     編輯:Java 相關知識

在使用 Hibernate 或 iBATIS 等 ORM 框架時,插入數據後實體 Bean 的主鍵屬性會自動回填新生成的值。若直接使用 JDBC,同樣可以通過標準 API 實現此功能。本文以 MySQL 為例,詳細演示如何在 JDBC 中獲取自增主鍵。

一、 測試環境準備

  • 資料庫:MySQL 5.1
  • 驅動程式:mysql-connector-java-5.1.10
  • JDK 版本:1.5

二、 建表語句

CREATE TABLE book(
 code bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 kind varchar(45) NOT NULL,
 name varchar(45) NOT NULL,
 PRIMARY KEY(code, kind)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = latin1

三、 核心代碼實現

關鍵在於 PreparedStatement 的創建方式:必須指定 Statement.RETURN_GENERATED_KEYS(或 PreparedStatement.getGeneratedKeys() 支持的標誌),執行更新後調用 getGeneratedKeys() 即可獲取包含自增鍵的 ResultSet。

import lavasoft.common.DBToolkit;
import java.sql.*;

/**
 * JDBC 獲取新增記錄的主鍵示例
 * @author leizhimin
 */
public class InsertKeyTest {
    public static void main(String[] args) {
        insertWithStaticSQL();
        insertWithPreparedSQL();
    }

    /**
     * 使用預編譯 SQL 獲取自增主鍵
     */
    public static void insertWithPreparedSQL() {
        Connection conn = null;
        try {
            conn = DBToolkit.getConnection();
            String sql = "insert into testdb.user (name, pswd) values(?,?)";
            // 關鍵:指定 RETURN_GENERATED_KEYS
            PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            pstmt.setString(1, "laozhang");
            pstmt.setString(2, "111111");
            pstmt.executeUpdate();

            // 獲取自動生成的鍵
            ResultSet rs = pstmt.getGeneratedKeys();
            if (rs.next()) {
                Long id = rs.getLong(1);
                System.out.println("-----預定義SQL模式-----id = " + id);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBToolkit.closeConnection(conn);
        }
    }

    /**
     * 使用靜態 SQL 獲取自增主鍵
     */
    public static void insertWithStaticSQL() {
        Connection conn = null;
        try {
            conn = DBToolkit.getConnection();
            String sql = "insert into testdb.user (name, pswd) values('ttttt','121')";
            PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            pstmt.executeUpdate();

            ResultSet rs = pstmt.getGeneratedKeys();
            if (rs.next()) {
                Long id = rs.getLong(1);
                System.out.println("-----靜態SQL模式-----id = " + id);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBToolkit.closeConnection(conn);
        }
    }
}

四、 執行結果

-----靜態SQL模式-----id = 8
-----預定義SQL模式-----id = 9
Process finished with exit code 0

五、 關鍵點總結

  1. 準備語句標誌:必須使用 prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) 或 prepareStatement(sql, new String[]{"code"})(指定列名)。
  2. 獲取結果集:調用 pstmt.getGeneratedKeys() 返回 ResultSet,通常只有一列且為自增鍵值。
  3. 資源釋放:務必在 finally 區塊中關閉 Connection、PreparedStatement 和 ResultSet,防止洩漏。

出處:lavasoft.blog.51cto.com

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