在项目开发中经常需要用到数据的批量操作,有时候对于出现的问题,经常没办法解决,这里把项目中遇到的问题记录一下。
这里不讨论动态SQL中if
的用法,主要关注于foreach
。
批量插入
1、XML中sql的写法
- collection属性的值表示指定的参数类型,是list,还是array,或者是map。
- item属性的值是对list中元素的一个指定,自己定义。
- 关于foreach中的括号可以用我下面那样直接写,也使用使用open属性和close属性表示。如下;
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
<!-- 批量插入 -->
<insert id="insertMpsRequireList" parameterType="java.util.List">
INSERT INTO mps_require_gather_if(
id,
order_no,
mds_item_id,
req_qty,
req_date,
batch_no,
compact_no,
customer_id
)
VALUES
<foreach collection="list" item="mpsRequire" index="index" separator=",">
(
#{mpsRequire.id},
#{mpsRequire.orderNo},
#{mpsRequire.mdsItemId},
#{mpsRequire.reqQty},
#{mpsRequire.reqDate},
#{mpsRequire.batchNo},
#{mpsRequire.compactNo},
#{mpsRequire.customerId}
)
</foreach>
</insert>
2、Mapper中写法
/**
* 批量插入
* @param list
* @return
*/
int insertMpsRequireList(List<MpsRequire> mpsRequireList);
批量修改
1、XML中的sql写法
动态修改时和批量插入没啥区别。
- 主要在于
if
条件中,字段中 逗号问题,使用<trim>
进行解决。
<!-- 批量修改状态 -->
<update id = "updateByListId" parameterType="java.util.List">
<foreach collection="list" item="mpsRequire" separator=";">
update mps_require_gather_if
<trim prefix="set" suffixOverrides=",">
<if test="mpsRequire.state != null and mpsRequire.state != ''">
state = #{mpsRequire.state},
</if>
<if test="mpsRequire.reqQty != null and mpsRequire.reqQty != ''">
req_qty = #{mpsRequire.reqQty},
</if>
<if test="mpsRequire.reqDate != null and mpsRequire.reqDate != ''">
req_date = #{mpsRequire.reqDate}
</if>
</trim>
where id = #{mpsRequire.id}
</foreach>
</update>
2,mapper中写法
在使用IN条件查询时,需要使用list进行数据保存,我在PO类中定义了一个 对应字段的 list (stateList)。
- 这时collectin属性要的值必须是
stateList
,不然会报错,我在使用中是这样的。
int updateByListId(List<MpsRequire> mpsRequireList);
条件IN查询,froeach的使用
<select id="findList" resultType="MpsRequire" >
SELECT
<include refid="mpsRequireGatherColumns"/>
FROM mps_require_gather_if a
<include refid="mpsRequireGatherJoins"/>
<where>
${dataScope}
<if test="stateList != null and stateList.size != 0">
AND a.state in
<foreach collection = "stateList" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="orderNo != null and orderNo != ''">
AND a.order_no like
<if test="dbName == 'oracle'">'%'||#{orderNo}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{orderNo}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{orderNo},'%')</if>
</if>
</where>
</select>
2、mapper的写法
List<MpsRequire> findList(MpsRequire mpsRequire)