方式1 传入map
将要传递的id都存到一个List中,将List存到要传参的map中,并给List一个键名,在collection中就配置这个键名,然后就能成功解析遍历了。
//使用<foreach>传入map集合,其中map中的值为对象做查询
Map<String,Object> stuMap = new HashMap<>();
List<Integer> stuList = new ArrayList<>();
stuList.add(8);
stuList.add(9);
stuList.add(10);
stuList.add(11);
stuMap.put("stuList", stuList);
List<Student> list3 = sd.findStudentList3(stuMap);
System.out.println("用foreach传map值做查询:"+list3);
<!-- foreach实现in查询 -->
<select id="findStudentList3" parameterType="map" resultMap="age">
select * from student where id in
<foreach collection="stuList" index="ind" item="ite" open="(" separator="," close=")">
#{ite}
</foreach>
</select>
<resultMap id="age" type="Student">
<result column="stu_age" property="age" />
</resultMap>
方式2 传入对象
传入对象,对象中有list
int queryTotal(InnerReconDaily reqDTO);
其中accNos是reqDTO中的list元素。
<if test="accNos !=null and accNos.size()>0">
and acc_no in
<foreach collection="accNos" index="index" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
问题注意:当我添加另外一个参数(accNo == null or accNo = ‘’)的限制时,出错The expression ‘accNos’ evaluated to a null value;去掉后正常。目前原因还不太清楚。
<if test="(accNo == null or accNo = '') and accNos !=null and accNos.size()>0">
and acc_no in
<foreach collection="accNos" index="index" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
此外
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可
以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key 下面分别来看看上述三种情况的示例代码:
1.单参数List的类型:
<select id="dynamicForeachTest" resultType="Blog">
select * from t_blog where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
若传入的是List类型 在Mapper文件中处理过后,SQL如下:(直接引用注解中的参数名字,这样mybatis会忽略类型,按名字引入)
<select id="dynamicForeachTest" resultType="Blog">
select * from t_blog where id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
上述collection的值为list,对应的Mapper是这样的
public List dynamicForeachTest(List ids);
若是传入的是的是List类型的 可能会报出两个参数的异常,这时我们可以用Mybatis官方的注解@Param
public List dynamicForeachTest(@Param(“ids”)List ids);