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

一、简单步骤解析

①引入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);
    }

}

⑤测试+日志+数据展示

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值