Java Boot分页案例实现开发全攻略:从零到精通
目录导读
分页技术概述与核心原理
什么是分页?
分页是将大量数据分割成多个小页面显示的技术,核心目标是减少单次数据加载量,提升用户体验和系统性能,在Java Boot开发中,分页主要分为物理分页和逻辑分页两种。

物理分页:通过SQL语句的LIMIT/OFFSET关键字直接操作数据库,只查询当前页所需数据。 逻辑分页:一次性查询所有数据,在内存中通过Java代码截取当前页数据。
开发建议:大型项目请务必使用物理分页,避免内存溢出。
为什么需要分页?
- 提升页面加载速度(肉眼可见的体验差异)
- 减轻数据库和服务器的压力
- 便于数据导航和用户操作
- 符合搜索引擎对结构化数据的偏好
Spring Boot分页基础搭建
1 环境准备
首先在pom.xml中引入核心依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2 实体类与数据库设计
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private String email;
private LocalDateTime createTime;
}
3 原生JDBC分页实现(不推荐生产使用)
public List<User> getUsersByPage(int page, int size) {
String sql = "SELECT * FROM user LIMIT ? OFFSET ?";
// 计算偏移量
int offset = (page - 1) * size;
// 执行查询并返回结果
}
MyBatis Plus分页插件实战
1 添加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
2 配置分页插件
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
3 Service层实现
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public IPage<User> getUsersPage(int current, int size) {
Page<User> page = new Page<>(current, size);
return this.page(page);
}
}
4 Controller层接口
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/page")
public Result<IPage<User>> list(@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) {
IPage<User> userPage = userService.getUsersPage(page, size);
return Result.success(userPage);
}
}
问答环节:MyBatis Plus分页会自动计算总记录数吗? 答:是的,Page对象会自动执行count查询,但建议在数据量极大时关闭自动count,改为手动统计以提高性能。
PageHelper分页案例详解
1 引入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
2 基础使用方式
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public PageInfo<User> getUsersByPage(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<User> userList = userMapper.selectAll();
return new PageInfo<>(userList);
}
}
3 与MyBatis Plus对比
| 特性 | MyBatis Plus | PageHelper |
|---|---|---|
| 配置复杂度 | 需配置插件 | 自动配置 |
| 性能开销 | 更优(可控制count) | 略高(自动count) |
| 兼容性 | 强(与MP深度集成) | 通用(适配多种框架) |
问答环节:PageHelper的线程安全问题如何处理? 答:PageHelper使用ThreadLocal存储分页参数,务必在查询后立即调用PageHelper.clearPage()清理,或在Service层使用try-finally包裹。
前端分页组件集成
1 基于Vue3 + Element Plus的实现
<template>
<el-pagination
v-model:current-page="page"
:page-size="size"
:total="total"
@current-change="handlePageChange"
/>
</template>
<script setup>
const page = ref(1)
const size = ref(10)
const total = ref(0)
const fetchData = async () => {
const res = await axios.get('/api/users/page', {
params: { page: page.value, size: size.value }
})
total.value = res.data.data.total
}
</script>
2 前端分页参数设计原则
- 起始页码从1开始(与后端默认值一致)
- 每页条数建议允许用户自定义(10、20、50、100)
- 分页组件需包含“前往”按钮和页码跳转功能
常见问题与性能优化
问题1:分页查询结果不准?
原因:数据在分页过程中发生增删改。 解决方案:使用乐观锁或版本号控制,或接受“近似正确”的分页结果。
问题2:深度分页性能差?
问题表现:查询第10000页时变慢。 解决方案:
- 限制最大翻页数(如只允许前100页)
- 使用游标分页(基于ID或时间戳)
- 采用“延迟关联”技术
性能优化要点
- 索引优化:确保ORDER BY和WHERE字段建立联合索引
- **避免SELECT ***:只查询需要的字段
- 缓存策略:高频分页数据可缓存到Redis
- 异步分页:搭配消息队列实现非阻塞分页
问答环节:大表分页应该用哪种方案? 答:推荐使用“覆盖索引+子查询”方案,
SELECT * FROM user WHERE id > (SELECT id FROM user ORDER BY id LIMIT 100000, 1) LIMIT 10;
本文从分页原理出发,详细介绍了Spring Boot中三种主流分页实现方案:原生JDBC、MyBatis Plus分页插件、PageHelper,重点突出了生产环境推荐的MyBatis Plus方案,并提供了前端集成示例和性能优化指南。
核心建议:
- 中小型项目优先使用MyBatis Plus分页插件
- 大型系统评估使用游标分页或覆盖索引方案
- 始终配置合理的分页参数校验和异常处理
- 前端与后端分页参数保持严格一致
通过本文的案例代码和最佳实践,开发者可以快速在Java Boot项目中实现高效、稳定的分页功能。