版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ycd500756/article/details/83997285
记录一次在mybatis中的批量更新操作。
需求
目前有一张信息跟踪表t_vuln_track
,需要实现批量更新表中的status
(状态)、repair_date
(修复时间)、unrepaired_months
月份数。
基础case
when
的语法接口拼接处达到批量更新效果的sql语句。
1.接口的定义
int batchUpdate(List<VulnTrack> vulnTrackList);
2.xml文件中接口的实现
<update id="batchUpdate" parameterType="list">
UPDATE t_vuln_track
<trim prefix="set" suffixOverrides=",">
<trim prefix="status = case" suffix="end,">
<foreach collection="list" item="item" >
<if test="item.status != null">
WHEN vlu_id=#{item.vluId} AND host_ip=#{item.hostIp} THEN #{item.status}
</if>
</foreach>
</trim>
<trim prefix="repair_date = case" suffix="end,">
<foreach collection="list" item="item" >
<if test="item.repairDate != null">
WHEN vlu_id=#{item.vluId} AND host_ip=#{item.hostIp} THEN #{item.repairDate}
</if>
</foreach>
</trim>
<trim prefix="unrepaired_months = case" suffix="end,">
<foreach collection="list" item="item" >
<if test="item.unrepairedMonths != null">
WHEN vlu_id=#{item.vluId} AND host_ip=#{item.hostIp} THEN #{item.unrepairedMonths}
</if>
</foreach>
</trim>
</trim>
WHERE 1=1 AND vlu_id IN
<foreach collection="list" item="item" index="index" separator=" ," open="(" close=")">
#{item.vluId}
</foreach>
AND host_ip IN
<foreach collection="list" item="item" index="index" separator=" ," open="(" close=")">
#{item.hostIp}
</foreach>
</update>
主要关注的点如下图:
3.调用方法的伪代码
@Test
public void testBatchUpdate(){
VulnTrack vulnTrack = new VulnTrack();
vulnTrack.setVluId("89051");
vulnTrack.setHostIp("10.253.36.205");
vulnTrack.setStatus(2);
vulnTrack.setRepairDate(new Date());
vulnTrack.setUnrepairedMonths(1);
VulnTrack vulnTrack2 = new VulnTrack();
vulnTrack2.setVluId("89051");
vulnTrack2.setHostIp("10.253.36.204");
vulnTrack2.setStatus(3);
vulnTrack2.setRepairDate(new Date());
vulnTrack2.setUnrepairedMonths(10);
List<VulnTrack> list = Arrays.asList(vulnTrack,vulnTrack2);
vulnTrackDao.batchUpdate(list);
}
4.得到的预编译的sql语句
UPDATE t_vuln_track
set status = case
WHEN vlu_id=? AND host_ip=? THEN ?
WHEN vlu_id=? AND host_ip=? THEN ? end,
repair_date = case
WHEN vlu_id=? AND host_ip=? THEN ?
WHEN vlu_id=? AND host_ip=? THEN ? end,
unrepaired_months = case
WHEN vlu_id=? AND host_ip=? THEN ?
WHEN vlu_id=? AND host_ip=? THEN ? end
WHERE 1=1 AND vlu_id IN ( ? , ? ) AND host_ip IN ( ? , ? )
最后一次更新:
地点:广州华景新城
时间:2018-11-12