在 Spring Boot 中,PaginationInterceptor 是 MyBatis-Plus 的分页插件拦截器,用于自动处理分页逻辑。它的配置方式与 Spring MVC 的 HandlerInterceptor(处理 HTTP 请求的拦截器)不同,需通过 MyBatis 的插件机制 注册,而非添加到 Web 配置中。以下是具体配置步骤:
- 正确配置 PaginationInterceptor
步骤 1:创建 MyBatis-Plus 配置类
在 Spring Boot 项目中创建一个配置类,通过 @Configuration 注解标记,并在其中定义 PaginationInterceptor 的 Bean。
java
复制
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 {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件
PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();
paginationInterceptor.setDbType(DbType.MYSQL); // 根据数据库类型设置
paginationInterceptor.setOverflow(true); // 溢出时允许跳转首页
interceptor.addInnerInterceptor(paginationInterceptor);
return interceptor;
}
}
说明
MyBatis-Plus 从 3.4.0 版本开始,推荐使用 MybatisPlusInterceptor 统一管理插件。
PaginationInnerInterceptor 是分页插件的核心实现类,需添加到拦截器链中。
2. 常见误区:与 Spring MVC 拦截器的区别
PaginationInterceptor 的本质
MyBatis 插件:作用于 SQL 执行层面,用于分页逻辑处理(如自动拼接 LIMIT 语句)。
配置位置:需注册到 MyBatis 的插件链 中,而非 Spring MVC 的拦截器链。
Spring MVC 的 HandlerInterceptor
HTTP 请求拦截器:用于拦截 Controller 层的请求(如日志、权限校验)。
配置方式:通过实现 WebMvcConfigurer 接口并重写 addInterceptors 方法添加。
错误示例:将分页插件添加到 Web 配置
以下代码是错误的,会导致分页功能失效:
java
复制
@Configuration
public class WebConfig implements WebMvcConfigurer {
// ❌ 错误!PaginationInterceptor 不是 HTTP 拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new PaginationInterceptor());
}
}
- 验证分页插件是否生效
测试代码
在 Controller 中调用分页查询:
java
复制
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/users")
public Page<User> getUsers(@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) {
Page<User> pageParam = new Page<>(page, size);
return userMapper.selectPage(pageParam, null);
}
}
预期效果
请求 /users?page=2&size=5 时,SQL 自动拼接 LIMIT 5 OFFSET 5。
返回的 Page 对象包含分页数据及总记录数。
4. 扩展:其他 MyBatis-Plus 插件配置
如果需要添加其他插件(如乐观锁、动态表名),只需在 MybatisPlusInterceptor 中继续追加:
java
复制
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 乐观锁插件(需实体类字段标记 @Version)
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
- 总结
正确配置位置:PaginationInterceptor 应通过 MybatisPlusInterceptor 注册到 MyBatis 插件链。
与 Spring MVC 拦截器的区别:MyBatis 插件作用于 SQL 执行过程,而 HandlerInterceptor 作用于 HTTP 请求生命周期。
避免混淆:两者属于不同层次(ORM 层 vs. Web 层),配置方式不可混用。
通过上述步骤,分页功能将正常生效,无需涉及 Web 配置中的 WebMvcConfigurer。