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

时间:2008-09-16 19:55:17

标签: java sql

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

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

5 个答案:

答案 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));

众所周知,这可用于以下数据库

  • 德比
  • MySQL的
  • SQL Server

对于不起作用的数据库(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是我所知道的唯一没有的那个)。