Java 分页实战详解
目录
- 前言
- 1. 基本知识
- 2. 常用API
#1024程序员节 | 征文#
前言
最终结果不是想要的,索性手动弄拼凑一个分页的数据!
int currentPage = query.getCurrent();
int pageSize = query.getSize();
int total = sortedRecords.size(); // 总记录数
List<Sort> pagedRecords = sortedRecords.stream().skip((long) (currentPage - 1) * pageSize).limit(pageSize).collect(Collectors.toList());// 构建分页对象
IPage<Sort> pagedResult = new Page<>(currentPage, pageSize, total);
pagedResult.setRecords(pagedRecords);// 将分页结果转为 VO 对象并返回
IPage<SortVO> sortVOPage = SortWrapper.build().pageVO(pagedResult);
总体截图如下:
关于Java的基本知识,推荐阅读:
- java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
- 【Java项目】实战CRUD的功能整理(持续更新)
对于分页的基本知识点,推荐阅读:(内含不同的语言)
- 详细分析MybatisPlus中的Page类(附实战)
- 详细分析Mybatis与MybatisPlus中分页查询的差异(附Demo)
- 详细分析Element Plus的el-pagination基本知识(附Demo)
- Python关于Paginator分页函数详细解析 附实战代码
1. 基本知识
分页是指将大量的数据按照指定的页数和每页记录数,进行拆分处理。分页功能的常见用途是在前端展示海量数据时,避免一次性加载所有数据到页面上,提升性能
基本的数据有如下:
- 当前页 (currentPage):用户当前所在的页码
- 每页条数 (pageSize):每页显示的记录数
- 总记录数 (total):数据的总条数,分页时会依赖该字段来计算总页数
- 分页数据 (pagedRecords):当前页的数据记录列表
在代码中,currentPage 和 pageSize 是从查询条件中获取的用户请求信息,而 total 是在对数据集合进行分页前,记录的总数
query为条件:
int currentPage = query.getCurrent();// currentPage: 当前页数,从 query 对象中获取
int pageSize = query.getSize();// pageSize: 每页记录数,从 query 对象中获取
int total = sortedRecords.size();// total: 通过 sortedRecords.size() 获取总的记录数
为了限制分页的数据,控件设置正确:
skip
:跳过前面几页的数据,skip((currentPage - 1) * pageSize)
计算出需要跳过的数据条数
例如,当前是第 2 页,每页 10 条数据,那么 skip 将跳过前 10 条数据limit
:限制返回的记录数,limit(pageSize) 只返回 pageSize 条数据collect
:将处理过的数据流转换为列表,成为当前页的记录
List<Sort> pagedRecords = sortedRecords.stream().skip((long) (currentPage - 1) * pageSize) // 跳过前几页的数据.limit(pageSize) // 限制返回的条数.collect(Collectors.toList()); // 收集当前页的数据
对应返回给前端数据显示:
IPage
: 是 MyBatis-Plus 提供的分页接口,用于表示分页对象
new Page<>(currentPage, pageSize, total)
创建了一个 Page 实例,传入当前页数、每页记录数和总条数setRecords
:将当前页的记录 pagedRecords 设置到分页对象中
IPage<Sort> pagedResult = new Page<>(currentPage, pageSize, total);
pagedResult.setRecords(pagedRecords);
2. 常用API
API | 说明 | 示例代码 |
---|---|---|
getCurrent() | 获取当前页码,通常由前端传入 | int currentPage = query.getCurrent(); |
getSize() | 获取每页显示的记录数,通常由前端传入 | int pageSize = query.getSize(); |
skip(long n) | 跳过前 n 条数据,常用于分页时跳过前几页的数据 | .skip((long) (currentPage - 1) * pageSize) |
limit(long n) | 限制返回的记录数,分页时返回每页的记录数 | .limit(pageSize) |
collect() | 将流转换为列表,收集分页后的数据 | .collect(Collectors.toList()); |
IPage<T> | MyBatis-Plus 提供的分页接口,用于存储分页信息,包括当前页、每页条数、总条数、当前页数据等 | IPage<Sort> pagedResult = new Page<>(currentPage, pageSize, total); |
setRecords() | 设置当前页的记录列表 | pagedResult.setRecords(pagedRecords); |
相关的补充说明更多可以看我上述的链接:
-
性能优化:如果数据量非常大,使用内存中的 sortedRecords.stream() 进行分页可能不适合
这种情况下,可以使用数据库层面的分页查询(如 SQL 中的 LIMIT 和 OFFSET),只取出当前页的数据,减少内存占用和处理时间 -
分页边界问题:需要考虑分页边界条件,例如 currentPage 是否小于 1,是否大于总页数,防止无效分页请求造成错误
-
MyBatis-Plus 的 IPage 接口:在实际开发中,MyBatis-Plus 提供的 IPage 和 Page 实现了分页的所有功能,并且能与数据库查询直接配合,进一步简化分页操作