我正在使用JDBC並希望批量插入,但我需要爲下一輪插入生成的密鑰 - 是否有無法完成此操作?有沒有辦法在使用Spring JDBC batchUpdate時獲取生成的鍵?
MapSqlParameterSource[] batchArgs ....
DAL.getNamedParameterTemplate().batchUpdate("INSERT INTO...", batchArgs);
感謝
我正在使用JDBC並希望批量插入,但我需要爲下一輪插入生成的密鑰 - 是否有無法完成此操作?有沒有辦法在使用Spring JDBC batchUpdate時獲取生成的鍵?
MapSqlParameterSource[] batchArgs ....
DAL.getNamedParameterTemplate().batchUpdate("INSERT INTO...", batchArgs);
感謝
使用db sequences抓住下一個主鍵值,並在INSERT語句中使用它。
我如何使用彈簧? – MalcomTucker 2010-03-11 12:06:56
沿着這些線: select seq.nextval into nextPrimaryKeyValue – 2010-03-11 13:57:36
這種方法不是原子的,除非你在事務中完成整個事務(這將不得不鎖定整個表,甚至不接近理想的解決方案)。我認爲MalcomTucker所問的是,你是否可以像將KeyHolder傳遞給spring update()之一那樣做這件事。 – 2015-02-13 17:35:47
春季框架夥計attempted a solution到這個問題。但是當他們明顯無法保證該解決方案適用於所有JDBC驅動程序時,他們放棄了這一嘗試。這是因爲JDBC規範並不能保證生成的密鑰在批量更新後可用。 JDBC驅動程序可以自由實現這個功能,因爲他們認爲合適。在某些情況下,底層數據庫可能不會返回生成的密鑰,使驅動程序無法支持此功能。
因此,即使您直接使用JDBC,也需要檢查數據庫和JDBC驅動程序是否使生成的密鑰可用。
我記得我在MySQL 5.0 JDBC驅動程序中做了一些努力,但從未將解決方案集成到我們的生產應用程序中,因爲我們也必須支持舊版本的MySQL。
我發現你的問題,因爲我正在尋找做同樣的事情,但春天batchUpdate需要一個BatchPreparedStatementSetter,我不知道如何使返回生成的密鑰。我想知道是否你必須自己使用Spring jdbcTemplate函數使用jdbc addBatch函數來做到這一點。你有沒有找到你的問題的答案? – titania424 2011-06-16 17:40:31