解決MybatisPlus批量插入數(shù)據(jù)報錯:Error getting generated key or setting result to parameter object問題
問題描述
執(zhí)行的核心代碼:
objectUserService.saveBatch(objectUserList);
在使用MybatisPlus進行執(zhí)行批量插入操作的時候報錯,導致每次插入數(shù)據(jù)失敗。
具體報錯信息如下:

xiaoyun_notice- 2020-07-14 20:34:09 [http-nio-9001-exec-1] INFO c.x.api.controller.ObjectController - 【新增通知:step02-object_user批量新增,維護中間表】: userId: 2
xiaoyun_notice- 2020-07-14 20:34:09 [http-nio-9001-exec-1] INFO jdbc.sqltiming - batching 3 statements: 1: INSERT INTO object_user ( obj_id, user_id ) VALUES ( 151, 1 ) 2:
INSERT INTO object_user ( obj_id, user_id ) VALUES ( 151, 2 ) 3: INSERT INTO object_user (
obj_id, user_id ) VALUES ( 151, 3 ) ;
{executed in 75 msec}
xiaoyun_notice- 2020-07-14 20:34:09 [http-nio-9001-exec-1] INFO jdbc.sqltiming - getGeneratedKeys on query: INSERT INTO object_user ( obj_id, user_id ) VALUES ( 151, 3 ) ;
{executed in 0 msec}
xiaoyun_notice- 2020-07-14 20:34:09 [http-nio-9001-exec-1] ERROR c.x.e.handler.GlobalExceptionHandler - nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: java.lang.NullPointerException
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: java.lang.NullPointerException
主要報錯信息:
ERROR c.x.e.handler.GlobalExceptionHandler - nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: java.lang.NullPointerException
問題分析
根據(jù)上述的主要報錯信息,可以推測出MybatisPlus在底層執(zhí)行新增操作時,返回的主鍵為空,報了個空指針的異常,又因為加了事務的緣故,所以每次執(zhí)行新增操作,失敗。
問題解決過程
百度上所說的大多數(shù)的解決策略都是說主鍵生成策略的問題。
即設置mybatis的insert語句useGeneratedKeys屬性為false即可解決問題。
網(wǎng)上大多使用的xml去配置,可以在寫到SpringBoot的時候,基本就不怎么寫xml文件,多以就想著使用注解去設置,還真有設置這樣的注解。
@Options(useGeneratedKeys=true,keyProperty="id",keyColumn="id")
option注解標簽useGeneratedKeys=true表示使用數(shù)據(jù)庫自動增長的主鍵,keyColumn用于指定數(shù)據(jù)庫table中的主鍵,keyProperty用于指定傳入對象的成員變量。
Springboot中 Mybatis 配置文件 Mapper參數(shù)useGeneratedKeys=“true” keyProperty=“id”,useGeneratedKeys設置為 true 時,表示如果插入的表id以自增列為主鍵,則允許 JDBC 支持自動生成主鍵,并可將自動生成的主鍵id返回。
useGeneratedKeys參數(shù)只針對 insert 語句生效,默認為 false;
默認為false怎么還會生效?難道說是MybatisPlus底層有做了處理。
局限性
雖然這樣使用可能可以成功,但是批量插入的方法,是MybatisPlus底層提供的,我們沒有辦法在mapper中添加這個注解,將這個注解添加到當前方法,還是失敗。
后續(xù)更新
經(jīng)過各種嘗試,這樣的方法還是失敗,所以這個需求暫時不使用MybatisPlus的批量新增來寫了,就自己寫個新增的mapper方法吧。
替代解決方案
因為項目開發(fā)需要,不能再耗時間,所以干脆就在寫個自定義的mapper批量新增的方法來解決這個問題吧。
方法如下:
/**
* description: 新增通知時,維護中間表,批量新增
*
* @param objId 通知id
* @param userIds 用戶id集合
* @return 執(zhí)行條數(shù)
*/
@Insert({
"<script>",
"INSERT INTO object_user(obj_id, user_id,created_at,updated_at) values ",
"<foreach collection='userIds' item='item' index='index' separator=','>",
"(#{objId}, #{item},now(),now())",
"</foreach>",
"</script>"
})
int saveObjectUserList ( int objId, List<Integer> userIds );總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringMVC數(shù)據(jù)輸出相關知識總結(jié)
今天帶大家學習SpringMVC的相關知識,文中對SpringMVC數(shù)據(jù)輸出作了非常詳細的代碼示例,對正在學習的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06
Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實例
這篇文章主要介紹了Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04
Spring覆蓋容器中Bean的注解如何實現(xiàn)@OverrideBean
文章介紹了在項目開發(fā)中如何通過偷梁換柱的方式重寫Spring容器中的內(nèi)置Bean,并指出了需要注意的兩點:1. 對應的Bean應基于接口注入;2. 如果不是基于接口注入,可以使用同包名同類名的方式重寫(可能存在潛在問題,不推薦),文章還強調(diào)了“基于接口編程”的好處2025-01-01
Junit單元測試關于@Transactional注解引起的事務回滾問題
這篇文章主要介紹了Junit單元測試關于@Transactional注解引起的事務回滾問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08

