项目中遇到一个需求,查询条件里有一个是下拉复选,需要在map集合里传一个list或者数组,总结一下
1,传一个普通的map
java代码里
HashMap<String,Object> map = new HashMap<String, Object>();
map.put("gender", "男");
map.put("name", "a");
xml里接收
<select id="findUser" parameterType="Map" resultType="user">
select from user
where
1=1
<if test="gender !=null and gender !=''">
and gender = #{gender}
</if>
<if test="name !=null and name !=''">
and name = #{name}
</if>
</select>
2,传一个数组
java
String arrayIds[] = {"1","3","5"};
xml
<delete id="deleteAll" parameterType="String">
delete from
user
where
id in
<foreach item="item" index="index" collection="array" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
item名称可以自定义,collection名称传入数组时固定为'array'
3,传入list集合
java
List<String> ids = Arrays.asList("1","2","3");
xml
<delete id="deleteByIds" parameterType="java.util.List">
delete from
user
where
id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
这里跟传入数组差不多,不过list集合在mybatis里的key是'list'
3,传入带数组或list的map集合
java
HashMap<String,Object> map = new HashMap<String, Object>();
String cardnums[] = {"001","002","005"};
List<Sring> ids = Arrays.asList("1","2","3");
map.put("gender", "男");
map.put("cardnums",cardnums);
map.put("ids",ids);
xml
<select id="findUser" parameterType="map" resultType="user">
select from user
where
1=1
<if test="gender !=null and gender !=''">
and gender = #{gender}
</if>
<if test="cardnums !=null and cardnums.size() >0">
and cardnum in
<foreach collection="cardnums" item="num" index="index" open="(" separator="," close=")">
#{num}
</foreach>
</if>
<if test="ids !=null and ids.length >0">
and id in
<foreach collection="ids" item="id" index="index" open="(" separator="," close=")">
${id}
</foreach>
</if>
</select>
执行这一段的时候发现始终没有进去数组部分的判断条件,删除判断空数组的控制再尝试后,有报错提示
'cardnums' evaluated to a null value
查找原因后发现mybatis不支持map传数组参数,需要把数组转换成list
map传list参数有几个注意点
- 以map参数的形式传入数组和list集合,此时collection里的key为map集合里定义的key
- list遍历时用的是${itemName} 或者#{listName}[index]