Java中MySQL分页需用LIMIT offset,n计算偏移量offset=(pageNum-1)pageSize,并用PreparedStatement防止SQL注入;同时单独查COUNT()获取总数以支持页码渲染。

Java 中通过 MySQL 的 LIMIT 实现后端分页,核心是正确计算偏移量(offset)和每页条数(limit),并结合 PreparedStatement 防止 SQL 注入。
理解 LIMIT 的两种写法
MySQL 中 LIMIT 支持两种语法:
-
LIMIT n:取前 n 条记录(等价于LIMIT 0, n) -
LIMIT offset, n:从第offset条开始(从 0 开始计数),取 n 条
分页必须用第二种形式。例如第 3 页、每页 10 条,对应 LIMIT 20, 10(跳过前 20 条,取接下来的 10 条)。
Java 中动态计算 offset 和 limit
假设前端传参:pageNum = 3(当前页码,从 1 开始)、pageSize = 10(每页数量):
立即学习“Java免费学习笔记(深入)”;
offset = (pageNum - 1) * pageSizelimit = pageSize
注意:pageNum 必须校验是否 ≥ 1,pageSize 应限制最大值(如 ≤ 100),避免恶意请求拖垮数据库。
使用 PreparedStatement 安全拼接
不要字符串拼接 SQL,要用占位符:
String sql = "SELECT id, name, email FROM user ORDER BY id DESC LIMIT ?, ?"; PreparedStatement ps = connection.prepareStatement(sql); ps.setInt(1, offset); ps.setInt(2, limit); ResultSet rs = ps.executeQuery();
这样既防止 SQL 注入,又支持预编译优化。
配套查总数用于计算总页数
分页通常还需返回总记录数,供前端渲染页码栏:
- 单独执行一条
SELECT COUNT(*) FROM user WHERE ...(条件需与主查询一致) - 避免在同一个 SQL 中用
SQL_CALC_FOUND_ROWS(已废弃且性能差) - 可考虑缓存总数或用近似值(如数据量极大时)降低压力


















