mybatis 中 foreach collection的三种用法
转载:https://www.cnblogs.com/fangyu19900812/p/6046209.html
foreach主要用在构建in条件中,它可以在sql语句中进行迭代的一个集合
foreach元素的属性主要有collection,item,index,open,close,separator
item:表示集合中每个元素迭代的别名
index:指定一个名字,用于表示迭代过程中,每次迭代到的位置。
open:表示该语句以什么开始
close:表示该语句以什么结束
separator:表示在每次进行迭代之间以什么符号作为分割符
使用foreach,最重要也是最容易出错的属性是collection属性,主要有一下三种使用方式:
1.如果传入的是单参数且参数类型是List,collection的属性值为list;
2.如果传入的是但参数且参数类型是Array,collection的属性值为array;
3.如果传入的是多个参数的时候,需要把参数封装成Map,当然但参数已可以封装成Map。实际上当我们传入参数的时候,breast里面会把他封装成Map,其中key就是参数名称,所以这时候collection属性的值就是传入list或者是array对象在Map中的key。下面详细介绍该三种方式的使用:
1.单参数list类型
1 <select id="dynamicForeachTest" parameterType="java.util.List" resultType="Blog">
2 select * from t_blog where id in
3 <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
4 #{item}
5 </foreach>
6 </select>
上述collection的值为list,对应的Mapper是这样的
public List dynamicForeachTest(List ids);
测试代码:
@Test
2 public void dynamicForeachTest() {
3 SqlSession session = Util.getSqlSessionFactory().openSession();
4 BlogMapper blogMapper = session.getMapper(BlogMapper.class);
5 List ids = new ArrayList();
6 ids.add(1);
7 ids.add(3);
8 ids.add(6);
9 List blogs = blogMapper.dynamicForeachTest(ids);
10 for (Blog blog : blogs)
11 System.out.println(blog);
12 session.close();
13 }
2.单参数array
<select id="findClassById" resultType="com.sjy.eval.mobile.teacher.vo.v1.SchoolClassVo">
SELECT DISTINCT
`code` AS classCode,
`name` AS className,
`school_code` AS schoolCode,
`year_grade_code` AS gradeCode
FROM
`d_class`
<where>
`code` IN
<foreach item="item" collection="array" separator="," open="(" close=")" index="">
#{item}
</foreach>
</where>
</select>
上述collection为array,对应的Mapper代码:
List<SchoolClassVo> findClassById(String[] classCodeStr);
3.多参数,把多个参数封装在Map中
SELECT d.id AS parentExamId,
d.name,FROM
report_class_parent_outline a
JOIN `e_base_exam` d
ON a.`parent_exam_id` = d.`id`
JOIN d_class b
ON a.`class_id` = b.`code`
LEFT JOIN u_teacher c
ON b.`class_teacher_code` = c.`code`
WHERE d.`grade_id` = #{gradeId}
AND A.`class_id` IN
<foreach collection="classStr" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
AND a.`school_id` = #{schoolCode}
上述collection的值为classStr,是传入的参数Map的key,对应的Mapper代码:
Map map = new HashMap();
map.put("schoolCode", schoolCode);
map.put("gradeId", gradeId);
map.put("classStr", classStr);
List list = comprehensiveReportServiceMapper.getAllPreviousThreeCompare(map);