MyBatis 和 MyBatis-Plus 分页查询的区别
MyBatis 和 MyBatis-Plus 都支持分页查询,但它们的实现方式和易用性有显著差异。以下是两者的主要区别:
1. 实现方式不同
MyBatis (使用 PageHelper)
- 基于拦截器:通过拦截 SQL 语句动态修改为分页查询
- 物理分页:生成带有 LIMIT 或 ROWNUM 的真实分页 SQL
- 需要插件:必须集成 PageHelper 插件
// MyBatis + PageHelper 示例
PageHelper.startPage(1, 10); // 第1页,每页10条
List<User> users = userMapper.selectList();
PageInfo<User> pageInfo = new PageInfo<>(users);
MyBatis-Plus
- 内置分页:原生支持分页,无需额外插件
- 接口统一:通过
IPage
接口实现 - 配置简单:只需配置分页拦截器
// MyBatis-Plus 示例
Page<User> page = new Page<>(1, 10); // 第1页,每页10条
IPage<User> userPage = userMapper.selectPage(page, null);
2. API 设计差异
特性 | MyBatis (PageHelper) | MyBatis-Plus |
---|---|---|
分页启动方式 | PageHelper.startPage() | 创建 Page 对象 |
分页结果获取 | PageInfo 或 Page | IPage 接口 |
分页参数 | 方法参数 | 对象属性 |
总记录数 | pageInfo.getTotal() | page.getTotal() |
当前页数据 | pageInfo.getList() | page.getRecords() |
3. 功能对比
MyBatis (PageHelper) 特点
- 支持多种数据库方言
- 支持多种分页方式(普通分页、计数分页等)
- 支持 lambda 表达式写法
- 需要手动处理分页参数传递
MyBatis-Plus 特点
- 与 MyBatis-Plus 其他功能深度集成
- 支持自动分页(无需手动调用分页方法)
- 支持 XML 和注解两种方式的分页
- 分页信息包含在返回对象中
4. 代码示例对比
MyBatis + PageHelper 实现
// 服务层
public PageInfo<User> getUsers(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectAll();
return new PageInfo<>(users);
}
// Mapper接口
@Select("SELECT * FROM user")
List<User> selectAll();
MyBatis-Plus 实现
// 服务层
public IPage<User> getUsers(int pageNum, int pageSize) {
Page<User> page = new Page<>(pageNum, pageSize);
return userMapper.selectPage(page, null);
}
// Mapper接口
public interface UserMapper extends BaseMapper<User> {
// 无需手动编写分页查询方法
}
5. 选择建议
- 简单项目/已有 MyBatis 项目:使用 PageHelper 足够
- 新项目/大量 CRUD 操作:推荐 MyBatis-Plus
- 需要深度定制分页逻辑:PageHelper 更灵活
- 追求开发效率:MyBatis-Plus 更简洁
MyBatis-Plus 的分页设计更加面向对象,与它的其他功能(如条件构造器)配合使用更加流畅,而 PageHelper 则更加轻量级且灵活。