1、nested exception is org.apache.ibatis.binding. BindingException : Parameter 'idList' not found. Available parameters are [collection,list]
这个错误原因有多个:
(1)检查mapper(或dao)写的方法参数有没有绑定,如:
List<Aaa> queryByIdList(@param("idList")List<String>idList);
如果,没有@param("idList"),那么在mapper.xml里面用到idList则会报上面的异常。
当然也可以不需要写@param("idList"),这样的话需要在mapper.xml里面用到时是这样用的:
<if test="list!=null and list.size>0"> and id in <foreach item="item" index="index" collection="list" open="(" close=")" separator=","> #{item} </foreach> </if>
用collection="list" 而不是 collection="idList",这是因为当只传一个集合或者数组作为参数时,mybatis会讲其包装到Map中,集合会以“list”作为键,数组会以“array”作为键。
(2)检查param的包有没有导错,正确的包应该是org.apache.ibatis.annotations.Param,其实报错已经提示了:nested exception is org.apache.ibatis.binding
我就是导错包了,我导入的包是org.springframework.data.repository.query.Param,导致的报错。
2、Error querying database. xxxx:invalid comparison:java.util.ArrayList and java.lang.String
这个错误是mapper.xml中集合判空用了 idList !='' 导致的,其实跟java写法一样就可以了,如:
<if test="list!=null and list.size>0">xxx</if> 或者 <if test="list!=null and list.size()>0">xxx</if>
3、补充一下mybatis常用传参方式
(1)只有一个参数,可以不需要@Param。
如:Aaa queryAaa(String aa);
Select * from aaa_info where aa_status=#{aa}
(2)直接传对象,如:
dao的接口方法:List<Aaa> queryAaaList(AaaParam aaaParam);
mapper.xml中直接用AaaParam类中的属性就可以了。
比如AaaParam有属性aaStatus、aaBb、aaCc,那么可以直接在mapper.xml中使用如:Select * from aaa_info where aa_status=#{aaStatus} and aa_bb=#{aaBb} and aa_cc=#{aaCc}
(3)使用@Param绑定
如:List<Aaa> queryAaaList(@Param("dto")AaaParam aaaParam);
那么在xml中使用:Select * from aaa_info where aa_status=#{dto.aaStatus} and aa_bb=#{dto.aaBb} and aa_cc=#{dto.aaCc}
不一一列举了。