在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是我所知道的唯一不支持的数据库)。