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

有关如何通过java.sql.Statement.executeUpdate调用分配给新创建的记录的自动递增标识字段的任何建议?

我知道如何在SQL中为几个数据库平台执行此操作,但是想知道java.sql存在哪些数据库独立接口来执行此操作,以及人们在跨数据库平台上使用此体验的任何输入。

以下snibblet代码应该做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 Server

对于不起作用的数据库(HSQLDB,Oracle,PostgreSQL等),您需要使用特定于数据库的技巧。 例如,在PostgreSQL上,您将调用SELECT NEXTVAL(...)来查询相关序列。

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

 ResultSet keys = statement.getGeneratedKeys(); 

稍后,只需迭代ResultSet。

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

你可以使用像hibernate这样的ORM。 我认为它会为你做这些事情。

@ ScArcher2:我同意,Hibernate需要再次调用才能获得新生成的标识,除非使用了高级生成器策略(sequence,hilo …)

@ ScArcher2

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