java-手动分页

java手动分页

1.对list手动分页

适用已查询出所有数据到集合,需要对集合进行手动分页

    public static void main(String[] args) {
        // 造测试数据
        List<String> list = new ArrayList<>();
        Stream.iterate(1, i -> i + 1).limit(123).forEach(i -> list.add(i.toString()));

        // 每页显示的数据条数
        int pageSize = 10;
        // 数据总条数
        int totalPageSize = list.size();
        // 总页数
        int totalPage = (totalPageSize % pageSize) > 0 ? (totalPageSize / pageSize) + 1 : (totalPageSize / pageSize);

        // 一页一页读取数据
        Stream.iterate(1, i -> i + 1).limit(totalPage).forEach(pageIndex -> {
            List<String> collect = list.stream().skip((pageIndex - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
            System.out.println("pageIndex:" + pageIndex+"---"+ collect);
        });
    }

在这里插入图片描述

2.对数据量大的数据进行分页执行

适用已知数据库数据量对比较大,指定每次执行条数,一页一页对数据进行分批循环执行

        // 模拟查询出数据库需要执行的总条数
        int total = getPageCount();
        // 每次需要执行的条数
        int runSize = 1000;
        // 计算出需要循环执行的次数
        int runCount = (total % runSize) > 0 ? (total / runSize) + 1 : (total / runSize);
        // 循环执行,按每次需要执行条数一页一页执行
        Stream.iterate(1, i -> i + 1).limit(runCount).forEach(pageIndex -> {
            Page<String> page = querPage(pageIndex, runCount);
            // 业务逻辑代码
        });
<think>嗯,用户想了解MyBatis-Plus的手动分页。首先,我得回忆一下MyBatis-Plus的基本分页功能。通常,MyBatis-Plus提供了PaginationInterceptor,可以自动处理分页,通过Page对象设置当前页和每页数量,然后调用selectPage方法就行。但用户提到的是“手动分页”,可能是指在不使用内置分页插件的情况下自己实现分页,或者在某些特殊场景下需要手动处理。 那手动分页的应用场景是什么呢?比如,当查询的数据源不是直接的数据库,而是经过处理后的列表,或者需要从多个来源合并数据后再分页。这时候内置的分页就不适用了,得自己在内存中分页。 接下来,手动分页的实现步骤。首先,需要获取所有数据,比如从数据库查询全部,或者从其他地方获取列表。然后根据当前页码和每页数量计算起始索引和结束索引,用subList方法截取需要的部分。同时,计算总记录数和总页数,封装成分页对象返回。 需要注意的是,手动分页如果数据量大会有性能问题,因为要加载所有数据到内存。所以最好在数据量小的情况下使用,或者确保有合适的分页策略。 可能用户遇到的问题包括分页参数的计算错误,比如起始索引越界,或者对subList的使用不熟悉导致错误。还有性能问题,如果数据量大,手动分页效率低。 总结来说,手动分页适用于特殊场景,但需谨慎处理性能和内存问题。最后,给出一个代码示例会更有帮助,展示如何手动实现分页,包括计算起始索引、截取列表、封装结果等步骤。</think>MyBatis-Plus 是一个强大的 MyBatis 增强工具,提供了许多便捷功能(如内置分页插件)。但“手动分页”通常指在不依赖其自动分页功能时,自行实现分页逻辑的场景。以下是手动分页的核心思路和实现方法: --- ### **手动分页的常见场景** 1. **数据源非直接数据库查询** 例如:数据经过业务逻辑处理后需要分页,或数据来自第三方接口、缓存等非直接数据库查询的结果集。 2. **多数据源合并后分页** 例如:从多个数据库或服务获取数据,合并后需要内存分页。 3. **规避性能问题** 自动分页依赖 `LIMIT` 语句,但某些复杂 SQL 可能性能不佳,需手动优化分页逻辑。 --- ### **手动分页实现步骤** #### 1. 计算分页参数 - **页码**(`current`):当前请求的页码(从 1 开始) - **每页数量**(`size`):每页显示的数据条数 - **起始索引**:`startIndex = (current - 1) * size` - **结束索引**:`endIndex = current * size` #### 2. 内存分页Java 代码示例) ```java public PageUtils manualPagination(List<?> dataList, int current, int size) { int total = dataList.size(); int startIndex = (current - 1) * size; int endIndex = Math.min(current * size, total); // 截取当前页数据 List<?> pageList = dataList.subList(startIndex, endIndex); // 封装分页结果 return new PageUtils(pageList, total, size, current); } ``` #### 3. 分页结果封装 自定义分页对象(例如 `PageUtils`)包含以下字段: - `records`:当前页数据列表 - `total`:总记录数 - `size`:每页条数 - `current`:当前页码 - `pages`:总页数(`pages = total % size == 0 ? total / size : total / size + 1`) --- ### **注意事项** 1. **性能问题** 内存分页需一次性加载所有数据,数据量大时易导致 OOM,建议仅在小数据量时使用。 2. **索引越界** 需校验 `startIndex` 和 `endIndex` 是否超出数据范围,避免 `IndexOutOfBoundsException`。 3. **排序问题** 若需排序,应在分页前对完整数据集进行排序(如使用 `Collections.sort()`)。 --- ### **对比 MyBatis-Plus 自动分页** | 特性 | MyBatis-Plus 自动分页 | 手动分页 | |--------------------|-----------------------------------|------------------------| | **数据来源** | 直接通过 SQL 的 `LIMIT` 查询 | 内存中的集合数据 | | **性能** | 高效(数据库分页) | 低效(需加载全部数据) | | **适用场景** | 常规数据库查询 | 复杂逻辑处理后的数据分页 | | **代码复杂度** | 简单(一行代码) | 需自行计算索引和截取数据 | --- ### **完整代码示例** ```java // 自定义分页结果类 public class PageUtils<T> { private List<T> records; private long total; private int size; private int current; private int pages; // 构造方法 public PageUtils(List<T> records, int total, int size, int current) { this.records = records; this.total = total; this.size = size; this.current = current; this.pages = (int) Math.ceil((double) total / size); } // Getters and Setters } // 使用示例 List<User> allUsers = userService.list(); // 获取所有数据 PageUtils<User> page = manualPagination(allUsers, 2, 10); // 获取第2页,每页10条 ``` --- 通过手动分页,可以灵活应对特殊场景的需求,但务必注意数据量和性能问题。在常规数据库查询中,仍推荐优先使用 MyBatis-Plus 的自动分页功能(`Page<T>` + `selectPage()`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值