副标题:“CRUD搬砖工的自救指南——3分钟生成全套代码,老板直呼内行!”
参考官方文档
注,底下附实际生产应用代码
一、开篇吐槽:CRUD工程师的痛
作为当代「CV工程师」(Ctrl+C/V的那种),你是否也经历过这样的绝望?
- 场景1:新需求来了,建表→写Entity→写Mapper→写Service→写Controller→写XML→测试…一套操作猛如虎,一看代码全是土
- 场景2:改个字段名,全局搜索替换到手抖,生怕漏了哪个角落的
userName
没改成username
- 场景3:看着同事哼着小曲准时下班,而你还在为手滑把
sex
打成gender
疯狂Debug
别慌! 今天教你用MyBatis-Plus Generator(以下简称MPG)实现代码自动流水线生产,把重复劳动交给机器,把摸鱼时间留给自己!
二、上硬菜:3步生成全套代码
步骤1️⃣ 引入依赖(Maven版)
在pom.xml
中加入以下魔法药水:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3.1</version> <!-- 版本号建议用最新 -->
</dependency>
<!-- 模板引擎,选Freemarker或Velocity -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
吐槽:版本号请勿手抖,否则可能会喜提ClassNotFoundException
大礼包!
步骤2️⃣ 配置Generator(Java代码版)
新建一个代码生成器启动类,复制以下「咒语」:
public class CodeGenerator {
public static void main(String[] args) {
// 1. 全局配置
GlobalConfig config = new GlobalConfig.Builder()
.outputDir(System.getProperty("user.dir") + "/src/main/java") // 输出路径
.author("你的名字") // 作者(建议写真名,方便甩锅)
.disableOpenDir() // 生成后不打开文件夹(防止老板突然闪现)
.fileOverride() // 覆盖旧文件(慎用!)
.build();
// 2. 数据源配置
DataSourceConfig dataSource = new DataSourceConfig.Builder(
"jdbc:mysql://localhost:3306/your_db?useSSL=false",
"root",
"123456")
.build();
// 3. 包配置
PackageConfig packageConfig = new PackageConfig.Builder()
.parent("com.example") // 父包名
.moduleName("system") // 模块名(按需)
.entity("entity") // 实体类包名
.mapper("mapper") // Mapper包名
.build();
// 4. 策略配置(核心!)
StrategyConfig strategy = new StrategyConfig.Builder()
.addInclude("user", "order") // 要生成的表名
.entityBuilder() // Entity策略
.lombok(true) // 开启Lombok
.enableChainModel() // 链式编程
.mapperBuilder() // Mapper策略
.enableBaseResultMap()
.enableBaseColumnList()
.build();
// 5. 执行生成!
AutoGenerator generator = new AutoGenerator(dataSource);
generator.global(config)
.packageInfo(packageConfig)
.strategy(strategy)
.execute();
}
}
重点解读:
addInclude("表名")
:支持多表,写表名别写*
,否则可能生成一堆废代码lombok(true)
:强烈建议开启,否则Getter/Setter能写到你怀疑人生fileOverride()
:慎用!建议第一次生成后注释掉,防止误覆盖
步骤3️⃣ 运行代码生成器
右键运行CodeGenerator.main()
方法,控制台出现以下画面:
>> 恭喜!代码生成成功!(๑•̀ㅂ•́)و✧
查看项目目录,你将收获:
src/main/java
└─com.example
└─system
├─entity # 实体类(含Lombok注解)
├─mapper # Mapper接口(含BaseMapper)
└─service # Service层(IService+实现类)
三、高级玩法:自定义模板
需求场景:
- 想给Entity加Swagger注解?
- 想给Service加自定义注释?
- 想生成前端API代码?
操作指南:
- 复制
mybatis-plus-generator
的src/main/resources/templates
到项目resources
目录 - 修改模板文件(如
entity.java.ftl
),添加Swagger注解:
// 在entity模板中加入
import io.swagger.annotations.ApiModelProperty;
public class ${entity} {
@ApiModelProperty("${field.comment}")
private ${field.propertyType} ${field.propertyName};
}
- 在策略配置中指定模板路径:
TemplateConfig templateConfig = new TemplateConfig.Builder()
.entity("/templates/entity.java.ftl") // 指定自定义模板路径
.build();
generator.template(templateConfig);
四、避坑指南
- 表字段注释丢失:确认数据库表字段有填写注释,否则生成的Entity字段注释为空
- 生成的Service不翼而飞:检查策略配置是否漏了
.serviceBuilder()
- 连接数据库报错:检查数据库地址、权限,本地数据库记得启动!
五、结语:摸鱼有道,生成高效
从此告别重复CRUD,把时间留给:
- 学习新技术(比如如何更好地摸鱼)
- 修复祖传BUG(反正不是你写的)
- 带薪喝水/带薪如厕(这才是打工人的终极追求)
版权声明:本文原创,转载请注明出处。如有雷同,一定是别人抄我的!
附实际代码
当前基本都是前后端分离,所以只需后端代码即可,并且大多实体类、sql、dao层、service层很多都是公共的组件,而controller层都是独立的,下面实例代码可动态支持这种场景:
引入依赖
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
自动生成代码
package com.ideal.houserepair.config.mybatis;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Collections;
/**
* @author: jason
* @Date: 02 3月 2025
*/
@Component
public class GeneratorConfig {
private static String URL;
private static String USERNAME;
private static String PASSWORD;
@Value("${spring.datasource.url}")
public void setURL(String URL) {
GeneratorConfig.URL = URL;
}
@Value("${spring.datasource.username}")
public void setUSERNAME(String USERNAME) {
GeneratorConfig.USERNAME = USERNAME;
}
@Value("${spring.datasource.password}")
public void setPASSWORD(String PASSWORD) {
GeneratorConfig.PASSWORD = PASSWORD;
}
// 要生成的表名
private static final String[] tableName = new String[]{"order_scheme"};
public static void generate() {
// 使用 FastAutoGenerator 快速配置代码生成器
FastAutoGenerator.create(URL, USERNAME, PASSWORD)
.globalConfig(builder -> {
builder.author("jason") // 设置作者
.outputDir("../house-repair-common/src/main/java"); // 输出目录
})
.packageConfig(builder -> {
builder.parent("com.ideal.houserepair") // 设置父包名
.entity("model.entity") // 设置实体类包名
.mapper("mapper") // 设置 Mapper 接口包名
.service("service") // 设置 Service 接口包名
.serviceImpl("service.impl") // 设置 Service 实现类包名
.pathInfo(
Collections.singletonMap(OutputFile.xml, "../house-repair-common/src/main/resources/mapper")); // 设置 Mapper XML 文件路径
})
.strategyConfig(builder -> {
builder.addInclude(tableName) // 设置需要生成的表名
.entityBuilder().enableFileOverride()
.enableLombok() // 启用 Lombok
.enableRemoveIsPrefix() // 去除is前缀
.enableTableFieldAnnotation() // 启用字段注解
.mapperBuilder().enableFileOverride()
.serviceBuilder().disable()
.controllerBuilder().disable()
;
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 模板引擎
.execute(); // 执行生成
generateCurrent();
}
public static void generateCurrent() {
// 使用 FastAutoGenerator 快速配置代码生成器
FastAutoGenerator.create(URL, USERNAME, PASSWORD)
.globalConfig(builder -> {
builder.author("jason") // 设置作者
.outputDir("src/main/java"); // 输出目录
})
.packageConfig(builder -> {
builder.parent("com.ideal.houserepair") // 设置父包名
.entity("model.entity") // 设置实体类包名
.mapper("mapper") // 设置 Mapper 接口包名
.service("service") // 设置 Service 接口包名
.serviceImpl("service.impl") // 设置 Service 实现类包名
; // 设置 Mapper XML 文件路径
})
.strategyConfig(builder -> {
builder.addInclude(tableName) // 设置需要生成的表名
.entityBuilder().disable()
.mapperBuilder().disable()
.serviceBuilder().disable() // 不生成service
.controllerBuilder().disable() // 不生成controller
;
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 模板引擎
.execute(); // 执行生成
}
}