MyBatis【问题 01】mapper传入array\collection\list类型的参数时报BindingException:Parameter ‘xx‘ not found问题复现及解决

简介: MyBatis【问题 01】mapper传入array\collection\list类型的参数时报BindingException:Parameter ‘xx‘ not found问题复现及解决

1. 问题说明

这里只贴出核心代码:

// 查询数据
List<StatisticalInfo> statisticalInfoList = null;
// 保存数据
boolean isSuccess = baseComponent.batchInsert(statisticalInfoList);

这里是批量保存数据时使用的SQL:

<insert id="batchInsert" parameterType="com.xxx.StatisticalInfo">
  insert into statistical_info (id, table_name, group_time, total_rows)
  values
  <foreach collection="statisticalInfoList" index="index" item="item" separator=",">
    ( #{item.id}, #{item.tableName}, #{item.groupTime}, #{item.totalRows} )
  </foreach>
</insert>

报错信息如下:

nested exception is org.apache.ibatis.binding.BindingException: 
Parameter 'statisticalInfoList' not found. Available parameters are [collection, list]

2. 解决

【方法 1️⃣】只将【collection=“statisticalInfoList”】修改为【collection=“list”】即可(不用修改其他任何文件):

<insert id="batchInsert" parameterType="com.xxx.StatisticalInfo">
  insert into statistical_info (id, table_name, group_time, total_rows)
  values
  <foreach collection="list" index="index" item="item" separator=",">
    ( #{item.id}, #{item.tableName}, #{item.groupTime}, #{item.totalRows} )
  </foreach>
</insert>

【方法 2️⃣】只在Mapper接口给参数添加 @Param(“statisticalInfoList”) 注解(不用修改mapper文件):

public interface BaseMapper {
    /**
     * 批量导入统计结果数据
     *
     * @param statisticalInfoList 查询的统计结果
     * @return 导入成功标志
     */
    boolean batchInsert(@Param("statisticalInfoList") List<StatisticalInfo> statisticalInfoList);
}

mapper文件里的SQL依然是【collection=“statisticalInfoList”】:

<insert id="batchInsert" parameterType="com.xxx.StatisticalInfo">
  insert into statistical_info (id, table_name, group_time, total_rows)
  values
  <foreach collection="statisticalInfoList" index="index" item="item" separator=",">
    ( #{item.id}, #{item.tableName}, #{item.groupTime}, #{item.totalRows} )
  </foreach>
</insert>

【方法 3️⃣】不修改接口,将参数封装成map对象(适用于多个参数情况)这里添加了一个 schemaName 参数:

// 将参数封装
HashMap<String, Object> parameter = new HashMap<>(2);
parameter.put("insertList", statisticalInfoList);
parameter.put("schemaName", schemaName);

mapper文件里的SQL参数类型修改【parameterType=“map”】collection值修改成map对应的key值【collection=“insertList”】:

<insert id="batchInsertStatisticalInfo" parameterType="map">
  insert into ${schemaName}stat_data_source (id, table_name, group_time, total_rows)
  values
  <foreach collection="insertList" index="index" item="item" separator=",">
    ( #{item.id}, #{item.tableName}, #{item.groupTime}, #{item.totalRows} )
  </foreach>
</insert>

注意: 如果你传入的参数是List对象,而collection写的却是array【collection=“array”】

<insert id="batchInsert" parameterType="com.xxx.StatisticalInfo">
  insert into statistical_info (id, table_name, group_time, total_rows)
  values
  <foreach collection="array" index="index" item="item" separator=",">
    ( #{item.id}, #{item.tableName}, #{item.groupTime}, #{item.totalRows} )
  </foreach>
</insert>

将会报如下错误:

nested exception is org.apache.ibatis.binding.BindingException: 
Parameter 'array' not found. Available parameters are [collection, list]

使用时要特别注意 😂

总结

在mapper接口文件里使用@Param(“”)注解一下参数是很好的习惯,在编码过程中IDE会验证 mapper 文件里的接收到的参数,更不容易出错 💯

目录
相关文章
|
4月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
5月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
110 10
|
5月前
|
SQL Java 数据库连接
Mybatis中传入不同类型的值处理方案
这篇文章讲述了在Mybatis中如何处理传入不同类型参数的情况,包括单个值、列表及Map等,并提供了相应的XML映射和Java代码示例。
174 0
|
6月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
9月前
|
Java 数据库连接 mybatis
mybatis参数报错Parameter ‘docId‘ not found. Available parameters are [arg1, arg0, param1, param2]
mybatis参数报错Parameter ‘docId‘ not found. Available parameters are [arg1, arg0, param1, param2]
|
10月前
四种解决”Arg list too long”参数列表过长的办法
这些方法都可以帮助你避免因参数列表过长而导致的错误。选择方法取决于具体情况和需求。
422 0
|
10月前
|
前端开发 Java 数据库连接
若依 mybatis报错nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘XXX‘ 错误
若依 mybatis报错nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘XXX‘ 错误
262 0
|
10月前
|
存储 XML Java
mybatis使用内部类处理一对多类型数据2
mybatis使用内部类处理一对多类型数据2
93 0
|
10月前
|
XML Java 数据库连接
mybatis报错:java.lang.IllegalArgumentException: Mapped Statements collection does not contain
mybatis报错:java.lang.IllegalArgumentException: Mapped Statements collection does not contain

热门文章

最新文章