mybatis中foreach標籤詳解

東天裡的冬天發表於2017-07-19
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,實際上如果你在傳入引數的時候,在breast裡面也是會把它封裝成一個Map的,map的key就是引數名,所以這個時候collection屬性值就是傳入的List或array物件在自己封裝的map裡面的key 下面分別來看看上述三種情況的示例程式碼:


1.單引數List 型別

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


上述collection的值為list,對應的Mapper是這樣的
public List dynamicForeachTest(List ids);
測試程式碼:

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


2.單引數array陣列的型別:

<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>   

上述collection為array,對應的Mapper程式碼:
public List dynamicForeach2Test(int[] ids);
對應的測試程式碼:

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


3.自己把引數封裝成Map的型別

<select id="dynamicForeach3Test" 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>
上述collection的值為ids,是傳入的引數Map的key,對應的Mapper程式碼:
public List dynamicForeach3Test(Map params);
對應測試程式碼:

@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();
     }



相關文章