Mybatis传递List集合

完整错误如下: 
org.apache.ibatis.binding.BindingException: Parameter ‘customerIdList’ not found. Available parameters are [collection, list]

解释: 
当我们传递一个 List 实例或者数组作为参数对象传给 MyBatis。当你这么做的时 候,MyBatis 会自动将它包装在一个 Map 中, 用名称在作为键。List 实例将会以“list” 作为键, 而数组实例将会以“array”作为键。所以,当我们传递的是一个 List 集合时,mybatis 会自动把我们的 list 集合包装成以 list 为 Key 值的 map。

1
2
3
4
5
6
7
8
9
10
11
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。

1
2
3
4
5
6
7
8
9
10
11
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 指定我们的入参名称

1
2
3
4
5
6
7
8
9
10
11
12
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 参数进行传递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在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值。