MyBatis-Plus IPage分页查询全解析与实战指南

IPage是什么?分页插件的核心介绍

大家好,今天咱们聊聊MyBatis-Plus里的IPage。简单说,IPage就是专门用来做分页查询的工具,它能帮你轻松搞定数据的分页显示。想象一下,你有一大堆用户数据要展示在网页上,总不能一股脑全扔出来吧?IPage就能按页码和每页条数切分数据,还能返回总记录数、总页数这些关键信息。它的原理挺聪明,底层通过拦截器自动修改SQL语句,加上分页关键词比如LIMITOFFSET,让查询结果乖乖分页。

MybatisPlus中ipage的用法是什么

IPage是个接口,MyBatis-Plus提供了它的实现类Page。这个Page对象可厉害了,既能当查询条件用(告诉系统查第几页、每页多少条),又能存查询结果(比如当前页的数据列表)。这样设计的好处是代码简洁,不用你手动拼SQL分页逻辑,省心省力。

快速上手:IPage的基本分页查询步骤

想用IPage分页?跟着这几步走就行。创建一个Page对象,指定页码和每页条数。比如查第一页,每页10条数据:

Page page = new Page(1, 10);

接着,在Mapper层调用分页方法,把Page对象和查询条件传进去。如果没额外条件,直接用null

userMapper.selectPage(page, null);

查完后,数据就在page对象里了。拿当前页记录用page.getRecords,总记录数用page.getTotal,总页数用page.getPages。举个例子:

List userList = page.getRecords;
long total = page.getTotal;
int pages = page.getPages;

这样,前端要的分页数据全齐活了,不用你再吭哧吭哧计算。

必做配置:注册分页拦截器

IPage想生效,得先配个拦截器,不然它可不会自动分页。在Spring项目里,加个配置类就行:

@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor;
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}

这里PaginationInnerInterceptor就是分页核心,参数DbType.MYSQL指定数据库类型(比如MySQL、Oracle),因为不同数据库分页语法不一样。配好后,拦截器会在执行SQL前自动改造查询语句,加上分页逻辑。记住,这步千万别漏,否则分页功能直接罢工。

高级玩法:排序、过滤与自定义查询

IPage不只是简单分页,还能玩出花样。比如要按用户年龄降序排,在创建查询条件时加排序:

QueryWrapper queryWrapper = new QueryWrapper;
queryWrapper.orderByDesc("age"); // 按年龄降序
IPage page = userMapper.selectPage(new Page(1, 5), queryWrapper);

过滤数据也简单,用eqgt等方法。比如只查年龄大于18的用户:

queryWrapper.gt("age", 18);

遇到复杂查询?可以在Mapper.xml写自定义SQL,用${ew.customSqlSegment}接入条件:


SELECT * FROM user ${ew.customSqlSegment}

这样,IPage会把分页参数自动注入,你专注业务逻辑就行。

实战案例:从Controller到Service的分页实现

下面来个完整例子,展示IPage在项目里的用法。先看Controller层,接收前端的分页参数:

@GetMapping("/users")
public IPage getUserPage(@RequestParam int pageNum,
@RequestParam int pageSize) {
return userService.getUserPage(pageNum, pageSize);
}

Service层实现分页查询,这里用MyBatis-Plus的封装方法:

@Override
public IPage getUserPage(int pageNum, int pageSize) {
Page page = new Page(pageNum, pageSize);
QueryWrapper wrapper = new QueryWrapper;
return userMapper.selectPage(page, wrapper);
}

返回的IPage对象直接转成JSON给前端,包含数据列表和分页信息:

  • records:当前页的数据,比如用户列表
  • total:总记录数,用于显示总条数
  • pages:总页数,方便生成分页导航

这样一套下来,分页功能就丝滑集成了。

避坑指南:常见问题与解决妙招

用IPage时,有些坑得小心。比如字段名用下划线_导致属性拷贝失败:

使用BeanUtils.copyProperties时,如果实体类字段是user_name,而VO字段是userName,会复制不上值。解决办法要么统一用驼峰命名,要么在实体类加@TableField("user_name")注解。

分页失效?先检查三点:

  • 拦截器配置是否正确,尤其数据库类型别选错
  • MyBatis-Plus版本是否兼容(3.4.0后配置有更新)
  • SQL语句是否被拦截器处理,可在日志看生成的SQL

排序不生效时,确认orderBy方法调用顺序,或改用last("ORDER BY age DESC")追加SQL片段。

IPage对比PageHelper:怎么选更高效

除了IPage,还有个热门分页插件PageHelper。它俩区别挺大:

对比项 IPage PageHelper
参数传递 通过Java对象(如Page) 通过SQL参数
分页逻辑 拦截器动态改SQL 预处理SQL语句
配置灵活性 可在Controller或Service配 通常在Mapper方法指定
兼容性 支持MyBatis多版本 旧版MyBatis可能出问题

IPage更适合MyBatis-Plus项目,和CRUD封装无缝搭配;PageHelper更通用,但得手写分页参数。日常开发中,IPage的自动封装能少写30%的代码。

内容均以整理官方公开资料,价格可能随活动调整,请以购买页面显示为准,如涉侵权,请联系客服处理。

本文由星速云发布。发布者:星速云。禁止采集与转载行为,违者必究。出处:https://www.67wa.com/150174.html

(0)
上一篇 2026年1月20日 上午8:26
下一篇 2026年1月20日 上午8:27
联系我们
关注微信
关注微信
分享本页
返回顶部