MyBatis-Plus通用中等、大量数据分批查询和处理方法

2025-07-14 18:50

本文主要是介绍MyBatis-Plus通用中等、大量数据分批查询和处理方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式...

函数式接口

获取分页数据接口

主要用于获取数据

import com.baomidou.myBATisplus.extension.plugins.pagination.Page;
@FunctionalInterface
public interface MyBatisPlusPageFunctionInterface<T> {
    Page<T> selectPage(Page<T> page);
}

数据处理接口

import Java.util.List;
@FunctionalInterface
public interface MyBatisPlusFunctionInterface<T> {
    void execute(List<T> tList);
}

通用逻辑工具类

用于执行分页数据接口实现和数据处理接口实现逻辑

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
 * MyBatis-Plus 工具类
 */
public final class MyBatisPlusUtils {
    public static final int DEFAULT_PAGE_SIZE_INT = 1000;
    public static final long DEFAULT_PAGE_SIZE = 1000L;
    private MyBatisPlusUtils() {
    }
    /**
     * 无条件分页查询N条(N由调用方决定)
     *
     * @param extendsBaseMapperClass       继承了BaseMapper的Mapper接口
     * @param myBatisPlusFunctionInterface 业务逻辑
     */
    public static <T> void findByPage(BaseMapper<T> extendsBaseMapperClass, long pageSize, MyBatisPlusFunctionInterface<T> myBatisPlusFunctionInterface) {
        findByPage(extendsBaseMapperClass, null, pageSize, myBatisPlusFunctionInterface);
    }
    /**
     * 无条件分页查询(默认每次取1000条,直到取完为止)
     *
     * @param extendsBaseMapperClass       继承了BaseMapper的Mapper接口
     * @param myBatisPlusFunctionInterface 业务逻辑
     */
    public static <T> void findByPage(BaseMapper<T> extendsBaseMapperClass, MyBatisPlusFunctionInterface<T> myBatisPlusFunctionInterface) {
        findByPage(extendsBaseMapperClass, null, DEFAULT_PAGE_SIZE, myBatisPlusFunctionInterface);
    }
    /**
     * 有条件分页查询(默认每次取1000条,直到取完为止)
     *
     * @param extendsBaseMappeyuPoKHaVrxrClass       继承了BaseMapper的Mapp编程er接口
     * @param myBatisPlusFunctionInterface 业务逻辑
     */
    public static <T> void findByPage(BaseMapper<T> extendsBaseMapperClass, LambdaQueryWrapper<T> lambdaQueryWrapper, MyBatisPlusFunctionInterface<T> myBatisPlusFunctionInterface) {
        findByPage(extendsBaseMapperClass, lambdaQueryWrapper, DEFAULT_PAGE_SIZE, myBatisPlusFunctionInterface);
    }
    /**
     * 后端分页查询所有数据
     *
     * @param extendsBaseMapperClass       继承了BaseMapper的Mapper接口
     * @param myBatisPlusFunctionInterface 业务逻辑
     */
    public static <T> void findByPage(BaseMapper<T> extendsBaseMapperClass, LambdaQueryWrapper<T> lambdaQueryWrapper, long pageSize, MyBatisPlusFunctionInterface<T> myBatisPlusFunctionInterface) {
        findByPage((Page<T> page) -> extendsBaseMapperClass.selectPage(page, lambdaQueryWrapper), pageSize, myBatisPlusFunctionInterface);
    }
    /**
     * 通用分页查询方法
     *
     * @param functionInterface            获取分页数据的方法
     * @param pageSize                     每次获取的数据量
     * @param myBatisPlusFunctionInterface 对获取的分页数据进行处理
     */
    public static <T> void findByPage(MyBatisPlusPageFunctionInterface<T> functionInterface, long pageSize, MyBatisPlusFunctionInterface<T> myBatisPlusFunctionInterface) {
        // 参数校验
        Assert.isTrue(pageSize > 0, "每页大小必须大于 0");
        Assert.notNull(myBatisPlusFunctionInterface, "数据处理逻辑不能为 null");
        int currentPage = 1;
        while (true) {
            Page<T> tPage = functionInterface.selectPage(Page.of(currentPage, pageSize));
            long pages = tPage.getPages();
            List<T> records = tPage.getRecords();
            //数据为空
           js if (CollectionUtils.isEmpty(records)) {
                return;
            }
            // 业务逻辑
            myBatisPlusFunctionInterface.execute(records);
            //最后一页
            if (pages <= currentPage) {
                return;
            }
            currentPage++;
        }
    }
}

使用方法

简单查询

//批量获取全部数据,没设置一次取几条数据,这里默认取1000条。
            MyBatisPlusUtils.findByPage(XXXMapper,//简单查询继承了BaseMapper的Mapper
                    new LambdaQueryWrapper<DataBaseEntity>().isNull(DataBaseEntity::getName)
                    ,//简单查询mapper的条件
                    records -> {//处理分页查询出来的数据,如果有多次分页,则进行多次处理。比如有2页,则下面的方法会执行2次。
                        List<DataBaseEntity> l = new ArrayList<>(MyBatisPlusUtils.DEFAULT_PAGE_SIZE_INT);
                        //遍历处理这一批次的数据
                        for (DataBaseEntity record : records) {
                            //处理查询到的数据
                        }
					}
			});

自定义查询方法

//自定义查询方法
			MyBatisPlusUtils.findByPage(
                    (Page<HiBdSrvtmpMedOrd> page) -> {
                        //对传入的数据进行处理
                        String param2 = dto.getParam2() + dto.China编程getParam3();
                        return hiBdSrvtmpMedOrdMapper.findPage(page, param2);//使用自定义的分页方法,并且分页参数可以不固定,需要多少个都行。
                    },//使用自定义的分页方法
                    2000L,//一次取2000条数据
                    records -> {
                        //遍历处理这一批次的数据
                        for (HiBdSrvtmpMedOrd record : records) {
                            //处理查询到的数据
                        }
                    }
            );

总结

上面提供的方式对于初学者或者没有系统了解过JAVA8的函数式接口、lambda表达式、匿名函数等新特性的人,理解起来是非常抽象、不好理解的,但是正因为代码抽象,所以功能才更强大!
还有其它组合使用方式没有一一列举出来,大家可以自行尝试使用和扩展。
有些功能没有考虑在内,比如:分批提交的事务问题、没有使用批处理模式(ExecutorType.BATCH)、使用 Cursor进行流式查询(适用于大数据量)、多线程处理(代码会更复杂,而且我也没有想过通用这方面的代码,这方面单独的代码会更合适)
有更好的办法,欢迎留言,谢谢。

到此这篇关于MyBatis-Plus通用中等、大量数据分批查询http://www.chinasem.cn和处理的文章就介绍到这了,更多相关mybatis-plus内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于MyBatis-Plus通用中等、大量数据分批查询和处理方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155384

相关文章

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构