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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值