MyBatis foreach的一些使用
阿新 • • 發佈:2018-12-09
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);