在 JDBC 中獲取插入 ID

banq發表於2024-07-08

使用JDBC將資料插入資料庫時​​,檢索自動生成的主鍵是一項常見要求。JDBC 提供了一種在插入操作後立即獲取插入 ID 的機制:JDBC 可以使用getGeneratedKeys()方法獲取插入 ID

本教程討論如何在插入操作後立即獲取插入 ID。

設定
在討論和實現獲取插入 ID 的邏輯之前,我們首先討論必要的設定步驟。

為了測試我們的實現,我們將使用記憶體中的H2資料庫。我們可以在pom.xml檔案中新增h2資料庫依賴項:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.1.214</version>
</dependency>

在我們的測試設定中,我們可以連線到 H2 資料庫並使用我們的示例表(即員工表)填充資料庫。

private static void populateDB() throws SQLException {
    String createTable = <font>"""
        CREATE TABLE EMPLOYEES (
            id SERIAL PRIMARY KEY ,
            first_name VARCHAR(50),
            last_name VARCHAR(50),
            salary DECIMAL(10, 2)
        );
       
""";
    PreparedStatement preparedStatement = connection.prepareStatement(createTable);
    preparedStatement.execute();
}


獲取插入 ID
執行插入語句時,如果表具有自動生成的鍵(例如MySQL 中的AUTO_INCREMENT 、PostgreSQL 中的SERIAL或H2 資料庫中的IDENTITY ),JDBC 可以使用getGeneratedKeys()方法檢索這些鍵

要插入記錄,我們可以使用preparedStatement.executeUpdate(),它返回更新的行數。要獲取插入ID,我們可以使用Statement.RETURN_GENERATED_KEYS:

String sql = <font>"INSERT INTO employees (first_name, last_name, salary) VALUES (?, ?, ?)";
PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
statement.setString(1,
"first");
statement.setString(2,
"last");
statement.setDouble(3, 100.0);
int numRows = statement.executeUpdate();

現在,我們可以呼叫statement.getGeneratedKeys()來獲取ResultSet ,這使我們能夠使用getLong()獲取插入的 ID

ResultSet generatedKeys = statement.getGeneratedKeys();
List<Long> insertIds = new ArrayList<>();
while(generatedKeys.next()){
    insertIds.add(generatedKeys.getLong(1));
 }

在上面的程式碼中,getLong(1)從ResultSet中檢索第一個生成的鍵。如果插入操作生成多個生成的鍵,我們可以使用它們各自的位置來訪問它們。例如,getLong(2)將獲取行中的第二個生成的鍵,getLong(3)將獲取第三個生成的鍵,依此類推。此外,我們還可以使用列標籤訪問生成的鍵,例如getLong(“id1”)、 getLong(“id2”)等等。

我們可以透過編寫單元測試來驗證結果:

@Test
public void givenDBPopulated_WhenGetInsertIds_ThenReturnsIds() throws SQLException {
    GetInsertIds getInsertIds = new GetInsertIds();
    List<Long> actualIds = getInsertIds.insertAndReturnIds(connection);
    ResultSet resultSet = connection.prepareStatement(<font>"select id from employees").executeQuery();
    List<Long> expectedIds = new ArrayList<>();
    while (resultSet.next()){
        expectedIds.add(resultSet.getLong(1));
    }
    assertEquals(expectedIds, actualIds);
}

相關文章