使用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); }
|