在SpringBoot项目中对数据进行批量更新

在SpringBoot项目中对数据进行批量更新

说明:

1.在进行数据迁移的过程中体验了一把批量更新与单条更新的效率差异,在这里做个笔记。
2. 项目所用框架为SpringBoot,数据迁移时为了方便,并未在Mapper文件中定义resultMap,即未创建实体类,直接写入sql。
3. 这里只写出service与dao层方法,博主要做的事很简单:查询出数据表中需要更新的加密字段与主键,将其解密后根据主键重新set到原数据表中。
4. 只适合同博主一样刚入职不久的菜鸟小白。在SpringBoot项目中对数据进行批量更新_第1张图片

步骤:

一:

1.查询出表中需要进行更新的字段与表主键,这里以表主键id和字段acct_no为例,它们各自的数据类型如下:

查询字段 字段类型
id int
acct_no string

2.Service层代码:

//使用@Test注解
@Test
public void getTTranBillSettle()throws Exception{
   //从表中可以看出其字段类型不同,因此需用List>作为查询结   果的返回值类型;
   List> tTranBillSettle =accountMapper.getTTranBillSettleList();
   //定义新的List> result 以接收解密后的map
   List> result = new ArrayList>();
   //定义一个变量i,为批量更新做准备。
   int i = 0;
   for (Map map:tTranBillSettle){
    	//每循环一次必须定义新的map,注意不能写在循环外,写在循环外map中将只剩下一条数据。
        Map mm = new HashMap<>();
        //id不需要解密,acct_no则用公司内部方法解密,放入新定义的map中。
        mm.put("id",map.get("id")
//数据库中acct_no字段类型为varchar类型,内部解密方法也要求传入String类型,故用 String.valueOf对Object类型进行转化。
mm.put("acct_no",CIPEncryptionUtils.decryptSensitiveInformationBidirectional(String.valueOf(map.get("acct_no"))));
        result.add(mm);
        //i随循环次数递增。
        i = i + 1;
        //自定义批量更新条数,例如:每当i为5000的倍数时,将  result内的5000条数据进行更新;当i递增为集合长度时再次更新。
        if (i % 5000 == 0 || i == tTranBillSettle.size())
            int j = accountMapper.updateTTranBillSettle(result);
            if(j>0){
                System.out.println("============批量更新至第"+ i +"条数据===========");
            }
            //每更新完一批数据,在result内进行删除操作。
            result.clear();
        }
    }
}

3.dao层只是方法的调用,这里还是写一下:

public interface AccountMapper {
    List> getAccountListMap();

    List> getTTranBillSettleList();
    
    //批量更新,传入list集合。
    int updateTTranBillSettle(List> list);

 }

4.mapper文件中只有如下SQL:




//注意sql语句应被;分隔开,否则批量更新多少条数据就有多少条sql拼在一起。

    update t_tran_bill_settle_tz
    
        //可用item.属性的方式传入数据。
        acct_no = #{item.acct_no,jdbcType=VARCHAR}
    
    WHERE id =  #{item.id,jdbcType=VARCHAR}


你可能感兴趣的:(springBoot)