java分页插件| MyBatis-Plus分页 vs PageHelper分页:全面对比与最佳实践

MyBatis-Plus分页 vs PageHelper分页:全面对比与最佳实践

一、分页技术概述

在Java持久层框架中,分页是高频使用的功能。主流方案有:

  1. MyBatis-Plus分页:MyBatis增强工具的内置分页方案
  2. PageHelper分页:独立的MyBatis分页插件

二、核心相同点

基础功能一致

  • 都支持物理分页(LIMIT语句)
  • 都能返回分页元数据(当前页、总页数等)
  • 都基于MyBatis拦截器实现

开发体验

  • 都只需少量代码即可实现分页
  • 都支持主流关系型数据库

三、关键差异对比

特性 MyBatis-Plus分页 PageHelper分页
依赖关系 需集成MyBatis-Plus 独立jar包
分页启动方式 构造Page对象传参 ThreadLocal静态方法
返回值 IPage接口对象 PageInfo包装List
复杂SQL支持 有限制(如嵌套查询可能失效) 支持更复杂SQL场景
多数据源支持 需要特殊配置 天然支持
COUNT查询 自动执行(可关闭) 自动执行(可关闭)
与ORM集成 深度集成条件构造器 兼容任何MyBatis用法

四、使用指南

1. MyBatis-Plus分页使用

① 配置拦截器

java 复制代码
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

五、实战案例

案例1:多表联合分页查询(推荐PageHelper)

java 复制代码
// 使用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)

java 复制代码
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查询(大数据量时)
java 复制代码
// MyBatis-Plus
Page<User> page = new Page<>(pageNum, size, false);

// PageHelper
PageHelper.startPage(pageNum, size, false);
  • 2.特殊语法支持
java 复制代码
// 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。无论哪种方案,都应关注分页性能,避免全表扫描

相关推荐
嘻哈∠※3 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7984 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2585 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅5 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
极创信息7 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒7 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
喜欢的名字被抢了7 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
数据知道8 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
2601_949950638 小时前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐
Rain的Java大神之路9 小时前
MQ重复消费问题怎么解决
java·经验分享·后端·面试·架构·rabbitmq·rocketmq