MyBatis-Plus 物理分页通过 PaginationInnerInterceptor 自动拦截重写 SQL,需注册插件并指定 DbType(如 MYSQL),调用 selectPage 传入 Page 对象即可实现分页,支持自定义 IPage 方法及 overflow、maxLimit 等配置。

MyBatis-Plus 的物理分页不是靠手动写 LIMIT 或算 OFFSET,而是通过 PaginationInnerInterceptor(注意:高版本已弃用旧的 PaginationInterceptor)在 SQL 执行前自动拦截、重写语句,同时执行 COUNT 和带数据库方言的分页查询。
必须配置分页插件 Bean
不注册插件,selectPage 方法只会查出全部数据,不会分页——这是最常见失效原因。
- Spring Boot 3.x / MyBatis-Plus 3.5+ 使用
MybatisPlusInterceptor+PaginationInnerInterceptor - 需明确指定
DbType,如DbType.MYSQL、DbType.POSTGRE_SQL,否则无法生成正确分页语法 - 配置示例:
@Configuration<br>public class MybatisPlusConfig {<br> @Bean<br> public MybatisPlusInterceptor mybatisPlusInterceptor() {<br> MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();<br> interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));<br> return interceptor;<br> }<br>}调用内置分页方法
直接使用 BaseMapper 提供的 selectPage,传入 Page<T> 对象即可,无需改写 SQL。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 参数 1:当前页码(从 1 开始)、每页条数,例如
new Page<>(2, 10)表示第 2 页,每页 10 条 - 参数 2:可为
null(无条件),或传入QueryWrapper/LambdaQueryWrapper - 执行后返回的
Page对象自带total(总数)、pages(总页数)、records(当前页数据)等字段
Page<User> page = new Page<>(1, 10);<br>LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();<br>wrapper.eq(User::getStatus, 1).ge(User::getAge, 18);<br>Page<User> result = userMapper.selectPage(page, wrapper);<br>System.out.println("共 " + result.getTotal() + " 条,第 " + result.getCurrent() + " 页");支持自定义分页方法(XML 或注解)
当需要多表关联、复杂字段映射时,可定义自己的分页接口方法,只要返回类型是 IPage<T> 或其子类(如 Page<T>),插件仍会生效。
立即学习“Java免费学习笔记(深入)”;
- Mapper 接口定义:
public interface UserMapper extends BaseMapper<User> {<br> // 自定义 VO 分页<br> IPage<UserVO> selectUserWithRole(IPage<UserVO> page, @Param("age") Integer age);<br>}- 对应 XML 中的 SQL 不要以分号结尾,且不能含
ORDER BY子句以外的复杂嵌套(插件需能安全解析) - 调用方式与内置方法一致:
IPage<UserVO> voPage = mapper.selectUserWithRole(new Page<>(1, 10), 25);
可选:调整分页行为参数
PaginationInnerInterceptor 提供了几个实用配置项,建议按需设置:
-
setOverflow(true):当请求页码超过最大页时,自动跳转到第一页(避免空数据) -
setMaxLimit(500L):限制单页最多查 500 条,防恶意请求拖垮数据库 -
setDialect(new MySqlDialect()):如需自定义方言(非常规场景)
PaginationInnerInterceptor pagination = new PaginationInnerInterceptor(DbType.MYSQL);<br>pagination.setOverflow(true);<br>pagination.setMaxLimit(500L);<br>interceptor.addInnerInterceptor(pagination);

















