一、简单步骤解析
①引入SqlSessionTemplate,mapper接口
②根据需求写一个更新数据的批量处理方法(关掉自动提交,批次commit)
③将需要修改的数据对象list,传入批处理方法中处理(实际相当于传一个update的where条件内容)
④调用接口进行数据更新
⑤测试+日志+数据展示
二、代码模块示例
①引入SqlSessionTemplate,mapper接口
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
@Autowired
private AccMapper accMapper;
②根据需求写一个更新数据的批量处理方法(关掉自动提交,批次commit)
/**
* 批量更新数据(mybatisPlus)
*
* @param list 批量修改时的list对象(相当于where条件部分)
*/
private void updateBatchData(List<AccountDetail> list) {
//批量插入数据,通过sqlSession工厂类处理,openSession(ExecutorType.BATCH, false)选择批次提交,关掉自动提交
SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
try {
//指定mybatis的具体Mapper类
AccMapper jourMapper = sqlSession.getMapper(AccMapper.class);
AtomicInteger atomicInteger = new AtomicInteger();
for (int i = 0; i < list.size(); i++) {
AccountDetail accountDetail = new AccountDetail();
accountDetail.setOrderStatus("1");
QueryWrapper<AccountDetail> wrapper = new QueryWrapper<>();
wrapper.eq("AccDate",list.get(i).getAccDate());
wrapper.eq("UserNum",list.get(i).getUserNum());
wrapper.eq("OrderNum",list.get(i).getOrderNum());
int update = jourMapper.update(accountDetail, wrapper);
if (i % 500 == 0 || i == list.size() - 1) {
//每1000条数据,手动提交一次,提交后的数据无法回滚
sqlSession.commit();
//积累数据量太多容易导致内存溢出,所以每次提交后清理缓存,防止溢出
sqlSession.clearCache();
atomicInteger.incrementAndGet();
System.out.println("当前提交批次为:"+atomicInteger.get());
log.info("当前提交批次为:{},条数角标为:{}",atomicInteger.get(),i);
}
}
} catch (Exception e) {
log.info("批量更新失败:"+e);
//未提交的数据可以回滚
sqlSession.rollback();
} finally {
sqlSession.close();
}
}
③将需要修改的数据对象list,传入批处理方法中处理(实际相当于传一个update的where条件内容)
public void updateBatchMsg() {
//条件查询出要修改的数据
List<AccountDetail> selectList = accMapper.selectList(null);
//批量修改
updateBatchData(selectList);
}
④调用接口进行数据更新(此处用controller简单调用了一下)
@RestController
@RequestMapping("FileExec")
public class FileController {
@Autowired
private InsertTest insertTest;
@RequestMapping(value = "/updateBatchMsg", method = RequestMethod.GET)
public ResponseEntity<ResultModel> updateBatchMsg() {
insertTest.updateBatchMsg();
return new ResponseEntity<>(ResultModel.ok(), HttpStatus.OK);
}
}
⑤测试+日志+数据展示
?
?
?
|