mybatis批量提交工具类

文章目录

1.获取Bean的工具类

java 复制代码
/**
 * @author Linging
 * @version 1.0.0
 * @since 1.0
 */
@Component
public class SpringUtils implements ApplicationContextAware {

   private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtils.applicationContext = applicationContext;
    }

    public static Object getBean(String name){
        return applicationContext.getBean(name);
    }

    public static <T> T getBean(Class<T> tClass){
        return applicationContext.getBean(tClass);
    }
}

2.批量提交工具类

java 复制代码
/**
 * @author Linging
 * @version 1.0.0
 * @since 1.0
 */
public class BatchUtils {

    public final static Integer COUNT = 100;

    public static <T,E> void execute(List<T> list, Class<E> tClass, BiConsumer<T, E> biConsumer){
        SqlSessionTemplate sqlSessionTemplate = SpringUtils.getBean(SqlSessionTemplate.class);
        SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);
        E mapper = sqlSession.getMapper(tClass);
        try{
            int n = 0;
            for (T data : list) {
                n++;
                biConsumer.accept(data, mapper);
                if(n >= COUNT){
                    sqlSession.commit();
                    n = 0;
                }
            }
            sqlSession.commit();
            sqlSessionTemplate.clearCache();
        }catch (Exception e){
            sqlSession.rollback();
            throw new RuntimeException("批量执行出错", e);
        }finally {
            sqlSession.close();
        }
    }

    public static <T,E> void executeList(List<T> list, Class<E> tClass, BiConsumer<List<T>, E> biConsumer){
        SqlSessionTemplate sqlSessionTemplate = SpringUtils.getBean(SqlSessionTemplate.class);
        SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);
        E mapper = sqlSession.getMapper(tClass);
        try{
            // 使用Google的guaua工具类:Lists
            List<List<T>> allList = Lists.partition(list, COUNT);
            for (List<T> subList : allList) {
                biConsumer.accept(subList, mapper);
                sqlSession.commit();
            }
            sqlSessionTemplate.clearCache();
        }catch (Exception e){
            sqlSession.rollback();
            throw new RuntimeException("批量执行出错", e);
        }finally {
            sqlSession.close();
        }
    }
    
}

3.使用

java 复制代码
@Transactional
public void add() {

    List<Student> students = new ArrayList<>();
    Student st1 = new Student();
    st1.setId(5L);
    st1.setName("赵云");
    st1.setAge(20);
    st1.setAddress("");
    st1.setPhone("");
    Student st2 = new Student();
    st2.setId(6L);
    st2.setName("极效满");
    st2.setAge(30);
    st2.setAddress("");
    st2.setPhone("");
    Student st3 = new Student();
    st3.setId(7L);
    st3.setName("黄棕");
    st3.setAge(99);
    st3.setAddress("");
    st3.setPhone("");
    students.add(st1);
    students.add(st2);
    students.add(st3);

    BatchUtils.execute(students, StudentMapper.class, ((student, studentMapper2) -> {
        studentMapper2.insert(student);
    }));

}
相关推荐
MATLAB代码顾问15 分钟前
5大智能算法优化标准测试函数对比(Python实现)
开发语言·python
wuminyu2 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
万粉变现经纪人2 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒2 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼2 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
callJJ3 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
小郑加油3 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦3 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
KuaCpp4 小时前
C++面向对象(速过复习版)
开发语言·c++
wbs_scy4 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言