Mybatis中foreach属性的含义

MyBatis的foreach语句详解

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。

foreach元素的属性主要有 item,index,collection,open,separator,close。
item集合中每一个元素进行迭代时的别名,
index表示在迭代过程中,每次迭代到的位置,
open该语句以什么开始,
separator在每次进行迭代之间以什么符号作为分隔 符,
close以什么结束,
在使用foreach的时候最关键的也是最容易出错的就是collection属性,
该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,
主要有一下3种情况:
1.     如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2.     如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3.    如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

1.eg:

<select id="getEmpsInNames" resultType="emp">

select * from emp where ename in
<foreach collection="list" index="index" item="name" open="("
separator="," close=")">
#{name}
</foreach>

</select>

对应的测试代码:

    @Test

    public void dynamicForeachTest() {
        SqlSession session = Util.getSqlSessionFactory().openSession();
        BlogMapper blogMapper = session.getMapper(BlogMapper.class);
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(1);
        ids.add(3);
        ids.add(6);
        List<Blog> blogs = blogMapper.dynamicForeachTest(ids);
        for (Blog blog : blogs)
            System.out.println(blog);
        session.close();
    }

2.eg:

<select id="dynamicForeach2Test" resultType="Blog">
        select * from t_blog where id in
        <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>

</select>

对应的测试代码:
    


   
   
  1. @Test
  2. public void dynamicForeach2Test() {
  3. SqlSession session = Util.getSqlSessionFactory().openSession();
  4. BlogMapper blogMapper = session.getMapper(BlogMapper. class);
  5. int[] ids = new int[] { 1, 3, 6, 9};
  6. List<Blog> blogs = blogMapper.dynamicForeach2Test(ids);
  7. for (Blog blog : blogs)
  8. System. out.println(blog);
  9. session.close();
  10. }

3.eg:

    自己把参数封装成Map的类型
    


   
   
  1. < select id= "dynamicForeach3Test" resultType= "Blog">
  2. select * from t_blog where title like "%" #{title}"%" and id in
  3. < foreach collection= "ids" index= "index" item= "item" open= "(" separator= "," close= ")">
  4. #{item}
  5. </ foreach>
  6. </ select>

上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:
public List<Blog> dynamicForeach3Test(Map<String, Object> params);
对应测试代码:
  


   
   
  1. @Test
  2. public void dynamicForeach3Test() {
  3. SqlSession session = Util.getSqlSessionFactory().openSession();
  4. BlogMapper blogMapper = session.getMapper(BlogMapper. class);
  5. final List<Integer> ids = new ArrayList<Integer>();
  6. ids. add( 1);
  7. ids. add( 2);
  8. ids. add( 3);
  9. ids. add( 6);
  10. ids. add( 7);
  11. ids. add( 9);
  12. Map<String, Object> params = new HashMap<String, Object>();
  13. params.put( "ids", ids);
  14. params.put( "title", "中国");
  15. List<Blog> blogs = blogMapper.dynamicForeach3Test( params);
  16. for (Blog blog : blogs)
  17. System. out.println(blog);
  18. session.close();
  19. }

再补充一点:

如果循环的对象为两个list的情况,写法如下:


   
   
  1. < select id= "findRelationListBySourceidAndTargetid" parameterType= "java.lang.String"
  2. resultType= "com.InstanceRelation">
  3. select sourceid,targetid from DM_ANALYSE_DATAFLOW where sourceid in
  4. < foreach item= "item" collection= "sourceids" separator= "," open= "(" close= ")" index= "">
  5. #{item}
  6. </ foreach>
  7. and targetid in
  8. < foreach item= "item" collection= "targetids" separator= "," open= "(" close= ")" index= "">
  9. #{item}
  10. </ foreach>
  11. </ select>

代码写法:


   
   
  1. List< InstanceRelation> findRelationList
  2. ( @Param( "sourceids") List< String> sourceids, @Param( "targetids") List< String> targetids);

需要指定参数