Mybatis批量插入,返回主键ID不成功,巨坑记录
一、场景说明
批量插入,返回主键ID报错
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.binding.BindingException: Parameter ‘id’ not found. Available parameters are [entitys, param1]
二、代码
dao.java
int insertBatch(@Param("entitys") List<ForlanDTO> entities);dao.xml
<insert id="insertBatch" useGeneratedKeys="true" keyProperty="id">
insert into forlan_batch_insert(name,age)
values
<foreach collection="entitys" item="entity" index="index" separator=",">
(#{entity.name}, #{entity.age})
</foreach>
</insert>
mybatis版本号为:3.4.2
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.2</version> </dependency>
三、解决方案
1、换mybatis版本
调整版本号为3.5.2
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency>
换了版本号后,就正常了,其它版本大家可以测试下,具体从什么版本后修复的,这个暂时没查到
2、调整代码
dao.java
int insertBatch(@Param("list") List<ForlanDTO> entities);dao.xml
<insert id="insertBatch" useGeneratedKeys="true" keyProperty="id">
insert into forlan_batch_insert(name,age)
values
<foreach collection="list" item="entity" index="index" separator=",">
(#{entity.name}, #{entity.age})
</foreach>
</insert>
关键点:foreach里的collection必须是list,不然就会报错
四、拓展说明
关于返回主键ID,需要在insert标签中添加,useGeneratedKeys=“true” keyProperty=“id”,useGeneratedKeys和keyProperty必须配合使用,keyProperty的字段就是返回的主键ID
mybatis3.3.1及以上的版本,才支持批量插入返回主键ID
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot中使用Knife4j生成接口文档的示例详解
Knife4j 是一个基于 Swagger 的增强 UI 实现,主要用于为 Spring Boot 应用程序生成 API 接口文档,本文将详细介绍如何在 Spring Boot 中集成 Knife4j,并通过不同注解来生成清晰的接口文档,需要的可以参考一下2025-06-06
Spring Boot开发时Java对象和Json对象之间的转换
在Spring Boot开发中,我们经常需要处理Java对象和Json对象之间的转换,本文将介绍如何在Spring Boot项目中实现Java对象和Json对象之间的转换,感兴趣的朋友跟随小编一起看看吧2023-09-09


最新评论