Java MySQL 查询分页实现
在Java应用中实现MySQL分页查询通常有两种主要方法:使用LIMIT子句和使用游标,下面我将详细介绍这两种方法。

使用LIMIT子句(推荐)
这是最常用和最高效的分页方式。
基本语法
SELECT * FROM table_name LIMIT offset, count;
或者:
SELECT * FROM table_name LIMIT count OFFSET offset;
offset是偏移量(从0开始)count是每页记录数
Java实现示例
import java.sql.*;
public class PaginationExample {
private static final String DB_URL = "jdbc:mysql://localhost:3306/your_database";
private static final String USER = "username";
private static final String PASS = "password";
public static void main(String[] args) {
int page = 1; // 当前页码
int pageSize = 10; // 每页记录数
// 计算偏移量
int offset = (page - 1) * pageSize;
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement stmt = conn.prepareStatement(
"SELECT * FROM your_table LIMIT ? OFFSET ?")) {
// 设置参数
stmt.setInt(1, pageSize);
stmt.setInt(2, offset);
// 执行查询
ResultSet rs = stmt.executeQuery();
// 处理结果集
while (rs.next()) {
// 获取数据并处理
int id = rs.getInt("id");
String name = rs.getString("name");
// 其他字段...
System.out.println("ID: " + id + ", Name: " + name);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
获取总记录数(用于分页导航)
// 在同一个try-with-resources块中添加
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement countStmt = conn.prepareStatement("SELECT COUNT(*) FROM your_table");
ResultSet countRs = countStmt.executeQuery()) {
if (countRs.next()) {
int totalRecords = countRs.getInt(1);
int totalPages = (int) Math.ceil((double) totalRecords / pageSize);
System.out.println("总记录数: " + totalRecords + ", 总页数: " + totalPages);
}
}
使用游标(适用于大数据集)
对于非常大的数据集,使用游标可以更高效地分页。
基本思路
- 首先获取上一页的最后一条记录的ID(或排序字段)
- 然后查询ID大于该值(或根据排序条件)的下一页数据
Java实现示例
假设表有一个自增的id字段:

public void cursorPagination(int lastId, int pageSize) {
String sql = "SELECT * FROM your_table WHERE id > ? ORDER BY id LIMIT ?";
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, lastId);
stmt.setInt(2, pageSize);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
注意事项
-
性能优化:
- 确保分页字段有索引
- 对于深度分页(如第1000页),考虑使用"seek method"(游标方法)
- 避免使用
SELECT *,只查询需要的字段
-
排序:
- 分页查询通常需要排序,否则结果顺序可能不稳定
- 使用
ORDER BY子句指定排序字段
-
事务管理:
在事务中执行分页查询,特别是在需要一致性的场景下
(图片来源网络,侵删) -
ORM框架支持:
- 如果使用Hibernate、MyBatis等框架,它们提供了内置的分页支持
- 例如Hibernate:
session.createQuery("...").setFirstResult(offset).setMaxResults(pageSize)
使用Spring Data JPA的分页示例
如果你使用Spring Data JPA,分页非常简单:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Page<User> findAll(Pageable pageable);
}
// 在服务层使用
Pageable pageable = PageRequest.of(page - 1, pageSize, Sort.by("name").ascending());
Page<User> page = userRepository.findAll(pageable);
就是在Java中实现MySQL分页查询的主要方法,你可以根据具体需求选择最适合的方案。
