MyBatisPlus批量新增或修改执行器

@Component
public class ExecutorBatch {
    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;

    /**
     * 使用mybatis的BATCH模式批量新增和修改
     * 需要注意的是分批次入库操作,关闭自动提交。
     * @param mapperClazz 继承Mapper接口的类
     * @param operationList 操作的List
     * @param isUpdate 是否为更新
     * @param operationDbNumber 操作数据库条数
     * @param <T> T
     * @param <I> I
     */
    public  <T, I extends Mapper> void executorTypeBatch(Class<I> mapperClazz, List<T> operationList, boolean isUpdate, int operationDbNumber){
        SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(
                ExecutorType.BATCH, false);
        I mapper = session.getMapper(mapperClazz);
        try {
            for (int i = 1;i <= operationList.size(); i++) {
                if (isUpdate) {
                    mapper.updateByPrimaryKeySelective(operationList.get(i-1));
                } else {
                    mapper.insert(operationList.get(i-1));
                }
                if (i / operationDbNumber == 1 || i == operationList.size()) {
                    session.commit();
                    //清理缓存,防止溢出
                    session.clearCache();
                }
            }
        } catch (Exception e) {
            session.rollback();
        } finally {
            session.close();
        }
    }

/**
     * 使用mybatis的BATCH模式批量删除
     * 需要注意的是分批次入库操作,关闭自动提交。
     * @param mapperClazz 继承Mapper接口的类
     * @param operationList 操作的List
     * @param operationDbNumber 操作数据库条数
     * @param <T> T
     * @param <I> I
     */
    public  <T, I extends Mapper> void executorTypeBatchDelete(Class<I> mapperClazz, List<T> operationList, int operationDbNumber){
        SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(
                ExecutorType.BATCH, false);
        I mapper = session.getMapper(mapperClazz);
        try {
            for (int i = 1;i <= operationList.size(); i++) {
                mapper.delete(operationList.get(i-1));
                if (i / operationDbNumber == 1 || i == operationList.size()) {
                    session.commit();
                    //清理缓存,防止溢出
                    session.clearCache();
                }
            }
        } catch (Exception e) {
            session.rollback();
        } finally {
            session.close();
        }
    }
}

测试类

 @Before
    public void  getList() {
        long start = System.currentTimeMillis();
        Users user;
        for (int i = 1; i <=50000 ; i++) {
            user = new Users();
            user.setId(i);
            user.setName("java");
            user.setAge(200);
            user.setManagerId(222);
            list.add(user);
        }
        System.out.println("拼装数据 耗时:"+(System.currentTimeMillis()-start));
        System.out.println(list.size());
    }
 
 
    @Test
    public void batchInsert() {
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
        UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
        System.out.println("batchInsert 插入开始========");
        long start = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
            mapper.insert(list.get(i));
            if (i%5000==4999) {
                sqlSession.flushStatements();
//                sqlSession.commit();
//                sqlSession.clearCache();
            }
        }
//        sqlSession.commit();
//        sqlSession.clearCache();
        sqlSession.flushStatements();
        System.out.println("SqlSession 批量插入耗时:"+(System.currentTimeMillis()-start));
    }

版权声明:本文为weixin_47252341原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。