MyBatis-Plus 内置分页、PageHelper 自定义分页

一、方式 1:MyBatis-Plus 自带分页

1. 必须配置分页拦截器(否则 total=0)

java

运行

复制代码
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

2. 使用示例(Service 层)

java

运行

复制代码
// pageNum 当前页,pageSize 每页条数
Page<OrderInfo> page = new Page<>(1, 10);
LambdaQueryWrapper<OrderInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderInfo::getIsDelete, 0).orderByDesc(OrderInfo::getCreateTime);
// 执行分页查询
Page<OrderInfo> pageResult = orderService.page(page, wrapper);

// 分页结果取值
List<OrderInfo> records = pageResult.getRecords(); // 当前页数据
long total = pageResult.getTotal(); // 总条数
long pages = pageResult.getPages(); // 总页数

3. XML 自定义多表分页

Mapper 接口第一个参数必须传 Page 对象,无需手写 limit

java

运行

复制代码
Page<OrderVO> selectOrderPage(Page<OrderVO> page, @Param("name") String name);

xml

复制代码
<select id="selectOrderPage" resultType="com.vo.OrderVO">
    SELECT o.*,p.product_name
    FROM order_info o
    LEFT JOIN product p ON o.product_id = p.id
    <where>
        <if test="name != null">p.product_name like concat('%',#{name},'%')</if>
        o.is_delete = 0
    </where>
</select>

二、方式 2:PageHelper 自定义分页(独立分页插件,原生 MyBatis 专用)

1. Maven 引入依赖

xml

复制代码
<!-- SpringBoot3适配 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.7</version>
</dependency>

2. yml 简单配置

yaml

复制代码
pagehelper:
  helperDialect: mysql
  reasonable: true # 页码小于1查第一页,超过总页数查最后一页
  pageSizeZero: false

3. 核心使用语法(两行代码)

关键点:PageHelper.startPage(pageNum,pageSize) 必须紧跟查询 Mapper 方法,中间不能有其他 SQL 查询

java

运行

复制代码
// 1. 设置分页参数,自动拦截下一条SQL拼接limit
PageHelper.startPage(1,10);
// 2. 执行普通全量查询(无需写分页逻辑)
List<OrderInfo> list = orderMapper.selectAllOrder();
// 3. 封装分页结果
PageInfo<OrderInfo> pageInfo = new PageInfo<>(list);

// 分页参数获取
List<OrderInfo> data = pageInfo.getList();
long total = pageInfo.getTotal();
int pages = pageInfo.getPages();

4. Mapper XML 就是普通查询,不需要处理分页

xml

复制代码
<select id="selectAllOrder" resultType="OrderInfo">
    select * from order_info where is_delete = 0
</select>

5. 安全注意

startPage 仅对紧随其后第一条 select 生效,中间如果执行其他查询会导致分页错乱; 禁止循环内使用 PageHelper,容易分页污染。


两种分页核心对比

表格

对比项 MyBatis-Plus 分页 PageHelper 分页
依赖关系 MP 内置,无需额外包 独立第三方插件,额外引入
使用方式 方法第一个参数传入 Page 对象 查询前调用PageHelper.startPage()静态方法
多表自定义 SQL 支持,自动拼接 limit 完全兼容原生 XML,无需改造 SQL
Lambda 条件 支持 LambdaQueryWrapper,无硬编码字段 仅原生 MyBatis,无 Lambda
分页参数传递 方法入参传递,代码直观 基于线程 ThreadLocal 存储分页参数,隐式生效
主流场景 SpringBoot+MyBatis-Plus 项目(你的项目) 纯原生 MyBatis 无 MP 的老项目

补充 Controller 标准返回封装示例

MP 分页返回

java

运行

复制代码
@GetMapping("/order/page")
public Result<Page<OrderInfo>> page(
        @RequestParam(defaultValue = "1") Integer pageNum,
        @RequestParam(defaultValue = "10") Integer pageSize
){
    Page<OrderInfo> page = new Page<>(pageNum, pageSize);
    LambdaQueryWrapper<OrderInfo> wrapper = new LambdaQueryWrapper<>();
    Page<OrderInfo> res = orderService.page(page,wrapper);
    return Result.success(res);
}

PageHelper 分页返回

java

运行

复制代码
@GetMapping("/order/page")
public Result<PageInfo<OrderInfo>> page(
        @RequestParam(defaultValue = "1") Integer pageNum,
        @RequestParam(defaultValue = "10") Integer pageSize
){
    PageHelper.startPage(pageNum,pageSize);
    List<OrderInfo> list = orderMapper.selectAllOrder();
    PageInfo<OrderInfo> pageInfo = new PageInfo<>(list);
    return Result.success(pageInfo);
}
相关推荐
4154114 小时前
MyBatis-Plus + PostGIS 实战(1.1):Geometry 字段在 Swagger 中的优雅展示
java·mybatis·postgis
4154111 天前
MyBatis-Plus + PostGIS 实战一(基础篇)
java·mybatis·postgis
Wang's Blog1 天前
Java框架快速入门:深入MyBatis-Plus高级DML操作(ID策略·逻辑删除·乐观锁)
java·数据库·mybatis
丑八怪大丑2 天前
MyBatis
mybatis
从此以后自律2 天前
MyBatis 与 MyBatis-Plus 完整对比讲解
mybatis
SQL-First布道者2 天前
Spring JDBC Ultra 十边型战士
java·spring boot·后端·mysql·spring·mybatis
han_hanker3 天前
sql语法 MyBatis <foreach> 标签详解
windows·sql·mybatis
ByWalker_4 天前
web应用技术—MyBatis入门
java·数据库·mybatis·lombok
ylscode5 天前
Cloudflare Workers Cache 深度解析:边缘缓存如何重塑无服务器性能边界
java·spring·mybatis