这个问题我已经遇过好几次了。总是不记得,每次都要折腾搜索一轮,有必要记录一下。

一、现象描述

我在spring boot项目中,使用mybatis进行批量插入,结果有错误提示。不过很奇怪,好像并不影响实际执行。数据也插到数据库里面去了。但这种提示一大堆,满屏都是,看着心好烦。提示如下:

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 [entities, param1]
        at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77) ~[mybatis-spring-1.3.1.jar!/:1.3.1]
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446) ~[mybatis-spring-1.3.1.jar!/:1.3.1]
        at com.sun.proxy.$Proxy84.insert(Unknown Source) ~[na:na]
        at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:278) ~[mybatis-spring-1.3.1.jar!/:1.3.1]
        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:57) ~[mybatis-3.4.4.jar!/:3.4.4]
        at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59) ~[mybatis-3.4.4.jar!/:3.4.4]
        at com.sun.proxy.$Proxy115.insertBatch(Unknown Source) ~[na:na]
        。。。
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

二、解决问题

后来根据残存的记忆片段,找到一些答案,又改了一轮。记录如下:

1、修改dao或mapper.java

//int insertBatch(@Param("entities") List<PowerData> entities);//原方法
    int insertBatch(List<PowerData> entities);
  • 1.
  • 2.

2、修改mapper.xml

将里面的collection="entities" 改成 collection="list"

原代码:

<insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
        insert into power_data(POWER_ID, V, A, TEMP, CREATE_DATE)
        values
        <foreach collection="entities" item="entity" separator=",">
            (#{entity.powerId}, #{entity.v}, #{entity.a}, #{entity.temp}, #{entity.createDate})
        </foreach>
    </insert>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

新代码:

<insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
        insert into power_data(POWER_ID, V, A, TEMP, CREATE_DATE)
        values
        <foreach collection="list" item="entity" separator=",">
            (#{entity.powerId}, #{entity.v}, #{entity.a}, #{entity.temp}, #{entity.createDate})
        </foreach>
    </insert>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

三、小结

为什么要这样改?不知道。原先的代码看,好像找不出什么毛病。因为在dao里,已经通过@Param(“entities”)指明了参数的名称,按道理mybatis应该可以识别,但偏偏不。为什么改成list又可以?难道只是因为该参数的数据类型是List<>?

搞不懂。也许是个bug。更可能是我的mybatis版本低了。

<mysql.version>8.0.11</mysql.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
<mybatis-plus.version>3.1.1</mybatis-plus.version>
  • 1.
  • 2.
  • 3.

参考资料
MyBatis insert后返回自增主键,报错org.apache.ibatis.binding.BindingException: Parameter ‘id’ not found

mybatis批量插入,返回主键ID不成功,巨坑