1. 项目概述与背景
在现代Web应用开发中,数据分页和搜索功能几乎是每个项目的标配需求。当数据量达到数千甚至数万条时,一次性加载所有数据不仅会拖慢页面响应速度,还会给服务器和数据库带来不必要的压力。我在最近的一个电商后台管理系统项目中就遇到了这样的场景:用户表数据量超过10万条,管理员需要快速查找特定用户信息。
传统的全量查询方式在这个场景下完全不可行。页面加载时间超过15秒,用户体验极差。通过引入MyBatis分页和动态搜索功能,我们将查询响应时间控制在200毫秒以内,同时大幅降低了服务器资源消耗。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术栈选型与配置
2.1 后端技术栈解析
SpringBoot 3.x 作为基础框架,提供了自动配置、依赖管理等便利功能。选择最新版本3.x而非2.x,主要是为了利用其更好的性能和对Java 17的支持。
MyBatis 作为ORM框架,相比Hibernate提供了更灵活的SQL控制能力。对于需要复杂查询和性能优化的场景特别适合。
PageHelper 是MyBatis最流行的分页插件,其原理是通过拦截器在SQL执行前自动添加LIMIT语句。我们选择它的原因包括:
- 使用简单,只需几行代码即可实现分页
- 支持多种数据库(MySQL、Oracle等)
- 与MyBatis无缝集成
- 社区活跃,文档完善
2.2 前端技术栈解析
Vue 3 采用Composition API,相比Options API代码组织更灵活。特别是对于复杂组件,逻辑可以更好地复用和组合。
Element Plus 是Vue 3的UI组件库,提供了现成的表格和分页组件。其表格组件支持:
- 分页集成
- 排序
- 筛选
- 自定义列渲染
- 响应式布局
axios 作为HTTP客户端,相比原生fetch API提供了更丰富的功能:
- 请求/响应拦截器
- 自动转换JSON数据
- 客户端支持防御XSRF
- 请求取消
2.3 环境准备与依赖配置
后端Maven依赖配置关键点:
xml复制<!-- PageHelper分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
这里排除了内置的MyBatis依赖是为了避免与项目中的其他MyBatis版本冲突。在实际项目中,我遇到过因为版本冲突导致的分页失效问题,所以这个排除配置很重要。
前端npm依赖安装:
bash复制npm install axios element-plus --save
3. 后端分页实现详解
3.1 PageHelper工作原理
PageHelper通过MyBatis的拦截器机制实现分页。当调用PageHelper.startPage()方法后,它会创建一个Page对象并存入ThreadLocal中。在执行SQL时,拦截器会检测到这个Page对象,并自动改写原始SQL,添加数据库特定的分页语句。
对于MySQL,它会将:
sql复制SELECT * FROM user
改写为:
sql复制SELECT * FROM user LIMIT 0,10
3.2 Service层实现
完整的Service层分页实现:
java复制@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public PageInfo<User> selectPage(Integer pageNum, Integer pageSize, User query) {
// 开启分页,必须放在查询方法前
PageHelper.startPage(pageNum, pageSize);
// 执行查询
List<User> users = userMapper.findAll(query);
// 包装为PageInfo对象
return PageInfo.of(users);
}
}
关键点:
PageHelper.startPage()必须放在查询方法前调用- 查询方法返回的是普通List,但实际已经是分页后的结果
PageInfo包含了丰富的分页信息(总页数、当前页、每页条数等)
3.3 Controller层设计
RESTful风格的Controller实现:
java复制@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public Result<PageInfo<User>> listUsers(
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size,
