2010-03-11 85 views
10

我正在使用JDBC并希望批量插入,但我需要为下一轮插入生成的密钥 - 是否有无法完成此操作?有没有办法在使用Spring JDBC batchUpdate时获取生成的键?

MapSqlParameterSource[] batchArgs ....

DAL.getNamedParameterTemplate().batchUpdate("INSERT INTO...", batchArgs);

感谢

+0

我发现你的问题,因为我正在寻找做同样的事情,但春天batchUpdate需要一个BatchPreparedStatementSetter,我不知道如何使返回生成的密钥。我想知道是否你必须自己使用Spring jdbcTemplate函数使用jdbc addBatch函数来做到这一点。你有没有找到你的问题的答案? – titania424 2011-06-16 17:40:31

回答

0

使用db sequences抓住下一个主键值,并在INSERT语句中使用它。

+1

我如何使用弹簧? – MalcomTucker 2010-03-11 12:06:56

+0

沿着这些线: select seq.nextval into nextPrimaryKeyValue – 2010-03-11 13:57:36

+0

这种方法不是原子的,除非你在事务中完成整个事务(这将不得不锁定整个表,甚至不接近理想的解决方案)。我认为MalcomTucker所问的是,你是否可以像将KeyHolder传递给spring update()之一那样做这件事。 – 2015-02-13 17:35:47

7

春季框架伙计attempted a solution到这个问题。但是当他们明显无法保证该解决方案适用于所有JDBC驱动程序时,他们放弃了这一尝试。这是因为JDBC规范并不能保证生成的密钥在批量更新后可用。 JDBC驱动程序可以自由实现这个功能,因为他们认为合适。在某些情况下,底层数据库可能不会返回生成的密钥,使驱动程序无法支持此功能。

因此,即使您直接使用JDBC,也需要检查数据库和JDBC驱动程序是否使生成的密钥可用。

我记得我在MySQL 5.0 JDBC驱动程序中做了一些努力,但从未将解决方案集成到我们的生产应用程序中,因为我们也必须支持旧版本的MySQL。

相关问题