mybatis-plus 3.5+ 应只用 mybatis-plus-boot-starter,代码生成器需单独引 3.5.3+ 版本;分页插件 mybatisplusinterceptor 必须手动注册并指定正确 dbtype;spring boot 2.7+ 需确保 spring-boot-starter-jdbc 在 classpath;page 参数必须用 @requestparam 显式接收。

MyBatis-Plus 3.5+ 版本下 starter 依赖怎么选
直接用 mybatis-plus-boot-starter,别单独引 mybatis-plus 或混用旧版 mybatis-plus-generator。3.5.0 起代码生成器已拆为独立模块,starter 默认不带生成器,但自带分页插件(MybatisPlusInterceptor)和基础 CRUD 支持。
常见错误:在 Spring Boot 2.7+ 项目里还加 mybatis-plus-generator 3.5 以下版本,会因 Guava、Freemarker 版本冲突导致启动失败;或漏掉 spring-boot-starter-jdbc 导致 DataSource 找不到。
- Spring Boot 2.7+ + MyBatis-Plus 3.5.3+:只加
mybatis-plus-boot-starter - 需要代码生成:额外加
mybatis-plus-generator(注意用 3.5.3+)和freemarker(模板引擎) - 必须确保
spring-boot-starter-jdbc在 classpath 中(Spring Boot 默认包含,但若手动排除过需补回)
分页插件必须手动注册才能生效
MybatisPlusInterceptor 不是自动装配的 Bean,不显式配置就等于没开分页——调用 page() 方法会返回全量数据,且无任何警告。
正确做法是在配置类中声明一个 @Bean:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
注意点:
-
PaginationInnerInterceptor构造必须传DbType,不能写DbType.GENERIC,否则countSQL 可能出错 - 如果用 PostgreSQL,别写
MYSQL;多数据源场景下,得按实际主库类型配,或用DynamicTableNameInnerInterceptor配合路由逻辑 - Spring Boot 3.x 用户需确认用的是 MyBatis-Plus 4.0+(目前仍为 RC),API 略有变动,
PaginationInnerInterceptor已改名
代码生成器连不上数据库或表名为空
生成器报 Cannot get table names 或生成的实体类字段全是 Object,大概率是数据源未正确定义或 JDBC URL 缺少参数。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
关键检查项:
- 生成器用的
DataSource必须和 Spring Boot 主数据源一致(尤其多数据源时别 new 一个 HikariCP 实例硬塞) - MySQL 8+ 的 JDBC URL 必须带
serverTimezone=UTC和useSSL=false,否则驱动连上也查不出表结构 -
StrategyConfig中要明确设setInclude("user", "order"),否则默认过滤掉系统表,但如果你的表名含下划线且没开setNaming(NamingStrategy.underline_to_camel),可能匹配失败 - FreeMarker 模板路径写错(如把
templates/entity.java.ftl写成template/entity.ftl)会导致生成空文件,但不报错
Page 对象传参时 controller 层容易漏掉 @RequestParam
写 REST 接口接收分页参数时,如果直接在方法签名里写 Page<user> page</user>,Spring MVC 不会自动绑定 current 和 size,page 会是 null 或默认值(current=1, size=10),但前端传的参数完全被忽略。
正确方式只有两种:
- 用
@RequestParam显式接收分页参数,再构造Page:new Page(current, size) - 自定义
Page的HandlerMethodArgumentResolver(适合统一处理,但多数项目没必要)
别依赖 Jackson 把 JSON body 里的 { "current": 2, "size": 20 } 自动转成 Page 对象——它不是普通 POJO,没有对应 setter,也不支持反序列化。
生成器模板和分页拦截器看着简单,但每个环节都卡在细节上:JDBC 参数、DbType 类型、@RequestParam 缺失、多数据源下的拦截器注册位置……这些地方一错,问题现象和原因之间几乎没有直接提示,只能逐层断点看 Page 是怎么被构造的、Interceptor 有没有进 intercept()、生成器的 Connection 是否真执行了 getTables()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










