在Java中插入SQL后访问自动增量标识字段

时间:2020-03-05 18:56:59  来源:igfitidea点击:

关于如何从通过java.sql.Statement.executeUpdate的调用中读取分配给新创建的记录的自动递增身份字段的任何建议?

我知道如何在多个数据库平台的SQL中执行此操作,但想知道java.sql中存在哪些与数据库无关的接口来执行此操作,以及有关人们在整个数据库平台上的经验的任何输入。

解决方案

回答

在插入之后,我总是不得不使用查询进行第二次调用。

我们可以像休眠一样使用ORM。我认为它可以为我们完成这些工作。

回答

以下代码片段应做ya':

PreparedStatement stmt = conn.prepareStatement(sql, 
                                 Statement.RETURN_GENERATED_KEYS);
// ...

ResultSet res = stmt.getGeneratedKeys();
while (res.next())
    System.out.println("Generated key: " + res.getInt(1));

已知这可用于以下数据库

  • 德比
  • 的MySQL
  • SQL服务器

对于不起作用的数据库(HSQLDB,Oracle,PostgreSQL等),我们将需要使用数据库特有的技巧。例如,在PostgreSQL上,我们可以为所讨论的序列调用SELECT NEXTVAL(...)。

注意,executeUpdate(...)的参数是相似的。

回答

@ ScArcher2:我同意,除非使用高级生成器策略(序列,循环...),否则Hibernate需要再次调用以获取新生成的标识。

回答

ResultSet keys = statement.getGeneratedKeys();

以后,只需遍历ResultSet。

回答

@ ScArcher2

拨打第二个电话非常危险。 "插入"和选择生成的自动生成键的过程必须是原子的,否则我们在选择键时可能会收到不一致的结果。考虑两个异步的" INSERT",它们在它们都有机会选择生成的密钥之前都已完成。哪个进程获取哪个键列表?大多数跨数据库ORM必须做一些令人讨厌的事情,例如进程内线程锁定,以保持结果的确定性。这不是我们要手动执行的操作,特别是如果我们使用的数据库确实支持原子生成的键检索(我所知道的唯一一个不支持HSQLDB的数据库)。