MyBatis-Plus代码生成器实战案例:从零搭建高效CRUD开发流水线
目录导读
- 为什么你需要一个代码生成器?
- MyBatis-Plus代码生成器核心概念与版本选择
- 实战案例:基于Spring Boot的完整生成流程(附代码)
- 高级配置:自定义模板、逻辑删除与字段填充
- 常见问题FAQ与避坑指南
- 让代码生成器成为团队效率杠杆
为什么你需要一个代码生成器?
在当今快节奏的业务迭代中,后端开发人员常陷入重复劳动:编写Entity、Mapper、Service、Controller四件套,一个简单的用户表,可能涉及几十行样板代码。MyBatis-Plus代码生成器通过数据库表结构逆向生成全链路代码,能将单表CRUD开发时间从1小时压缩至3分钟,它不仅是工具,更是团队规范化的强制手段——生成的代码风格统一,注释完整,极大降低交接成本。

MyBatis-Plus代码生成器核心概念与版本选择
核心原理:读取数据库表元数据(列名、类型、注释),通过Velocity/FreeMarker模板引擎渲染出.java文件。
版本关键点:
- 旧版(3.5.1以前):使用
AutoGenerator类,配置链式调用。 - 新版(3.5.1+):推荐
FastAutoGenerator,API更简洁,支持Lambda风格。
依赖参考(Maven):
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
实战案例:基于Spring Boot的完整生成流程
场景:为user表生成全部代码,包含实体、Mapper、Service、ServiceImpl、Controller。
准备数据库表
CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '姓名', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除', PRIMARY KEY (`id`) ) ENGINE=InnoDB;
编写生成器启动类
public class CodeGenerator {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/test", "root", "123456")
.globalConfig(builder -> builder
.author("你的名字") // 作者
.outputDir("D://my-project//src//main//java") // 输出路径
.dateType(DateType.TIME_PACK) // 时间策略
)
.packageConfig(builder -> builder
.parent("com.example.demo") // 父包名
.entity("entity") // 实体包
.mapper("mapper")
.service("service")
.controller("controller")
)
.strategyConfig(builder -> builder
.addInclude("user") // 需要生成的表
.entityBuilder()
.logicDeleteColumnName("deleted") // 逻辑删除字段
.enableLombok() // 开启Lombok
.controllerBuilder()
.enableRestStyle() // 生成@RestController
.build()
)
.execute();
}
}
运行与产物检查
控制台输出Generate Success!后,检查D:/my-project/目录,你将得到:
User.java(带Lombok注解,自动识别注释)UserMapper.java(继承BaseMapper)IUserService.java及其实现UserController.java(包含RESTful接口:GET/POST/PUT/DELETE)
验证:直接启动项目,调用
GET /user/list,即可返回数据,无需手写一行业务代码。
高级配置与最佳实践
1 自定义模板(应对特殊需求)
若需在Controller中额外增加@ApiOperation注解,可在resources下创建/templates/controller.java.vm,然后在FastAutoGenerator中指定:
.templateConfig(builder -> builder.controllerTemplate("/templates/controller.java"))
2 混合逻辑删除与自动填充
- 逻辑删除:如上文,在
strategyConfig中指定.logicDeleteColumnName("deleted"),生成后实体字段会标注@TableLogic。 - 自动填充(如
create_time):在全局配置中添加.metaObjectHandler(new MetaObjectHandler() {...}),生成代码无缝支持。
3 多模块生成
修改outputDir指向不同模块,或使用packageConfig配置不同包名,即可一次生成多模块代码。
常见问题FAQ与避坑指南
Q1:生成代码后,为什么Mapper接口没有@Mapper注解?
A:MyBatis-Plus通过@MapperScan扫描包,无需每个接口加注解,在启动类添加@MapperScan("com.example.demo.mapper")即可。
Q2:如何生成Service接口和实现类?
A:默认strategyConfig.serviceBuilder()已自动生成,如果只想要接口,设置.formatServiceFileName("%sService")并取消ServiceImpl生成。
Q3:数据库表前缀如何处理?
A:strategyConfig中启用.entityBuilder().columnFormat("%s")(默认去掉前缀),例如表t_user,可配置.addPrefix("t_")。
Q4:生成速度慢或报错(如找不到驱动)?
A:确保mysql-connector-java依赖在生成器模块中(而非主应用模块),并驱动类名正确(新版为com.mysql.cj.jdbc.Driver)。
Q5:生成的Controller不支持分页?
A:MyBatis-Plus默认分页插件需要配置,生成器不会自动加,需手动在config类中添加PaginationInnerInterceptor,然后即可使用IPage参数。
让代码生成器成为团队效率杠杆
MyBatis-Plus代码生成器并非“银弹”,但它是消除重复劳动、保证代码一致性的利器。核心价值在于:将80%的表结构开发自动化,让团队聚焦于复杂业务逻辑。落地建议:在项目初期即配置好模板与规范,将生成器集成到CI流程中(如每次表结构变更后自动重新生成),确保持续交付速度。下一步:尝试结合Swagger生成接口文档、配合前端低代码平台,将开发效率推向新高度。
行动引导:立即将本文案例中的代码粘贴到你的项目中,针对现有的orders、product表跑一次生成,感受“三秒建完一架CRUD战斗机”的快感。如果遇到版本兼容性问题,优先检查Spring Boot版本与MyBatis-Plus的匹配度(推荐Boot 2.7+搭配Plus 3.5.x)。