foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔 符,
close表示以什么结束。
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有以下4种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list,也可以为参数名,其中参数名还需要用@Param(“”)注释 。
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array,也可以为参数名,其中参数名还需要用@Param(“”)注释 。
3. 如果传入的参数是多个的时候,collection属性的值为参数名,其中参数名还需要用@Param(“”)注释 。如( 注:在Mapper中,sql语句的每行以”,”隔开,sql中使用引号的地方写为单引号),每行语句用"包括起来):
@Select({
"<script>",
"select",
"status",
"from corp_info",
"where corp_id=#{corpId,jdbcType=VARCHAR}" ,
"and busi_id in",
"<foreach collection='busiIds' item='item' open='(' separator=',' close=')'>",
"#{item,jdbcType=CHAR}",
"</foreach>",
"and cardno=#{cardno,jdbcType=VARCHAR}",
"</script>"
})
String selectCustAccStatus(@Param("corpId")String corpId, @Param("busiIds") List<String> busiIds, @Param("cardno")String cardno);
4. 如果传入的参数是个Map的时候,Map可以包含sql语句的所有参数,collection的属性值为map的key,例子如(例子摘抄博客https://www.cnblogs.com/fangyu19900812/p/6046209.html):
<select id="dynamicForeach3Test" parameterType="java.util.HashMap" resultType="Blog">
select * from t_blog where title like "%"#{title}"%" and id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach>
</select>
@Test
public void dynamicForeach3Test() {
SqlSession session = Util.getSqlSessionFactory().openSession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
final List ids = new ArrayList();
ids.add(1);
ids.add(2);
ids.add(3);
ids.add(6);
ids.add(7);
ids.add(9);
Map params = new HashMap();
params.put("ids", ids);
params.put("title", "中国");
List blogs = blogMapper.dynamicForeach3Test(params);
for (Blog blog : blogs)
System.out.println(blog);
session.close();
}
foreach还可以用作批量插入数据,批量插入来减少一个事务中执行sql语句的数量,达到提高效率的目的,但是注意一个sql语句长度有限,故List的size不应该太大,对于较大的List,可通过ListUtils的 List<List> partition(final List list, final int size)来划分为多个表,然后在循环多次执行sql,sql语句的写法如
@Insert({
"<script>",
"insert into member",
"<trim prefix='(' suffix=')' suffixOverrides=','>",
"<if test='user != null'>user,</if>",
"<if test='collect != null'>collect,</if>",
"created_date,",
"last_modified_date,",
"</trim>",
"<trim prefix='values (' suffix=')' suffixOverrides=','>",
"<foreach collection='memberList' item='record' separator=','> ",
"<if test='record.user != null'>#{record.user,jdbcType=INTEGER},</if>",
"<if test='record.collect != null'>#{record.collect,jdbcType=INTEGER},</if>",
"current_timestamp(3),",
"current_timestamp(3),",
"</foreach> ",
"</trim>",
"</script>"
})
int batchInsert(List<CollectMember> memberList);