解決MybatisPlus批量插入數(shù)據(jù)報(bào)錯(cuò):Error getting generated key or setting result to parameter object問題
問題描述
執(zhí)行的核心代碼:
objectUserService.saveBatch(objectUserList);
在使用MybatisPlus進(jìn)行執(zhí)行批量插入操作的時(shí)候報(bào)錯(cuò),導(dǎo)致每次插入數(shù)據(jù)失敗。
具體報(bào)錯(cuò)信息如下:
xiaoyun_notice- 2020-07-14 20:34:09 [http-nio-9001-exec-1] INFO c.x.api.controller.ObjectController - 【新增通知:step02-object_user批量新增,維護(hù)中間表】: 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
主要報(bào)錯(cuò)信息:
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ù)上述的主要報(bào)錯(cuò)信息,可以推測出MybatisPlus在底層執(zhí)行新增操作時(shí),返回的主鍵為空,報(bào)了個(gè)空指針的異常,又因?yàn)榧恿耸聞?wù)的緣故,所以每次執(zhí)行新增操作,失敗。
問題解決過程
百度上所說的大多數(shù)的解決策略都是說主鍵生成策略的問題。
即設(shè)置mybatis的insert語句useGeneratedKeys屬性為false即可解決問題。
網(wǎng)上大多使用的xml去配置,可以在寫到SpringBoot的時(shí)候,基本就不怎么寫xml文件,多以就想著使用注解去設(shè)置,還真有設(shè)置這樣的注解。
@Options(useGeneratedKeys=true,keyProperty="id",keyColumn="id")
option注解標(biāo)簽useGeneratedKeys=true表示使用數(shù)據(jù)庫自動(dòng)增長的主鍵,keyColumn用于指定數(shù)據(jù)庫table中的主鍵,keyProperty用于指定傳入對象的成員變量。
Springboot中 Mybatis 配置文件 Mapper參數(shù)useGeneratedKeys=“true” keyProperty=“id”,useGeneratedKeys設(shè)置為 true 時(shí),表示如果插入的表id以自增列為主鍵,則允許 JDBC 支持自動(dòng)生成主鍵,并可將自動(dòng)生成的主鍵id返回。
useGeneratedKeys參數(shù)只針對 insert 語句生效,默認(rèn)為 false;
默認(rèn)為false怎么還會(huì)生效?難道說是MybatisPlus底層有做了處理。
局限性
雖然這樣使用可能可以成功,但是批量插入的方法,是MybatisPlus底層提供的,我們沒有辦法在mapper中添加這個(gè)注解,將這個(gè)注解添加到當(dāng)前方法,還是失敗。
后續(xù)更新
經(jīng)過各種嘗試,這樣的方法還是失敗,所以這個(gè)需求暫時(shí)不使用MybatisPlus的批量新增來寫了,就自己寫個(gè)新增的mapper方法吧。
替代解決方案
因?yàn)轫?xiàng)目開發(fā)需要,不能再耗時(shí)間,所以干脆就在寫個(gè)自定義的mapper批量新增的方法來解決這個(gè)問題吧。
方法如下:
/** * description: 新增通知時(shí),維護(hù)中間表,批量新增 * * @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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 解決mybatis plus報(bào)錯(cuò)Invalid bound statement (not found):問題
- MyBatis嵌套查詢collection報(bào)錯(cuò):org.apache.ibatis.exceptions.TooManyResultsException
- mybatis-plus報(bào)錯(cuò)Not Found TableInfoCache異常問題
- 解決Mybatis報(bào)錯(cuò):org.apache.ibatis.reflection.ReflectionException: There is no getter for property named問題
相關(guān)文章
SpringMVC數(shù)據(jù)輸出相關(guān)知識(shí)總結(jié)
今天帶大家學(xué)習(xí)SpringMVC的相關(guān)知識(shí),文中對SpringMVC數(shù)據(jù)輸出作了非常詳細(xì)的代碼示例,對正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實(shí)例
這篇文章主要介紹了Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Spring覆蓋容器中Bean的注解如何實(shí)現(xiàn)@OverrideBean
文章介紹了在項(xiàng)目開發(fā)中如何通過偷梁換柱的方式重寫Spring容器中的內(nèi)置Bean,并指出了需要注意的兩點(diǎn):1. 對應(yīng)的Bean應(yīng)基于接口注入;2. 如果不是基于接口注入,可以使用同包名同類名的方式重寫(可能存在潛在問題,不推薦),文章還強(qiáng)調(diào)了“基于接口編程”的好處2025-01-01Junit單元測試關(guān)于@Transactional注解引起的事務(wù)回滾問題
這篇文章主要介紹了Junit單元測試關(guān)于@Transactional注解引起的事務(wù)回滾問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08