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);
}
相关推荐
无风听海17 小时前
深入解析 Elasticsearch 的 match_phrase_prefix与 match_bool_prefix
大数据·elasticsearch·mybatis
摆烂z18 小时前
定时任务同步数据--续跑&重试
java·mybatis·ai编程
Wang's Blog2 天前
Java框架快速入门: Spring Security+OAuth2之实现UserDetails与GrantedAuthority深度定制
java·spring·mybatis
阿维的博客日记3 天前
Example 类全场景实战指南
java·mybatis
阿维的博客日记4 天前
Example API指南2
java·mybatis
霸道流氓气质5 天前
MyBatis 与 SQL 层面关键技术详解
windows·sql·mybatis
₍˄·͈༝·͈˄*₎◞ ̑̑码5 天前
MyBatis操作数据库
数据库·mybatis
干到60岁退休的码农6 天前
13.构建登录接口响应数据
java·spring boot·mybatis
SQL-First布道者7 天前
我为什么把 MyBatis 从项目中删了?
java·spring·tomcat·mybatis·mybatis plus·spring jdbc
爱折腾的编程老炮7 天前
潮玩品牌自建抽盒机小程序——商城 + 抽盒 + 一番赏 + 会员 + 社区,一套代码怎么搭
spring boot·小程序·vue·mybatis·uniapp