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

}
相关推荐
唐青枫17 小时前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马18 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户37215742613518 小时前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户37215742613518 小时前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454751 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程
东坡白菜2 天前
破局全栈:一个前端开发的Java入门实战记录(1)
java·全栈
唐青枫2 天前
Java Tomcat 实战指南:从 Servlet 容器到 Spring Boot 部署
java
wsaaaqqq2 天前
roudan:自由选择实体、灵活操作数据、快速写入数据库的 Java 框架
java
plainGeekDev2 天前
null 判断 → Kotlin 可空类型
android·java·kotlin
糖拌西瓜皮2 天前
Java开发者视角:深入理解Node.js异步编程模型
java·后端·node.js