主键从插入的行jdbc?

是否有一个跨数据库平台的方式来获得刚刚插入的logging的主键?

我注意到这个答案说,你可以通过调用SELECT LAST_INSERT_ID()来获得它,我认为你可以调用SELECT @@IDENTITY AS 'Identity'; 有没有一种常见的方式来做到这一点在jdbc中的数据库?

如果不是,你会如何build议我实现一个可以访问任何SQL Server,MySQL和Oracle的代码?

从我的代码复制:

 pInsertOid = connection.prepareStatement(INSERT_OID_SQL, Statement.RETURN_GENERATED_KEYS); 

其中pInsertOid是一个准备好的语句。

然后你可以获得密钥:

 // fill in the prepared statement and pInsertOid.executeUpdate(); ResultSet rs = pInsertOid.getGeneratedKeys(); if (rs.next()) { int newId = rs.getInt(1); oid.setId(newId); } 

希望这给你一个很好的起点。

extraneon的答案虽然正确, 但不适用于Oracle

您对Oracle的这种做法是:

 String key[] = {"ID"}; //put the name of the primary key column ps = con.prepareStatement(insertQuery, key); ps.executeUpdate(); rs = ps.getGeneratedKeys(); if (rs.next()) { generatedKey = rs.getLong(1); } 

你有没有尝试Statement.executeUpdate()和Statement.getGeneratedKeys()方法? 有一篇developerWorks文章提到了这个方法。

另外,在JDBC 4.0中,Sun添加了row_idfunction ,可以让您在一行上获得唯一的句柄。 该function由Oracle和DB2支持。 对于SQL服务器,您可能需要第三方驱动程序,如这个 。

祝你好运!

对于oracle,如果你已经为PKEY值生成映射了一个序列,那么Hibernate使用序列中的NEXT_VALUE。

不知道它为MySQL或MS SQL服务器

Spring为这个操作提供了一些有用的支持,参考指南似乎回答你的问题:

没有一种标准的单一方法来创build适当的PreparedStatement(这解释了为什么方法签名是这样的)。 一个适用于Oracle的例子可能不适用于其他平台

我已经在MySQL上testing了这个例子,它也可以在那里工作,但我不能说其他平台。

对于符合SQL-99的数据库,您可以使用标识列:CREATE TABLE sometable(id INTEGER GENERATED ALWAYS作为标识(从第101开始)PRIMARY KEY,…

使用getGeneratedKeys()来检索刚刚使用executeUpdate(String sql,int autoGeneratedKeys)插入的键。 使用Statement.RETURN_GENERATED_KEYS作为第二个参数executeUpdate()

只需声明id列为id整数不是NULL主键auto_increment

之后执行此代码

 ResultSet ds=st.executeQuery("select * from user"); while(ds.next()) { ds.last(); System.out.println("please note down your registration id which is "+ds.getInt("id")); } ds.close(); 

上面的代码会显示当前行的ID

如果你删除ds.last()比它会显示id列的所有值