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 文件里的接收到的参数,更不容易出错 💯

目录
相关文章
|
10月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
6月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
594 13
|
5月前
|
SQL Java 数据库连接
MyBatis的配置文件中定义类型别名(type aliases)的技巧。
类型别名提供了一种便捷的方式来引用复杂的全限定类名。通过使用 `<package>`标签进行自动扫描或使用 `<typeAlias>`标签手动指定,可以在整个MyBatis配置中提高清晰度和维护性。无论是简化mapper文件中的配置,还是提高整体的配置可读性,类型别名都是一个非常有用的配置工具。
243 0
|
10月前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
2291 1
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
2071 5
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
456 10
|
消息中间件 存储 监控
redis 的List类型 实现 排行榜
【10月更文挑战第8天】
211 2
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
169 3

热门文章

最新文章