作为 Java 开发者,我们都爱用 Mybatis-Plus 简化 CRUD 操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询。但最近有位朋友在集成 Mybatis-Plus 3.5.12 版本时踩了个坑:PaginationInnerInterceptor类突然找不到了!这篇文章就来聊聊这个问题的来龙去脉,教你快速解决,还会附赠分页功能的完整使用指南。
先看一段熟悉的配置代码,这是我们常用的 Mybatis-Plus 分页配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.xx.config.mybatis; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @MapperScan({"com.sq.twinbee.**.mapper"}) public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加分页拦截器 interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } |
当使用 Mybatis-Plus 3.5.12 版本时,IDE 突然报错:PaginationInnerInterceptor类不存在!这是怎么回事?明明之前的版本用得好好的,难道是版本升级后类被移除了?
其实不是类被移除了,而是 Mybatis-Plus 在 3.5.0 版本后对依赖进行了拆分。在早期版本中,分页插件和核心包是捆绑在一起的,但从 3.5.0 开始,官方将一些扩展功能(包括分页插件)单独拆分成了mybatis-plus-extension模块。
如果你在 pom.xml 中只引入了核心包:
1 2 3 4 5 |
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-core</artifactId> <version>3.5.12</version> </dependency> |
就会找不到PaginationInnerInterceptor,因为它已经被移到mybatis-plus-extension里了。
只需在 pom.xml 中添加mybatis-plus-extension依赖,问题就能迎刃而解:
1 2 3 4 5 |
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>3.5.12</version> </dependency> |
为什么这行依赖能解决问题?
解决了依赖问题,我们再来完整梳理一下 Mybatis-Plus 分页功能的使用步骤,确保新手也能快速上手。
就是我们开头提到的配置类,这里再强调几个注意点:
1 2 3 4 5 6 7 8 9 10 11 |
@Configuration @MapperScan({"com.xx.**.mapper"}) // 扫描Mapper接口所在包 public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 注意:这里可以指定数据库类型,避免分页语句适配问题 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } |
关键说明:
无需手动写分页 SQL,直接继承BaseMapper即可:
1 2 3 4 |
public interface UserMapper extends BaseMapper<User> { // 自定义分页查询(可选) IPage<User> selectUserByAge(Page<User> page, @Param("age") Integer age); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public IPage<User> getUserPage(Integer pageNum, Integer pageSize) { // 创建分页对象 Page<User> page = new Page<>(pageNum, pageSize); // 调用BaseMapper的selectPage方法 return baseMapper.selectPage(page, null); } @Override public IPage<User> getUserByAge(Integer pageNum, Integer pageSize, Integer age) { Page<User> page = new Page<>(pageNum, pageSize); // 调用自定义分页方法 return baseMapper.selectUserByAge(page, age); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/page") public Result<IPage<User>> getUserPage( @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) { IPage<User> page = userService.getUserPage(pageNum, pageSize); return Result.success(page); } } |
分页查询返回的IPage对象包含了丰富的分页信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "code": 200, "msg": "success", "data": { "records": [ {"id": 1, "name": "张三", "age": 20}, {"id": 2, "name": "李四", "age": 22} ], "total": 100, // 总记录数 "size": 10, // 每页条数 "current": 1, // 当前页码 "pages": 10, // 总页数 "hasNext": true, // 是否有下一页 "hasPrevious": false // 是否有上一页 } } |
Mybatis-Plus 的分页功能大大简化了我们的开发工作,但版本升级带来的依赖变化可能会让新手踩坑。记住 3.5.x 版本后需要单独引入mybatis-plus-extension依赖才能使用分页拦截器,这是解决PaginationInnerInterceptor类不存在问题的关键。
希望这篇文章能帮你彻底搞懂 Mybatis-Plus 分页功能的配置和使用,如果你还有其他相关问题,欢迎在评论区交流!