解决MybatisPlus批量插入数据报错:Error getting generated key or setting result to parameter object问题

 更新时间:2024年09月25日 09:26:30   作者:Duktig丶  
在使用MybatisPlus进行批量插入数据时遇到空指针异常错误,分析原因是由于主键生成策略导致的,尝试通过设置useGeneratedKeys属性解决问题,但因批量插入方法限制,该方法未能成功,最终通过自定义mapper方法实现批量插入,解决了问题

问题描述

执行的核心代码:

objectUserService.saveBatch(objectUserList);

在使用MybatisPlus进行执行批量插入操作的时候报错,导致每次插入数据失败。

具体报错信息如下:

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

问题分析

根据上述的主要报错信息,可以推测出MybatisPlus在底层执行新增操作时,返回的主键为空,报了个空指针的异常,又因为加了事务的缘故,所以每次执行新增操作,失败。

问题解决过程

百度上所说的大多数的解决策略都是说主键生成策略的问题。

即设置mybatis的insert语句useGeneratedKeys属性为false即可解决问题。

网上大多使用的xml去配置,可以在写到SpringBoot的时候,基本就不怎么写xml文件,多以就想着使用注解去设置,还真有设置这样的注解。

@Options(useGeneratedKeys=true,keyProperty="id",keyColumn="id")

option注解标签useGeneratedKeys=true表示使用数据库自动增长的主键,keyColumn用于指定数据库table中的主键,keyProperty用于指定传入对象的成员变量。

Springboot中 Mybatis 配置文件 Mapper参数useGeneratedKeys=“true” keyProperty=“id”,useGeneratedKeys设置为 true 时,表示如果插入的表id以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键id返回。

useGeneratedKeys参数只针对 insert 语句生效,默认为 false;

默认为false怎么还会生效?难道说是MybatisPlus底层有做了处理。

局限性

虽然这样使用可能可以成功,但是批量插入的方法,是MybatisPlus底层提供的,我们没有办法在mapper中添加这个注解,将这个注解添加到当前方法,还是失败。

后续更新

经过各种尝试,这样的方法还是失败,所以这个需求暂时不使用MybatisPlus的批量新增来写了,就自己写个新增的mapper方法吧。

替代解决方案

因为项目开发需要,不能再耗时间,所以干脆就在写个自定义的mapper批量新增的方法来解决这个问题吧。

方法如下:

/**
 * description: 新增通知时,维护中间表,批量新增
 *
 * @param objId   通知id
 * @param userIds 用户id集合
 * @return 执行条数
 */
@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 );

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于Java回顾之多线程详解

    基于Java回顾之多线程详解

    在这篇文章里,我们关注多线程。多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性、如何创建线程、线程的状态切换以及线程通信,我们把线程同步的话题留到下一篇文章中
    2013-05-05
  • SpringMVC数据输出相关知识总结

    SpringMVC数据输出相关知识总结

    今天带大家学习SpringMVC的相关知识,文中对SpringMVC数据输出作了非常详细的代码示例,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • Spring RedirectAttributes参数跳转代码实例

    Spring RedirectAttributes参数跳转代码实例

    这篇文章主要介绍了Spring RedirectAttributes参数跳转代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Spring覆盖容器中Bean的注解如何实现@OverrideBean

    Spring覆盖容器中Bean的注解如何实现@OverrideBean

    文章介绍了在项目开发中如何通过偷梁换柱的方式重写Spring容器中的内置Bean,并指出了需要注意的两点:1. 对应的Bean应基于接口注入;2. 如果不是基于接口注入,可以使用同包名同类名的方式重写(可能存在潜在问题,不推荐),文章还强调了“基于接口编程”的好处
    2025-01-01
  • Java基础精讲方法的使用

    Java基础精讲方法的使用

    方法,也称函数,如果想要重复一段或者多段代码块的使用,可以将这些代码封装成一个方法,方法具体表现为某种行为,使用方法可以提高代码的复用性
    2022-05-05
  • 浅谈mybatis如何半自动化解耦(推荐)

    浅谈mybatis如何半自动化解耦(推荐)

    这篇文章主要介绍了浅谈mybatis如何半自动化解耦,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • 谈谈java的concurrent用法

    谈谈java的concurrent用法

    这篇文章给大家介绍java的concurrent用法,感兴趣的朋友一起学习吧
    2015-10-10
  • Spring中容器创建的四种方式示例

    Spring中容器创建的四种方式示例

    这篇文章主要介绍了Spring中容器创建的四种方式示例,Spring容器是Spring框架的核心部分,它负责管理和组织应用程序中的对象,它提供了一种轻量级的、非侵入式的方式来实现对象的创建、依赖注入和生命周期管理,需要的朋友可以参考下
    2023-10-10
  • java泛型基本知识和通用方法

    java泛型基本知识和通用方法

    这篇文章主要介绍了java泛型基础知识及通用方法,从以下几个方面介绍一下java的泛型: 基础, 泛型关键字, 泛型方法, 泛型类和接口,感兴趣的可以了解一下
    2021-06-06
  • Junit单元测试关于@Transactional注解引起的事务回滚问题

    Junit单元测试关于@Transactional注解引起的事务回滚问题

    这篇文章主要介绍了Junit单元测试关于@Transactional注解引起的事务回滚问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论