java - 获取事务中自增字段的值

标签 java jdbc h2db

我正在使用 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/

相关文章:

java - H2用户自定义函数被多次调用

java - 如何显示本地 h2 数据库(Web 控制台)的内容?

java - 有没有办法从 Maven 启动 EAR?

java - 从 JSP/Servlet 编写简单日志到 UNIX/Shell 脚本

java - 如何使用 Selenium 点击特定链接?

java - HPC + Oracle 连接 = 灾难的秘诀?

java.sql.DriverManager 无法识别 java.sql.Driver stub

java - COGNOS - XQE-JDB-0004 查找驱动程序类 "com.mysql.jdbc.Driver"时出现问题

java - 使用H2db实现springboot时出错

java - Wildfly - Infinispan 事务配置