java如何后端分页
Java后端分页实现方法
使用JPA分页
JPA的Pageable接口和Page对象可以快速实现分页。在Spring Data JPA中直接通过方法名或@Query注解实现分页查询。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Page<User> findAll(Pageable pageable);
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public Page<User> getUsers(int page, int size) {
Pageable pageable = PageRequest.of(page, size, Sort.by("id"));
return userRepository.findAll(pageable);
}
}
MyBatis分页
MyBatis可以通过RowBounds或分页插件实现。推荐使用PageHelper插件简化操作。
添加依赖后,在Service层调用前设置分页参数:
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(users);
手动SQL分页
对于原生SQL,可以使用数据库的分页语法。MySQL使用LIMIT,Oracle使用ROWNUM。

MySQL示例:
SELECT * FROM users LIMIT #{offset}, #{pageSize}
对应Mapper接口:

@Mapper
public interface UserMapper {
@Select("SELECT * FROM users LIMIT #{offset}, #{pageSize}")
List<User> selectByPage(@Param("offset") int offset, @Param("pageSize") int pageSize);
}
Spring Data MongoDB分页
MongoDB的分页通过PageRequest和聚合查询实现:
public Page<User> getUsers(int page, int size) {
Pageable pageable = PageRequest.of(page, size);
Query query = new Query().with(pageable);
List<User> users = mongoTemplate.find(query, User.class);
long total = mongoTemplate.count(query, User.class);
return new PageImpl<>(users, pageable, total);
}
通用分页响应封装
建议统一分页响应格式,包含数据列表和分页信息:
public class PageResult<T> {
private List<T> content;
private int totalPages;
private long totalElements;
private int pageNumber;
private int pageSize;
// 构造方法和getter/setter
}
实现分页转换工具方法:
public static <T> PageResult<T> toPageResult(Page<T> page) {
PageResult<T> result = new PageResult<>();
result.setContent(page.getContent());
result.setTotalPages(page.getTotalPages());
result.setTotalElements(page.getTotalElements());
result.setPageNumber(page.getNumber());
result.setPageSize(page.getSize());
return result;
}
性能优化建议
- 避免
COUNT(*)全表扫描,大数据量表使用估算值或缓存 - 分页查询时确保排序字段有索引
- 深度分页使用
WHERE id > ? LIMIT ?替代LIMIT ?, ? - 前端传递排序参数时做好字段白名单校验






