赞
踩
①引入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);
- }
-
- }
⑤测试+日志+数据展示
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。