java jdbc分页采用服务端分页,通过pageno和pagesize计算offset与limit,按数据库语法编写sql(如mysql用limit ? offset ?),必须带order by并使用preparedstatement防注入;还需额外查totalcount以计算总页数等分页信息。

Java 中 JDBC 处理分页查询,核心是让数据库只返回当前页需要的数据,而不是查全表再在内存里切片。这叫“服务端分页”,性能好、省内存,是实际开发的主流做法。
明确两个关键参数:pageNo 和 pageSize
前端通常传两个整数:
- pageNo(当前页码):从 1 开始,不是 0
- pageSize(每页条数):比如 10、20
后端据此算出 SQL 中的 offset(跳过多少条)和 limit(取多少条):
offset = (pageNo − 1) × pageSize
limit = pageSize
按数据库类型写对应分页 SQL
不同数据库语法不同,JDBC 本身不提供分页能力,靠你手写 SQL 实现:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
MySQL / PostgreSQL:用
LIMIT ? OFFSET ?
示例:SELECT * FROM user ORDER BY id LIMIT ? OFFSET ? -
SQL Server(2012+):用
OFFSET ? ROWS FETCH NEXT ? ROWS ONLY
示例:SELECT * FROM user ORDER BY id OFFSET ? ROWS FETCH NEXT ? ROWS ONLY -
Oracle(12c+):也支持类似 SQL Server 的写法
示例:SELECT * FROM user ORDER BY id OFFSET ? ROWS FETCH NEXT ? ROWS ONLY
注意:所有带 ORDER BY —— 没排序的分页结果不可靠,同页数据可能重复或遗漏。
用 PreparedStatement 安全传参
避免 SQL 注入,必须用预编译语句设置参数:
String sql = "SELECT * FROM user ORDER BY id LIMIT ? OFFSET ?";
try (Connection conn = DriverManager.getConnection(url, user, pwd);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, pageSize); // 第一个 ? 是 limit
ps.setInt(2, offset); // 第二个 ? 是 offset
try (ResultSet rs = ps.executeQuery()) {
List<user> list = new ArrayList();
while (rs.next()) {
list.add(new User(rs.getInt("id"), rs.getString("name")));
}
return list;
}
}</user>
额外要返回的分页信息怎么获取
前端分页控件(如页码栏、总条数显示)需要知道:
-
totalCount:总记录数 → 单独执行一条
SELECT COUNT(*) FROM user WHERE ... -
totalPages:总页数 →
(totalCount + pageSize - 1) / pageSize(向上取整) -
hasPrevious / hasNext:根据
pageNo和totalPages判断即可
这两个查询(数据 + 总数)建议放在同一个事务里,或用缓存(如 Redis)减少重复 COUNT 压力,尤其在数据变化不频繁时。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










