有关如何通过java.sql.Statement.executeUpdate
来调用如何读取分配给新创建记录的自动递增标识字段的任何建议?
我知道如何在SQL中为几个数据库平台执行此操作,但是想知道java.sql
中存在哪些数据库独立接口来执行此操作,以及人们在跨数据库平台上使用这些接口的任何输入。
答案 0 :(得分:23)
以下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));
众所周知,这可用于以下数据库
对于不起作用的数据库(HSQLDB,Oracle,PostgreSQL等),您需要使用特定于数据库的技巧。例如,在PostgreSQL上,您可以调用SELECT NEXTVAL(...)
来查询相关序列。
请注意executeUpdate(...)
的参数类似。
答案 1 :(得分:2)
ResultSet keys = statement.getGeneratedKeys();
稍后,只需迭代ResultSet。
答案 2 :(得分:0)
我总是不得不在插入后使用查询进行第二次调用。
您可以使用像hibernate这样的ORM。我认为它会为你做这件事。
答案 3 :(得分:0)
@ ScArcher2:我同意,Hibernate需要再次调用才能获得新生成的标识,除非使用高级生成器策略(序列,hilo ...)
答案 4 :(得分:0)
@ ScArcher2
进行第二次通话非常危险。 INSERT
和选择生成的自动生成的密钥的过程必须是原子的,否则您可能会在密钥选择上收到不一致的结果。考虑两个异步INSERT
,它们在有机会选择生成的密钥之前完成。哪个进程获取哪个键列表?大多数跨数据库ORM都必须执行诸如进程内线程锁定之类的烦人事情,以保持结果的确定性。这是不你想要手工完成的事情,特别是如果你使用的数据库支持原子生成的密钥检索(HSQLDB是我所知道的唯一没有的那个)。