最近参加了一个SSM的项目,在项目中经常需要循环遍历集合,而mybatis也能很好的支持数组和List,Set接口的集合,对此提供遍历集合。本文主要是对foreach元素使用的详细说明,希望能对大家有所帮助。
业务情景
在查询一个学生的相关信息,但是学生的学号来源于一个List集合,具体选择哪个学生信息显示还是需要list集合来确定
先看mybatis中方法
<select id="queryAllStudentTotalScore" resultType="com.dmsdbj.itoo.examinationEvaluation.entity.StudentScoreEntity">
SELECT * FROM
v_countstudentscore v
INNER JOIN t_paper_record pr ON pr.paper_id = v.tTemplatePaperId
WHERE
(v.studentId IN
<foreach item = "studentId" index="index" collection = "studentIds"
open = "(" separator= "," close=")" >#{studentId}
</foreach>
AND v.tTemplatePaperId = #{paperId}
AND v.examTypeId = #{paperTypeId}
AND pr.mark_status = '0')
</select>
再看Dao的写法
/**
* 根据paperid查询没有判分的所有学生(不区分上课班)-贾文静-2017年8月30日09:07:35
* @param paperId 试卷id
* @param studentIds 学生id集合
* @param paperTypeId 考试类型id
* @return
*/
List<StudentScoreEntity> queryAllStudentTotalScore(@Param("paperId")String paperId, @Param("studentIds")List<String> studentIds, @Param("paperTypeId") String paperTypeId);
foreach参数解释
item:配置的是循环中当前的元素
index:当前元素在集合中索引值
collection:Dao层配置传入的集合名称,在dao中传递的是studentIds,所以collection=“studentIds”
open和close:配置的是以什么符合将这些集合元素包装起来
separator:各个元素的间隔符
最后那个#{studentId}其实在dao没有传入值,#{studentId}是当前正在匹配的元素的值,与item使用的元素为同一个值
说明
在sql中使用in常常使用,但是大数据的in语句需要特别注意,in对消耗大量的性能,尤其是互联网项目,性能特别宝贵,还有一些数据库的SQL对执行长度也有限制,所以在使用的时候要预估一下这个collection对象的长度。
【总结】
这是小白成长的道路,慢慢摸索中!