foreach元素主要用于对一个集合(List、Set、Map、数组)进行遍历
foreach支持如下属性
collection:指定要遍历的集合
【也就是传过来的参数,但是不能用param和arg0,要么注解指定参数名。要么用默认的参数名list/set/map/array,当然这个时候的参数只有一个】
index: 在map中代表key,其他集合可以不用指定
item:在map中代表value,其他集合代表当前遍历的元素,充当变量
open:循环开始处放置的字符串
close:循环结束出放置的字符串
separator:每次迭代之间的分隔符
tips:上述属性中最后三个属性与trim元素中的属性一致
select中使用foreach
查询news_id 在数组范围内的记录
<select id="queryNews" databaseId="mysql" resultMap="newsMapper">
select * from news_inf where news_id in
<foreach collection="arr" item="item" open="(" separator="," close=")">
#{item}
</foreach>
newsMapper.queryNews(new int[]{1,3});
insert中使用foreach(批量插入)
<insert id="insertNews" databaseId="mysql" >
insert into news_inf values
<foreach collection="list" item="news" separator=",">
(#{news.id},#{news.title},#{news.content},#{news.status})
</foreach>
</insert>
var news1 = new News(null,"title1","content1",null);
var news2 = new News(null,"title2","content2","ACTIVE");
var news3 = new News(null,"title3","content3","LAZY");
var list = new ArrayList<News>();
list.add(news1);
list.add(news2);
list.add(news3);
int i = newsMapper.insertNews(list);
update中使用foreach(批量更新)
<update id="updateNews" databaseId="mysql" >
update news_inf
<set>
<foreach collection="list" item="news" open="news_title=case" close="end," separator=" ">
<if test="news.title != null">
when news_id = #{news.id} then #{news.title}
</if>
</foreach>
<foreach collection="list" item="news" open="news_content=case" close="end" separator=" ">
<if test="news.content != null">
when news_id = #{news.id} then #{news.content}
</if>
</foreach>
</set>
<where>
news_id in (1,2,3)
</where>
</update>
News news1 = new News(1,"标题1","内容1",null);
News news2 = new News(2,"标题2","内容2",null);
News news3 = new News(3,"标题3","内容3",null);
var list = new ArrayList<News>();
list.add(news1);
list.add(news2);
list.add(news3);
var i = newsMapper.updateNews(list);
最后一个例子稍微复杂点,其中利用了case函数,说明了foreach可以灵活的完成一些复杂的动态sql语句