java中如何分页
分页的实现方法
在Java中实现分页功能可以通过多种方式,以下是几种常见的实现方法:
使用数据库的分页查询
大多数数据库支持分页查询语法,例如MySQL的LIMIT和Oracle的ROWNUM。通过SQL语句直接限制返回的数据量。
MySQL示例:
SELECT * FROM table_name LIMIT offset, page_size
Java代码示例:
String sql = "SELECT * FROM table_name LIMIT ?, ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setInt(1, (pageNum - 1) * pageSize); // offset
stmt.setInt(2, pageSize); // pageSize
ResultSet rs = stmt.executeQuery();
使用JPA的分页
如果使用JPA(如Hibernate),可以利用Pageable接口实现分页。
示例代码:
Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
Page<Entity> page = repository.findAll(pageable);
List<Entity> entities = page.getContent();
使用MyBatis的分页
MyBatis可以通过插件如PageHelper实现分页。
添加依赖后,代码示例:
PageHelper.startPage(pageNum, pageSize);
List<Entity> list = mapper.selectAll();
PageInfo<Entity> pageInfo = new PageInfo<>(list);
内存分页
如果数据已加载到内存中,可以使用Java集合的subList方法进行分页。
示例代码:
List<Entity> allData = ...; // 所有数据
int fromIndex = (pageNum - 1) * pageSize;
int toIndex = Math.min(fromIndex + pageSize, allData.size());
List<Entity> pageData = allData.subList(fromIndex, toIndex);
分页参数封装
通常需要封装分页参数和结果,常见的分页对象包含以下属性:
public class PageResult<T> {
private int pageNum; // 当前页码
private int pageSize; // 每页数量
private long total; // 总记录数
private List<T> data; // 当前页数据
}
前端分页交互
前端通常需要传递分页参数,常见的参数包括:
pageNum:当前页码pageSize:每页显示数量
后端返回分页结果时,除了当前页数据外,还应包含总记录数,以便前端计算总页数。
性能优化建议
对于大数据量的分页,避免使用LIMIT offset, size方式,特别是offset很大时性能较差。可以考虑以下优化:

- 使用索引覆盖扫描
- 记录上次查询的ID,使用条件
WHERE id > last_id LIMIT size - 使用缓存减少数据库查询压力






