Java 实现分页的几种方式详解
在Java中实现分页通常有以下几种方式:
- 手动分页:使用
List.subList
方法手动对查询结果进行分页。适用于内存中的数据集合。
List<Item> items = getAllItems(); // 假设这是一个非常大的列表
int pageSize = 10;
int pageNo = 2;
int fromIndex = (pageNo - 1) * pageSize;
int toIndex = fromIndex + pageSize;
if (fromIndex >= items.size()) {
// 分页越界处理
} else {
List<Item> pageItems = items.subList(fromIndex, Math.min(toIndex, items.size()));
// 使用pageItems进行分页处理
}
- 使用JPA的
Pageable
接口:适用于使用Spring Data JPA的场景。
public Page<Item> findByName(String name, Pageable pageable) {
// Spring Data JPA 会自动处理分页逻辑
}
- 使用MyBatis的
RowBounds
类:适用于MyBatis的场景。
List<Item> selectByPage(RowBounds rowBounds);
使用时:
int offset = (pageNum - 1) * pageSize;
int limit = pageSize;
RowBounds rowBounds = new RowBounds(offset, limit);
List<Item> items = itemMapper.selectByPage(rowBounds);
- 使用MySQL的
LIMIT
和OFFSET
关键字:适用于直接在SQL查询中实现分页。
SELECT * FROM items LIMIT #{pageSize} OFFSET #{offset};
- 使用JDBC的
Statement
设置可滚动结果集:适用于需要手动编写SQL并通过JDBC进行查询。
String sql = "SELECT * FROM items";
Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet resultSet = statement.executeQuery(sql);
// 跳过前面的行
resultSet.absolute((pageNum - 1) * pageSize);
// 获取当前页的数据
int count = 0;
while (resultSet.next() && count < pageSize) {
// 处理每一行数据
++count;
}
- 使用数据库支持的
OFFSET..FETCH
子句:适用于支持SQL2012标准的现代数据库。
SELECT * FROM items ORDER BY id OFFSET #{offset} ROWS FETCH NEXT #{pageSize} ROWS ONLY;
根据你的数据库和框架选择合适的分页方式。
评论已关闭