foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
1.
2.
3.
下面分别来看看上述三种情况的示例代码:
1.单参数List的类型:
上述collection的值为list,对应的Mapper是这样的
public List<Blog>dynamicForeachTest(List<Integer>ids);
测试代码:
2.单参数array数组的类型:
上述collection为array,对应的Mapper代码:
public List<Blog>dynamicForeach2Test(int[] ids);
对应的测试代码:
3.自己把参数封装成Map的类型
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>
)
上述collection的值为orderStatuss,是传入的参数Map的key,对应的Mapper代码:
public List<Blog>dynamicForeach3Test(Map<String,Object> params);
对应测试代码:
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");