mybatis-plus批处理操作

        PclUtil.execute(subReportPermAddVOS, SubReportOrgPermissionMapper.class, (mapper, data) -> {
            mapper.delete(Wrappers.lambdaQuery(SubReportOrgPermissionEntity.class)
                    .eq(SubReportOrgPermissionEntity::getProgId, data.getProgId())
                    .eq(SubReportOrgPermissionEntity::getOrgCode, data.getOrgCode())
                    .eq(SubReportOrgPermissionEntity::getReportCode, data.getReportCode())
                    .eq(SubReportOrgPermissionEntity::getSubReportCode, data.getReportCode())
                    .eq(SubReportOrgPermissionEntity::getMajorCode, data.getMajorCode()));
        });

package com.thtf.zwdsj.gatherready.jar.reportpermission.util;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.thtf.zwdsj.code.common.exception.CommonException;
import lombok.Data;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;
import java.util.function.BiConsumer;

/**
 * 批处理工具类
 *
 * @author 庄代云
 * @date 2023/12/23
 */
public class PclUtil {
    /**
     * sql会话工厂实例
     */
    private static final SqlSessionFactory SQL_SESSION_FACTORY;
    /**
     * 批处理数量
     */
    private static Integer BATCH_COUNT = 2000;

    private PclUtil() {
        throw new RuntimeException("工具类不能实例化");
    }

    static {
        SqlSessionTemplate sqlSessionTemplate = SpringUtil.getBean(SqlSessionTemplate.class);
        SQL_SESSION_FACTORY = sqlSessionTemplate.getSqlSessionFactory();
    }

    /**
     * 执行批处理
     *
     * @param sjlist      需要执行得数据列表
     * @param mapperClass mapper的class
     * @param biConsumer  具体的执行逻辑
     * @param <E>         数据项类
     * @param <T>         mapper类
     */
    public static <E, T> void execute(List<E> sjlist, Class<T> mapperClass, BiConsumer<T, E> biConsumer) {
        execute(sjlist, mapperClass, BATCH_COUNT, biConsumer);
    }

    /**
     * 执行批处理
     *
     * @param sjlist      需要执行得数据列表
     * @param mapperClass mapper的class
     * @param pcltjsl     批处理提交数量
     * @param biConsumer  具体的执行逻辑
     * @param <E>         数据项类
     * @param <T>         mapper类
     */
    public static <E, T> void execute(List<E> sjlist, Class<T> mapperClass, int pcltjsl, BiConsumer<T, E> biConsumer) {
        if (sjlist.isEmpty()) {
            return;
        }
        try (SqlSession sqlSession = SQL_SESSION_FACTORY.openSession(ExecutorType.BATCH)) {
            T mapper = sqlSession.getMapper(mapperClass);
            int curr = 1;
            int size = sjlist.size();
            int idxLimit = Math.min(size, pcltjsl);
            for (E o : sjlist) {
                biConsumer.accept(mapper, o);
                if (curr == idxLimit) {
                    sqlSession.flushStatements();
                    idxLimit = Math.min(idxLimit + pcltjsl, size);
                }
                curr++;
            }
        }
    }

    /**
     * 批量执行数据
     *
     * @param pclsjList 批处理数据列表
     * @param <E>       数据项类
     * @param <T>       mapper类
     */
    public static <E, T> void execute(List<Pclsj> pclsjList) {
        if (pclsjList.isEmpty()) {
            return;
        }
        try (SqlSession sqlSession = SQL_SESSION_FACTORY.openSession(ExecutorType.BATCH)) {
            int size = 0;
            for (Pclsj pclsj : pclsjList) {
                List sjlist = pclsj.getSjlist();
                if (sjlist == null) {
                    throw new CommonException("批处理数据不能为空");
                }
                size += sjlist.size();
            }
            int curr = 1;
            int idxLimit = Math.min(size, BATCH_COUNT);
            for (Pclsj pclsj : pclsjList) {
                List<E> sjlist = pclsj.getSjlist();
                Class<T> mapperClass = pclsj.getMapperClass();
                BiConsumer<T, E> biConsumer = pclsj.getBiConsumer();
                if (!ObjectUtil.isAllNotEmpty(mapperClass, biConsumer)) {
                    throw new CommonException("要执行的方法不能为空");
                }
                T mapper = sqlSession.getMapper(mapperClass);
                for (E o : sjlist) {
                    biConsumer.accept(mapper, o);
                    if (curr == idxLimit) {
                        sqlSession.flushStatements();
                        idxLimit = Math.min(idxLimit + BATCH_COUNT, size);
                    }
                    curr++;
                }
            }
        }
    }

    @Data
    public static class Pclsj<T, E> {
        private List<E> sjlist;
        private Class<T> mapperClass;
        BiConsumer<T, E> biConsumer;

        public Pclsj(List<E> sjlist, Class<T> mapperClass, BiConsumer<T, E> biConsumer) {
            this.sjlist = sjlist;
            this.mapperClass = mapperClass;
            this.biConsumer = biConsumer;
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值