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,实际上如果你在传入参数的时候,在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<Blog>dynamicForeachTest(List<Integer>ids);
测试代码:
    @Test
    public voiddynamicForeachTest() {
       SqlSessionsession = Util.getSqlSessionFactory().openSession();
       BlogMapperblogMapper = session.getMapper(BlogMapper.class);
      List<Integer> ids = newArrayList<Integer>();
      ids.add(1);
      ids.add(3);
      ids.add(6);
      List<Blog> blogs =blogMapper.dynamicForeachTest(ids);
       for (Blogblog : 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<Blog>dynamicForeach2Test(int[] ids);
对应的测试代码:
    @Test
    public voiddynamicForeach2Test() {
       SqlSessionsession = Util.getSqlSessionFactory().openSession();
       BlogMapperblogMapper = session.getMapper(BlogMapper.class);
       int[] ids =new int[] {1,3,6,9};
      List<Blog> blogs =blogMapper.dynamicForeach2Test(ids);
       for (Blogblog : blogs)
         System.out.println(blog);
      session.close();
    }
3.自己把参数封装成Map的类型
   <select id="dynamicForeach3Test"resultType="Blog">
       SELECT C.*,'1' AS ACCOUNT_TYPE FROM T_CUSTOMER C WHERE
        EXISTS(SELECT 1 FROM T_ACCOUNT_INFO AI WHERE AI.CUST_ID=C.CUST_ID
        <if test="isDefault!= null and isDefault!= ''">
            AND AI.IS_DEFAULT=#{isDefault}
        </if>
        <if test="accountCode!= null and accountCode!= ''">
            AND AI.ACCOUNT_CODE=#{accountCode}
        </if>
        <if test="accountArea!= null and accountArea!= ''">
            AND AI.ACCOUNT_AREA=#{accountArea}
        </if>
        <if test="accountInfo!= null and accountInfo!= ''">
            AND AI.ACCOUNT_INFO=#{accountInfo}
        </if>
        <if test="subBankName!= null and subBankName!= ''">
            AND AI.SUBBANK_NAME LIKE '%' || #{subBankName} || '%'
        </if>
        <if test="merchantNo!= null and merchantNo!= ''">
            AND AI.MERCHANT_NO=#{merchantNo}
        </if>
        )
        <if test="custName!= null and custName!= ''">
            AND C.CUST_NAME LIKE '%'||#{custName}||'%'
        </if>
        <if test="contactPerson!= null and contactPerson!= ''">
            AND C.CONTACT_PERSON LIKE '%'||#{contactPerson}||'%'
        </if>
        <if test="areaCode!= null and areaCode!= ''">
            AND C.AREA_CODE=#{areaCode}
        </if>
        <if test="cityCode!= null and cityCode!= ''">
            AND C.CITY_CODE=#{cityCode}
        </if>
        <if test="province!= null and province!= ''">
            AND C.PROVINCE=#{province}
        </if>
        <if test="custStatus!= null and custStatus!= ''">
            AND C.CUST_STATUS=#{custStatus}
        </if>
        AND EXISTS(SELECT 1 FROM T_ORDER O WHERE O.SUPPLY_ID=C.CUST_ID
        <if test="orderStatuss!= null and orderStatuss!= ''">
        <foreach collection="orderStatuss" index="index" item="id"
            open=" AND O.ORDER_STATUS IN(" separator="," close=") ">
            ${id}
        </foreach>
        </if>
        <if test="flowId!= null and flowId!= ''">
            AND O.FLOW_ID=#{flowId}
        </if>
        <if test="startDate!= null and startDate!= ''">
            AND O.UPDATE_DATE > to_date(#{startDate},'yyyy-mm-dd hh24:mi:ss')
        </if>
        <if test="endDate!= null and endDate!= ''">
            AND to_date(#{endDate},'yyyy-mm-dd hh24:mi:ss') > O.UPDATE_DATE
        </if>
        <if test="payType!= null and payType!= ''">
            AND EXISTS(SELECT 1 FROM T_ORDER_PAY WHERE
            ORDER_ID IN
            (SELECT ORDER_ID FROM T_ORDER O WHERE O.SUPPLY_ID=C.CUST_ID)
            AND PAY_TYPE=#{payType}
            )
        </if>
        )
      </foreach>
   </select>
上述collection的值为orderStatuss,是传入的参数Map的key,对应的Mapper代码:
public List<Blog>dynamicForeach3Test(Map<String,Object> params);
对应测试代码:
    @Test
    public voiddynamicForeach3Test() {
       SqlSessionsession = Util.getSqlSessionFactory().openSession();
       BlogMapperblogMapper = session.getMapper(BlogMapper.class);
       Map<String,Object> condition=new HashMap<String,Object>();
        condition.put("orderStatuss", orderStatuss);
        condition.put("flowId", flowId);
        condition.put("startDate", startDate);
        condition.put("endDate", endDate);
        condition.put("custStatus", "1");
        condition.put("payType", payType);
        condition.put("loginName", loginName);
        condition.put("accountCode", accountCode);
        condition.put("accountInfo", accountInfo);
        condition.put("accountArea", accountArea);
        condition.put("subBankName", subBankName);
        condition.put("merchantNo", merchantNo);
        condition.put("isDefault", "1");
      List<Blog> blogs =blogMapper.dynamicForeach3Test(condition);
       for (Blogblog : blogs)
         System.out.println(blog);
      session.close();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值