MyBatis-Plus 中IPage的分页查询

为什么用 IPage?

IPageMyBatis-Plus 定义的一个接口,它不仅仅包含数据列表 (records),还包含了 总记录数 (total)、当前页 (current)、每页大小 (size) 和 总页数 (pages)。

前端拿到这个 JSON 后,可以直接用来渲染分页组件(比如 ElementUI 或 AntD 的分页器)

第一步:配置分页插件(必须!)

MyBatis-Plus 默认不开启物理分页,你需要添加一个配置类来注册 PaginationInnerInterceptor 插件。

为了支持分页查询,我们需要引入 MyBatis-Plus 的核心分页接口 IPage 和分页对象 Page

新建文件 MybatisPlusConfig.java(建议放在 config 包下):

java 复制代码
package com.example.demo.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        
        // 添加分页插件
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        paginationInnerInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        paginationInnerInterceptor.setMaxLimit(500L);
        
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

第二步:Service 层编写分页逻辑

假设你有一个 UserService,我们需要创建一个方法来返回 IPage。

定义 Service 接口 (UserService.java)

java 复制代码
package com.example.demo.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;

public interface UserService extends IService<User> {
    
    /**
     * 分页查询用户
     * @param pageNum 当前页码
     * @param pageSize 每页大小
     * @return 分页结果对象 IPage<User>
     */
    IPage<User> getUserPage(int pageNum, int pageSize);
}

第三步:Controller 层接收参数并返回

在 Controller 中,我们接收前端传来的 pageNum 和 pageSize,然后调用 Service。

java 复制代码
package com.example.demo.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 分页查询接口
     * GET /users/page?pageNum=1&pageSize=10
     */
    @GetMapping("/page")
    public IPage<User> getPage(
            @RequestParam(defaultValue = "1") int pageNum,
            @RequestParam(defaultValue = "10") int pageSize) {
        
        // 直接返回 IPage 对象,Spring Boot 会自动将其序列化为 JSON
        return userService.getUserPage(pageNum, pageSize);
    }
}

进阶技巧:

通常前端不希望直接拿到 MP 原始的 IPage 结构,而是希望包裹在一个统一的 Result 对象中。

你可以修改 Controller 如下:

java 复制代码
import java.util.Map;        
import java.util.HashMap;    
@GetMapping("/page")
public Map<String, Object> getPage(
        @RequestParam(defaultValue = "1") int pageNum,
        @RequestParam(defaultValue = "10") int pageSize) {
    
    IPage<User> userPage = userService.getUserPage(pageNum, pageSize);
    
    Map<String, Object> result = new HashMap<>();
    result.put("code", 200);
    result.put("message", "success");
    result.put("data", userPage.getRecords()); // 只返回数据列表
    result.put("total", userPage.getTotal());   // 返回总数供前端做分页器
    result.put("pages", userPage.getPages());   // 返回总页数
    
    return result;
}

总结:

1.必须配置 MybatisPlusInterceptor 插件。

2.使用 new Page<>(pageNum, pageSize) 创建分页对象。

3.使用 baseMapper.selectPage(page, wrapper) 执行查询。

4.IPage 包含了 records (数据), total (总数), pages (总页数) 等关键信息。

相关推荐
weixin_727535622 小时前
Spring @Transactional 事务失效:原理层面深度解析
java·spring
没钥匙的锁13 小时前
16-Java反射机制:Spring IOC背后的核心技术
java·开发语言·spring
geinvse_seg3 小时前
飞算JavaAI:把企业采购协同需求拆成一套可运行的慧采平台
java·ai·飞算
烛影摇红透纱窗4 小时前
ForkJoinPool 与工作窃取
java
浩瀚地学4 小时前
【面试算法笔记】0302-哈希表-哈希表实现
java·经验分享·笔记·算法·面试
AC赳赳老秦5 小时前
时间开销自动统计:OpenClaw 记录工作任务时长、分析时间分配、给出优化建议
java·大数据·开发语言·python·自动化·deepseek·openclaw
名侦探7225 小时前
构建 Agent 的五大难点与解决方案
java·大数据·人工智能
Demons_kirit5 小时前
图库原理(以阿里云OSS为案例)
java·阿里云·云计算
SimonKing5 小时前
那个号称"对标 Spring"的国产框架 Solon,到底行不行?
java·后端·程序员
Lethehong5 小时前
飞算Java:从需求梳理到风险闭环,搭建云盾企业信息安全与权限管理平台
java·开发语言