1. 程式人生 > >MyBatis foreach的一些使用

MyBatis foreach的一些使用

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