决解 Mybatis 传递 List 集合报错 Available parameters are [collection, list]
完整错误
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'customerIdList' not found. Available parameters are [arg0, collection, list]
解释:
当我们传递一个 List
实例或者数组作为参数对象传给 MyBatis
。当你这么做的时候,MyBatis
会自动将它包装在一个 Map
中,用名称在作为键。List
实例将会以list
作为键,而数组实例将会以array
作为键。所以,当我们传递的是一个List
集合时,mybatis
会自动把我们的list
集合包装成以list
为Key
值的map
。
错误代码:
// DAO 层:
Long selectCustomerCountList( List customerIdList);
// XML文件:
<select id="selectCustomerCountList" parameterType="java.util.List" resultType="java.lang.Long">
select count(1) from np_customer_info where id in
<foreach item="item" collection="customerIdList" separator="," open="(" close=")" index=""> #{item, jdbcType=INTEGER}
</foreach>
</select>
注意:
DAO
层接口的参数名与XML
文件中的collection
的属性值一致,是导致的问题的主要原因。
解决方法
第一种
- 利用
Mybatis
给我们的封装进行XML
配置,将我们的XML
中collection
属性值设置为list
。
// DAO 层:
Long selectCustomerCountList( List customerIdList);
// XML文件:
<select id="selectCustomerCountList" parameterType="java.util.List" resultType="java.lang.Long">
select count(1) from np_customer_info where id in
<foreach item="item" collection="list" separator="," open="(" close=")" index=""> #{item, jdbcType=INTEGER}
</foreach>
</select>
注意:此时
collection
强制指定为list
且不可改变
第二种
- 利用注解
@Param
指定我们的入参名称
// DAO层:
Long selectCustomerCountList(@Param("customerIdList") List customerIdList);
// XML文件:
<select id="selectCustomerCountList" parameterType="java.util.List" resultType="java.lang.Long">
select count(1) from np_customer_info where id in
<foreach item="item" collection="customerIdList" separator="," open="(" close=")" index=""> #{item, jdbcType=INTEGER}
</foreach>
</select>
注意: 此时的
DAO
层参数名可以@Param("customerIdList")
与 collection的属性值一致
第三种
- 将我们的List包装成Map参数进行传递
// 在Service业务处理层次上面将参数进行包装
public Long selectCustomerCountMap(List customerIdList) {
Map maps = new HashMap();
maps.put("customerIds", customerIdList);
return customerMapper.selectCustomerCountMap(maps);
}
// DAO层:
Long selectCustomerCountMap(Map maps);
// XML文件:
<select id="selectCustomerCountMap" parameterType="java.util.Map" resultType="java.lang.Long">
select count(1) from np_customer_info where id in
<foreach item="item" collection="customerIds" separator="," open="(" close=")" index=""> #{item, jdbcType=INTEGER}
</foreach>
</select>
注意: 入参类型是
java.util.Map
而不再是List
,此时的collection
属性值为Map
中的Key
值。
参考文章:点我去原文