java中用jdbc实现分页查询的核心是结合数据库特有分页语法(如mysql的limit ?, ?、oracle的offset fetch或rownum)与preparedstatement安全传参,offset=(pagenum-1)*pagesize,需校验pagenum≥1且pagesize合理,并注意多数据库语法差异。

Java 中用 JDBC 实现数据库分页查询,核心是借助 SQL 的分页语法(如 MySQL 的 LIMIT offset, size、PostgreSQL 的 LIMIT size OFFSET offset、Oracle 的 ROWNUM 或 OFFSET ... FETCH),配合 PreparedStatement 安全传参,避免 SQL 注入。
MySQL 分页:使用 LIMIT 和 PreparedStatement
MySQL 最常用、最直观。注意 offset 从 0 开始,第一页对应 offset = 0,每页 10 条即 size = 10:
- SQL 模板:
SELECT * FROM user WHERE status = ? ORDER BY id DESC LIMIT ?, ? - 设置参数时,先设查询条件(如 status),再设 offset,最后设 size
- 示例代码片段:
String sql = "SELECT * FROM user WHERE status = ? ORDER BY id DESC LIMIT ?, ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, 1); // status = 1
ps.setInt(2, (pageNum - 1) * pageSize); // offset,第一页 pageNum=1 → offset=0
ps.setInt(3, pageSize); // limit size
ResultSet rs = ps.executeQuery();
// 处理结果...
}
通用分页封装建议
为提升复用性,可封装分页工具方法或使用 Page 对象(如自定义 Page<t></t>):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 传入参数应包含:当前页码(pageNum)、每页条数(pageSize)、SQL 主体(不含 LIMIT)、参数列表
- 计算 offset 公式统一为:
(pageNum - 1) * pageSize,避免前端传错 0 起始导致错页 - 建议校验参数:pageNum ≥ 1,pageSize 在合理范围(如 1–500),非法值直接抛 IllegalArgumentException
注意不同数据库的语法差异
若应用需兼容多数据库,不能硬写 MySQL 语法:
- PostgreSQL:用
LIMIT ? OFFSET ?,参数顺序是size, offset - Oracle 12c+:支持
OFFSET ? ROWS FETCH NEXT ? ROWS ONLY - SQL Server:用
OFFSET ? ROWS FETCH NEXT ? ROWS ONLY(2012+) - 老 Oracle(
不推荐的手动内存分页
有人用 ResultSet.absolute() 或把全部数据查出再截取,这是严重反模式:
- 大数据量下 OOM 风险高,性能极差
- 网络和数据库压力陡增,失去分页意义
- JDBC 的
absolute()并非所有驱动都高效支持,且无法跳过前 N 行真正“懒加载”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










