解決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ò)信息,可以推測(cè)出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)增長(zhǎng)的主鍵,keyColumn用于指定數(shù)據(jù)庫table中的主鍵,keyProperty用于指定傳入對(duì)象的成員變量。
Springboot中 Mybatis 配置文件 Mapper參數(shù)useGeneratedKeys=“true” keyProperty=“id”,useGeneratedKeys設(shè)置為 true 時(shí),表示如果插入的表id以自增列為主鍵,則允許 JDBC 支持自動(dòng)生成主鍵,并可將自動(dòng)生成的主鍵id返回。
useGeneratedKeys參數(shù)只針對(duì) 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)文章
SpringBoot實(shí)現(xiàn)發(fā)送郵件功能的三種方式
本文詳細(xì)介紹了如何在SpringBoot應(yīng)用中使用JavaMailSender、JavaMailAPI和ApacheCommonsEmail庫發(fā)送郵件,對(duì)比了它們的優(yōu)缺點(diǎn),并提供了示例代碼和配置指導(dǎo),需要的朋友可以參考下2025-07-07
java使用spring實(shí)現(xiàn)發(fā)送mail的方法
這篇文章主要介紹了java使用spring實(shí)現(xiàn)發(fā)送mail的方法,涉及java基于spring框架發(fā)送郵件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
分布式醫(yī)療掛號(hào)系統(tǒng)EasyExcel導(dǎo)入導(dǎo)出數(shù)據(jù)字典的使用
這篇文章主要為大家介紹了分布式醫(yī)療掛號(hào)系統(tǒng)EasyExcel導(dǎo)入導(dǎo)出數(shù)據(jù)字典的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Java面向?qū)ο蟪绦蛟O(shè)計(jì)多態(tài)性示例
這篇文章主要介紹了Java面向?qū)ο蟪绦蛟O(shè)計(jì)多態(tài)性,結(jié)合實(shí)例形式分析了java多態(tài)性的概念、原理、定義與使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-03-03
Java 圖片復(fù)制功能實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java 圖片復(fù)制功能實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
在Spring應(yīng)用中進(jìn)行單元測(cè)試的解析和代碼演示
在Spring應(yīng)用中進(jìn)行單元測(cè)試通常涉及到Spring TestContext Framework,它提供了豐富的注解和工具來支持單元測(cè)試和集成測(cè)試,以下是如何在Spring應(yīng)用中進(jìn)行單元測(cè)試的詳細(xì)解析和代碼演示,需要的朋友可以參考下2024-06-06
在Mac OS上安裝Java以及配置環(huán)境變量的基本方法
這篇文章主要介紹了在Mac OS上安裝Java以及配置環(huán)境變量的基本方法,包括查看所安裝Java版本的方法,需要的朋友可以參考下2015-10-10

