我正在使用 H2DB 作为一个提示表数据库。我正在将多条记录插入到一个表中,其中包含主键 ID 的自动增量字段。对于每条记录,我想知道插入后(即提交前)ID 字段的值。我如何获得这个值?
最佳答案
简而言之:
- 在准备插入语句时使用
Statement.RETURN_GENERATED_KEYS
作为第二个参数 - 使用
.getGenerateKeys() 插入后从语句中获取
ResultSet
- 从
ResultSet
获取生成的 ID
这在使用事务时也应该有效。
以下示例演示了这一点:
try {
// register driver
Class.forName("org.h2.Driver");
// open connection, in-memory database
Connection conn = DriverManager.getConnection("jdbc:h2:mem:");
conn.setAutoCommit(false);
// create table
PreparedStatement createSample = conn.prepareStatement("CREATE TABLE sample (id int not null auto_increment, txt varchar(128))");
createSample.executeUpdate();
createSample.close();
// prepare insert statement
PreparedStatement insertStatement = conn.prepareStatement("INSERT INTO sample (txt) VALUES (?)", Statement.RETURN_GENERATED_KEYS);
// dummy list with texts
List<String> dummyTexts = Arrays.asList("Entry A", "Entry B", "Entry C", "Entry D", "Entry E");
// insert data
for (String dummyText : dummyTexts) {
insertStatement.setString(1, dummyText);
insertStatement.executeUpdate();
// get generated key
ResultSet generatedKeys = insertStatement.getGeneratedKeys();
if ((generatedKeys != null) && (generatedKeys.next())) {
int generatedKey = generatedKeys.getInt(1);
System.out.println("generated key " + generatedKey + " for entry '" + dummyText + "'");
}
}
// commit
conn.commit();
insertStatement.close();
// select data
PreparedStatement selection = conn.prepareStatement("SELECT id, txt FROM sample");
ResultSet selectionResult = selection.executeQuery();
while (selectionResult.next()) {
System.out.println("id: " + selectionResult.getInt(1) + ", txt: '" + selectionResult.getString(2) + "'");
}
selectionResult.close();
selection.close();
// close connection
conn.close();
} catch (Exception ex) {
ex.printStackTrace();
}
关于java - 获取事务中自增字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48602701/