java sql 如何分页
分页查询的实现方法
在Java中结合SQL实现分页查询,通常有以下几种常见方式:
使用LIMIT和OFFSET(MySQL/PostgreSQL等)
SELECT * FROM table_name LIMIT pageSize OFFSET (pageNum - 1) * pageSize;
或简写为:
SELECT * FROM table_name LIMIT (pageNum - 1) * pageSize, pageSize;
使用ROWNUM(Oracle)
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM table_name ORDER BY sort_column
) a WHERE ROWNUM <= pageNum * pageSize
) WHERE rn > (pageNum - 1) * pageSize;
使用ROW_NUMBER()(SQL Server)
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER(ORDER BY sort_column) AS row_num
FROM table_name
) t WHERE row_num BETWEEN (pageNum - 1) * pageSize + 1 AND pageNum * pageSize;
Java中的实现示例
JDBC原生实现
public List<Map<String, Object>> queryByPage(int pageNum, int pageSize) {
String sql = "SELECT * FROM users LIMIT ? OFFSET ?";
int offset = (pageNum - 1) * pageSize;
try (Connection conn = dataSource.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, pageSize);
pstmt.setInt(2, offset);
ResultSet rs = pstmt.executeQuery();
// 处理结果集...
} catch (SQLException e) {
// 异常处理
}
}
MyBatis实现
Mapper接口:
@Select("SELECT * FROM users LIMIT #{pageSize} OFFSET #{offset}")
List<User> getUsersByPage(@Param("offset") int offset, @Param("pageSize") int pageSize);
调用代码:
int pageNum = 2;
int pageSize = 10;
int offset = (pageNum - 1) * pageSize;
List<User> users = userMapper.getUsersByPage(offset, pageSize);
JPA/Hibernate实现
public Page<User> getUsersByPage(int pageNum, int pageSize) {
Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
return userRepository.findAll(pageable);
}
性能优化建议
大数据量分页时避免使用OFFSET,改用基于索引的分页方式:

SELECT * FROM table_name WHERE id > last_id ORDER BY id LIMIT pageSize;
考虑使用缓存机制存储热点数据的分页结果,减少数据库查询压力。对于复杂查询,建议在业务层实现分页逻辑而非数据库层。






