在java中获取数据库表的最后插入记录ID? [复制]
Posted
技术标签:
【中文标题】在java中获取数据库表的最后插入记录ID? [复制]【英文标题】:Getting the last inserted record id of a database table in java? [duplicate] 【发布时间】:2010-12-14 13:26:29 【问题描述】:我有一个存储记录的数据库表 A,A 有一个带有 auto_increment 的主键(recordid),每次我向 A 中插入一条记录时,我都会获取插入的 recordid 并将其存储在另一个 masterTable 中。
我在插入 A 后立即使用 select 语句来获取这样的记录 ID:
通过recordid DESC LIMIT 1从A order中选择recordid;
但是我今天遇到了一个问题,两条记录同时插入(由不同的线程),我最终在主 ID 中存储了错误的记录 ID(两个 txns 的记录 ID 相同)
我听说过 Statement.getGeneratedKeys(),我想知道这是否真的有助于解决问题。或者处理这个问题的最佳方法是什么。
【问题讨论】:
【参考方案1】:在不支持 generateKeys 的数据库中,您可以将 ID 放入返回参数中。例如,Oracle 提供了 RETURNING xxx INTO ?其中 xxx 是您的列名的语法。
【讨论】:
【参考方案2】:mysql JDBC 驱动程序确实支持getGeneratedKey()
方法。查看 MySQL 手册的 20.3.5.1.4. Retrieving AUTO_INCREMENT Column Values 部分,其中:
我们演示了新的 JDBC-3.0 方法
getGeneratedKeys()
的使用,如果您需要检索 AUTO_INCREMENT 键,现在这是首选方法。
【讨论】:
【参考方案3】:您可以使用getGeneratedKeys 方法。这个forum post 会有所帮助。
我还建议您使用像 Hibernate 这样的 ORM 工具。在 Hibernate 中,你会做这样的事情:
myTable = new myTable();
myTable.prop1 = prop1;
myTable.prop2 = prop2;
int id = session.save(myTable);
Hibernate 将发出适当的 SQL 命令(取决于所选的数据库)并返回自动生成的 ID。
【讨论】:
如果 MySQL JDBC 驱动实现了。 确实如此。如果 JDBC 驱动不支持,则需要依赖数据库特定的方法来获取 ID。 @kgiannakakis -session.save(myTable)
不返回 int
。然而,它返回java.io.serializable
,并且到目前为止,JDBC 驱动程序的任何实现都不支持getGeneratedKeys()
方法。所以你提到的两个案例都不会成功。它们真的有效吗?
@Lion - Integer
确实实现了 Serializable
。所以使用装箱可以从session.save(myTable)
中得到一个int,当然前提是你的表的映射是返回一个int。这种方法有效。我已经使用 MySQL JDBC 驱动程序成功测试了 getGeneratedKeys 方法。以上是关于在java中获取数据库表的最后插入记录ID? [复制]的主要内容,如果未能解决你的问题,请参考以下文章