java分页插件| MyBatis-Plus分页 vs PageHelper分页:全面对比与最佳实践
MyBatis-Plus分页 vs PageHelper分页:全面对比与最佳实践
一、分页技术概述
在Java持久层框架中,分页是高频使用的功能。主流方案有:
- MyBatis-Plus分页:MyBatis增强工具的内置分页方案
- PageHelper分页:独立的MyBatis分页插件
二、核心相同点
✅ 基础功能一致:
- 都支持物理分页(LIMIT语句)
- 都能返回分页元数据(当前页、总页数等)
- 都基于MyBatis拦截器实现
✅ 开发体验:
- 都只需少量代码即可实现分页
- 都支持主流关系型数据库
三、关键差异对比
特性 | MyBatis-Plus分页 | PageHelper分页 |
---|---|---|
依赖关系 | 需集成MyBatis-Plus | 独立jar包 |
分页启动方式 | 构造Page对象传参 | ThreadLocal静态方法 |
返回值 | IPage接口对象 | PageInfo包装List |
复杂SQL支持 | 有限制(如嵌套查询可能失效) | 支持更复杂SQL场景 |
多数据源支持 | 需要特殊配置 | 天然支持 |
COUNT查询 | 自动执行(可关闭) | 自动执行(可关闭) |
与ORM集成 | 深度集成条件构造器 | 兼容任何MyBatis用法 |
四、使用指南
1. MyBatis-Plus分页使用
① 配置拦截器
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
五、实战案例
案例1:多表联合分页查询(推荐PageHelper)
// 使用PageHelper
public PageInfo<UserVO> getUsersWithDepartment(int pageNum) {PageHelper.startPage(pageNum, 10);List<UserVO> list = userMapper.selectUsersWithDept();return new PageInfo<>(list);
}// SQL示例
@Select("SELECT u.*, d.dept_name FROM user u LEFT JOIN department d ON u.dept_id = d.id")
List<UserVO> selectUsersWithDept();
案例2:条件构造器分页(推荐MyBatis-Plus)
public IPage<User> searchUsers(String keyword, int pageNum) {LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();wrapper.like(User::getName, keyword);Page<User> page = new Page<>(pageNum, 10);return userMapper.selectPage(page, wrapper);
}
六、性能优化建议
- 1.关闭COUNT查询(大数据量时)
// MyBatis-Plus
Page<User> page = new Page<>(pageNum, size, false);// PageHelper
PageHelper.startPage(pageNum, size, false);
- 2.特殊语法支持
// PageHelper对特殊语法更友好
PageHelper.startPage(1, 10).setCount(false);
List<Map<String,Object>> list = starrocksMapper.complexQuery();
-
3.索引优化
-
4.确保分页字段有索引
-
5.带排序时建立复合索引
七、技术选型推荐
👉 推荐MyBatis-Plus分页
当:
项目已集成MyBatis-Plus
需要与条件构造器配合使用
使用标准SQL语法
需要强类型分页对象
👉 推荐PageHelper
当:
需要兼容原生MyBatis
涉及复杂SQL(嵌套/UNION等)
使用StarRocks等特殊数据库
需要快速集成多数据源
八、常见问题解答
Q:为什么PageHelper对复杂SQL支持更好?
A:PageHelper采用更"粗放"的拦截方式,不会深度解析SQL,而MyBatis-Plus的拦截器会尝试智能分析SQL结构。
Q:百万数据量如何优化?
使用游标分页(基于排序字段)
禁用COUNT查询
添加合适的索引
📌 最佳实践总结:新项目建议统一使用MyBatis-Plus分页,遗留系统或特殊需求使用PageHelper。无论哪种方案,都应关注分页性能,避免全表扫描