在 JDBC 中取得插入 ID
一、簡介
當使用 JDBC 將資料插入資料庫時,檢索自動產生的主鍵是一個常見的需求。 JDBC 提供了一種在插入操作後立即取得插入 ID 的機制。
本教學討論如何在插入操作後立即取得插入 ID。
2. 設定
在討論和實作取得插入 ID 的邏輯之前,我們將首先討論必要的設定步驟。
為了測試我們的實現,我們將使用記憶體 H2 資料庫。我們可以在pom.xml
檔中加入h2
資料庫依賴:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
</dependency>
在我們的測試設定中,我們可以連接到 H2 資料庫並使用我們的範例表(即Employees
表)填充資料庫。
private static void populateDB() throws SQLException {
String createTable = """
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();
}
3. 檢索插入 ID
執行 insert 語句時,如果資料表具有自動產生的鍵(例如 MySQL 中的AUTO_INCREMENT
、PostgreSQL 中的SERIAL
、H2 資料庫中的IDENTITY
),則 JDBC 可以使用getGeneratedKeys()
方法擷取這些鍵。
為了插入記錄,我們可以使用preparedStatement.executeUpdate()
,它會傳回更新的行數。要取得插入 ID,我們可以使用Statement.RETURN_GENERATED_KEYS
:
String sql = "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():
ResultSet generatedKeys = statement.getGeneratedKeys();
List<Long> insertIds = new ArrayList<>();
while(generatedKeys.next()){
insertIds.add(generatedKeys.getLong(1));
}
在上面的程式碼中, getLong(1)
從ResultSet
中檢索第一個產生的鍵。如果插入操作產生多個產生的鍵,我們可以使用它們各自的位置來存取它們。例如, getLong(2)
將取得行中第二個產生的鍵, getLong(3)
將產生 get 第三個,依此類推。此外,我們也可以使用列標籤存取產生的鍵,例如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("select id from employees").executeQuery();
List<Long> expectedIds = new ArrayList<>();
while (resultSet.next()){
expectedIds.add(resultSet.getLong(1));
}
assertEquals(expectedIds, actualIds);
}
4。
在本文中,我們討論使用 JDBCPreparedStatement 取得插入記錄的插入 ID 的機制PreparedStatement.
我們還實現了邏輯並使用單元測試對其進行了驗證。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。