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);
    }));

}
相关推荐
2501_941875281 小时前
从配置中心到动态管理的互联网工程语法演进与多语言实践分享
开发语言·python
hfywmsj1 小时前
广州餐饮铺位招租决策模型:多因子选址系统设计
开发语言·人工智能·python·广州餐饮铺位招租
努力的lpp3 小时前
php反序列化一(大白话版)
开发语言·web安全·php·ctf·反序列化
菜鸟~noob2333 小时前
【电子战】第03篇:CFAR(恒虚警)处理【含matlab代码】
开发语言·matlab
lhldsg4 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
jason成都4 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
泡海椒4 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb4 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye4 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
小羊没烦恼!5 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php