批量更新的使用,mybatis中批量更新有很多种方法,可以把数据一条条更新,也可以传入一个数据集一次性更新,对于数据量不多的情况下(只有几千条)这种一次性更新就可以。数据量多可以使用多线程将数据分成多个集合后进行数据分批更新。
第一步:创建实体类DTO,数据更新时只接收id,data两个参数
package com.keypersonnelinformation.keypersonnel.model.dto;
import lombok.Data;
/**
* 全量更新身份证号码
*
* @Author linht
* @Date 2022/6/16 10:38
**/
@Data
public class UpdateIdCardDTO {
/**
* 主键
*/
private Integer id;
/**
* data_info
*/
private String dataInfo;
}
第二步:编写查询数据库数据的mapper和mapper.xml
/**
* 查询全表数据
*/
List<UpdateIdCardDTO> dataInfoList();
/**
* 全量更新dataInfo(身份证小写转大写)
*/
Integer updateIdCard(List<UpdateIdCardDTO> list);
<!-- 全量更新身份证 -->
<update id="updateIdCard">
update personal_data
<set>
<trim prefix="data_info = case" suffix="end,">
<foreach collection="list" item="item" index="index">
<if test="item.dataInfo != null">
when id=#{item.id} then #{item.dataInfo}
</if>
</foreach>
</trim>
</set>
where id in
<foreach collection="list" separator="," item="item" open="(" close=")">
#{item.id}
</foreach>
</update>
<select id="dataInfoList"
resultType="com.keypersonnelinformation.keypersonnel.model.dto.UpdateIdCardDTO">
select id,data_info as dataInfo from personal_data
</select>
第三步:测试使用(通过查询数据库的字符串,并使用正则表达式提取身份证号,将小写转为大写),数据量不多。只有几百条的情况。
@Test
void contextLoads() {
List<UpdateIdCardDTO> updateIdCardDTOS = personalDataMapper.dataInfoList();
updateIdCardDTOS.parallelStream().forEach(j ->{
j.setDataInfo(upCase(j.getDataInfo()));
});
Integer integer = personalDataMapper.updateIdCard(updateIdCardDTOS);
System.out.println("integer = " + integer);
}
public static String upCase(String json) {
StringBuilder stringBuilder = new StringBuilder();
//正则匹配规则,提取身份证号
String regex = "(?<=\"id_card\": \").*?(?=\")|(?<=\"certificate_number\": \").*?(?=\")";
Matcher matcher = Pattern.compile(regex).matcher(json);
while (matcher.find()){
matcher.appendReplacement(stringBuilder,matcher.group().toUpperCase());
}
matcher.appendTail(stringBuilder);
return String.valueOf(stringBuilder);
}