java分页核心依赖数据库或orm框架实现,流程控制仅用于参数校验、偏移量计算、查询组装及结果封装;需校验pagenum/pagesize合法性,用long防溢出,统一返回含list/total/pages的分页响应结构。

Java 中实现分页查询,核心不是靠流程控制语句(如 if/else、for、while)直接“做分页”,而是用流程控制来组织和调度分页逻辑——比如校验参数、计算偏移量、拼装 SQL 或构造查询对象、处理空结果等。真正的分页能力来自数据库(如 LIMIT/OFFSET、ROWNUM、OFFSET-FETCH)或 ORM 框架(如 MyBatis 的 RowBounds、MyBatis-Plus 的 Page、JPA 的 Pageable)。流程控制的作用是让分页更安全、健壮、可读。
校验并规范化分页参数
用户传来的 pageNum(页码)和 pageSize(每页条数)常不合法:负数、零、超大值、非数字。需用 if 判断拦截并设默认值或抛异常。
- 页码小于 1 → 默认为 1;页码过大(如超过 10000)可拒绝或截断
- 每页条数 ≤ 0 或 > 100 → 强制设为 20 或抛
IllegalArgumentException - 用
Math.max(1, pageNum)和Math.min(100, pageSize)快速规整
计算 offset 和 limit(适用于原生 JDBC / MyBatis XML)
关系型数据库分页依赖 OFFSET 和 LIMIT(MySQL/PostgreSQL)或等效语法。offset = (pageNum - 1) × pageSize,这个计算必须放在参数校验之后,避免负数或溢出。
-
别写成
offset = pageNum * pageSize(会多跳过一页) -
注意整型溢出:当 pageNum=2147483647 且 pageSize=100 时,int 会溢出 → 改用
long计算再转 int(若 DB 驱动支持),或加范围检查 - 示例:
int offset = Math.max(0, (pageNum - 1) * pageSize);
组装分页查询并处理结果
流程控制用于衔接查询执行与结果封装:查完判断是否为空、是否要补总数、是否需要转换 DTO。
- 用 if 判断
list == null || list.isEmpty(),决定返回空列表还是日志提示 - 若需总记录数(如做 total 分页栏),通常需额外查一次
COUNT(*);可用 if 控制是否执行该统计(例如仅首页或带 searchParam 时才查) - 用 for 循环或 stream 将 Entity 转为 VO/DTO,避免在 DAO 层直接返回敏感字段
统一返回分页响应结构(推荐)
不要只返回 List,应封装成含 list、pageNum、pageSize、total、pages 的对象。流程控制用于填充这些字段:
- total = 查询到的总数(可能来自 COUNT 查询或缓存)
- pages = (int) Math.ceil((double) total / pageSize)
- 用 if 判断
pageNum > pages && total > 0,可记录告警或自动重定向到最后一页
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











