Mybtis的批量更新

版权声明:本文为博主原创文章,未经博主允许不得转载。 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文件中接口的实现

官网关于动态SQL的介绍
case when语法的demo

  <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

猜你喜欢

转载自blog.csdn.net/ycd500756/article/details/83997285