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值。 |