当前位置:   article > 正文

mybatisPlus的sqlSessionTemplate批量修改(与mybatis道理一致)_mybatisplus sqlsessiontemplate

mybatisplus sqlsessiontemplate

一、简单步骤解析

①引入SqlSessionTemplate,mapper接口

②根据需求写一个更新数据的批量处理方法(关掉自动提交,批次commit

③将需要修改的数据对象list,传入批处理方法中处理(实际相当于传一个update的where条件内容)

④调用接口进行数据更新

⑤测试+日志+数据展示

二、代码模块示例

①引入SqlSessionTemplate,mapper接口

  1. @Autowired
  2. private SqlSessionTemplate sqlSessionTemplate;
  3. @Autowired
  4. private AccMapper accMapper;

②根据需求写一个更新数据的批量处理方法(关掉自动提交,批次commit

  1. /**
  2. * 批量更新数据(mybatisPlus)
  3. *
  4. * @param list 批量修改时的list对象(相当于where条件部分)
  5. */
  6. private void updateBatchData(List<AccountDetail> list) {
  7. //批量插入数据,通过sqlSession工厂类处理,openSession(ExecutorType.BATCH, false)选择批次提交,关掉自动提交
  8. SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
  9. try {
  10. //指定mybatis的具体Mapper类
  11. AccMapper jourMapper = sqlSession.getMapper(AccMapper.class);
  12. AtomicInteger atomicInteger = new AtomicInteger();
  13. for (int i = 0; i < list.size(); i++) {
  14. AccountDetail accountDetail = new AccountDetail();
  15. accountDetail.setOrderStatus("1");
  16. QueryWrapper<AccountDetail> wrapper = new QueryWrapper<>();
  17. wrapper.eq("AccDate",list.get(i).getAccDate());
  18. wrapper.eq("UserNum",list.get(i).getUserNum());
  19. wrapper.eq("OrderNum",list.get(i).getOrderNum());
  20. int update = jourMapper.update(accountDetail, wrapper);
  21. if (i % 500 == 0 || i == list.size() - 1) {
  22. //每1000条数据,手动提交一次,提交后的数据无法回滚
  23. sqlSession.commit();
  24. //积累数据量太多容易导致内存溢出,所以每次提交后清理缓存,防止溢出
  25. sqlSession.clearCache();
  26. atomicInteger.incrementAndGet();
  27. System.out.println("当前提交批次为:"+atomicInteger.get());
  28. log.info("当前提交批次为:{},条数角标为:{}",atomicInteger.get(),i);
  29. }
  30. }
  31. } catch (Exception e) {
  32. log.info("批量更新失败:"+e);
  33. //未提交的数据可以回滚
  34. sqlSession.rollback();
  35. } finally {
  36. sqlSession.close();
  37. }
  38. }

③将需要修改的数据对象list,传入批处理方法中处理(实际相当于传一个update的where条件内容)

  1. public void updateBatchMsg() {
  2. //条件查询出要修改的数据
  3. List<AccountDetail> selectList = accMapper.selectList(null);
  4. //批量修改
  5. updateBatchData(selectList);
  6. }

④调用接口进行数据更新(此处用controller简单调用了一下)

  1. @RestController
  2. @RequestMapping("FileExec")
  3. public class FileController {
  4. @Autowired
  5. private InsertTest insertTest;
  6. @RequestMapping(value = "/updateBatchMsg", method = RequestMethod.GET)
  7. public ResponseEntity<ResultModel> updateBatchMsg() {
  8. insertTest.updateBatchMsg();
  9. return new ResponseEntity<>(ResultModel.ok(), HttpStatus.OK);
  10. }
  11. }

⑤测试+日志+数据展示

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/949659
推荐阅读
相关标签
  

闽ICP备14008679号