主键从插入的行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列的所有值