本文基于 MyBatis-Plus 3.5.x+ 版本的 mybatis-plus-generator
模块(使用 Velocity
或 Freemarker
模板引擎)进行讲解,适用于 Spring Boot 项目快速生成 Entity、Mapper、Service、Controller 等代码。
一、核心概念
MyBatis-Plus 代码生成器(AutoGenerator
)是一个基于模板的代码自动生成工具,能够根据数据库表结构自动生成以下代码:
- Entity:实体类(对应数据库表)
- Mapper:DAO 接口(继承
BaseMapper<T>
)
- Service:Service 接口与实现类(继承
IService<T>
和 ServiceImpl<M,T>
)
- Controller:RESTful 控制器(可选)
- XML:Mapper XML 文件(可选)
核心配置组件
配置类 |
作用 |
DataSourceConfig |
配置数据库连接信息 |
GlobalConfig |
全局配置(作者、输出目录、是否覆盖等) |
PackageConfig |
包名配置(模块名、父包名等) |
StrategyConfig |
表/字段命名策略、包含/排除表等 |
TemplateConfig |
自定义模板路径(可选) |
InjectionConfig |
自定义注入内容(如 DTO、VO 等) |
二、操作步骤(超详细)
第一步:添加依赖
在 pom.xml
中添加 MyBatis-Plus 代码生成器依赖:
<dependencies>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.6</version>
</dependency>
<!-- MyBatis-Plus 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.6</version>
</dependency>
<!-- 模板引擎:Velocity(默认) -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
<!-- 或使用 Freemarker -->
<!--
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
-->
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.33</version>
</dependency>
</dependencies>
第二步:创建代码生成器主类
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.sql.Types;
import java.util.Collections;
public class CodeGenerator {
public static void main(String[] args) {
generate();
}
private static void generate() {
FastAutoGenerator.create(
"jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8",
"root",
"password"
)
// 全局配置
.globalConfig(builder -> {
builder.author("your_name") // 设置作者
.outputDir(System.getProperty("user.dir") + "/src/main/java") // 输出路径
.commentDate("yyyy-MM-dd HH:mm:ss") // 注释日期格式
.disableOpenDir(); // 生成后不打开输出目录
})
// 包配置
.packageConfig(builder -> {
builder.parent("com.example.demo") // 父包名
.moduleName("system") // 模块名(可选)
.entity("entity") // 实体类包名
.service("service") // Service 接口包名
.serviceImpl("service.impl") // Service 实现类包名
.mapper("mapper") // Mapper 接口包名
.xml("mapper.xml") // XML 文件包名
.controller("controller"); // Controller 包名
})
// 策略配置
.strategyConfig(builder -> {
builder.entityBuilder()
.naming(NamingStrategy.underline_to_camel) // 表名转驼峰
.columnNaming(NamingStrategy.underline_to_camel) // 字段名转驼峰
.enableLombok() // 启用 Lombok
.enableTableFieldAnnotation() // 开启 @TableField 注解
.logicDeleteColumnName("deleted") // 逻辑删除字段
.versionColumnName("version"); // 乐观锁字段
builder.mapperBuilder()
.enableBaseResultMap() // 生成 ResultMap
.enableBaseColumnList(); // 生成 ColumnList
builder.serviceBuilder()
.formatServiceFileName("%sService") // Service 命名
.formatServiceImplFileName("%sServiceImpl"); // ServiceImpl 命名
builder.controllerBuilder()
.enableRestStyle() // 使用 @RestController
.enableHyphenStyle(); // URL 驼峰转连字符
// 指定要生成的表
builder.addInclude("user", "role", "user_role")
.addTablePrefix("t_", "sys_"); // 过滤表前缀
})
// 模板引擎配置(可选)
//.templateEngine(new VelocityTemplateEngine()) // 默认使用 Velocity
// 自定义配置(可选)
.injectionConfig(consumer -> {
consumer.customFile(Collections.singletonMap("DTO.java", "/templates/dto.java.vm"));
})
// 模板配置(可选)
.templateConfig(builder -> {
// 可以禁用不需要的模板
// builder.disable(TemplateType.CONTROLLER);
builder.entity("/templates/entity.java.vm"); // 自定义模板
})
// 类型转换(可选)
.strategyConfig(builder -> {
builder.entityBuilder().addTableFills(
// 可添加自动填充字段
);
})
// 执行生成
.execute();
}
}
第三步:配置说明详解
1. DataSourceConfig
使用 FastAutoGenerator.create(url, username, password)
简化配置。
FastAutoGenerator.create(jdbcUrl, username, password)
jdbcUrl
:JDBC 连接字符串(注意时区、编码)
- 支持 MySQL、PostgreSQL、Oracle、SQL Server 等
2. GlobalConfig
方法 |
说明 |
.author("name") |
作者名(出现在类注释中) |
.outputDir(path) |
输出目录(Java 源码根路径) |
.commentDate("yyyy-MM-dd") |
类注释中的日期格式 |
.disableOpenDir() |
生成后不自动打开文件夹 |
3. PackageConfig
方法 |
说明 |
.parent("com.example") |
父包名(如公司域名) |
.moduleName("system") |
模块名(生成路径为 parent/moduleName/... ) |
.entity("entity") |
实体类所在包 |
.mapper("mapper") |
Mapper 接口包 |
.service("service") |
Service 接口包 |
.serviceImpl("service.impl") |
Service 实现类包 |
.controller("controller") |
Controller 包 |
.xml("mapper.xml") |
XML 文件存放路径(resources 下) |
4. StrategyConfig
实体策略(entityBuilder)
方法 |
说明 |
.naming(NamingStrategy.underline_to_camel) |
表名转驼峰 |
.columnNaming(...) |
字段名转驼峰 |
.enableLombok() |
使用 Lombok 注解(@Data, @EqualsAndHashCode) |
.enableTableFieldAnnotation() |
字段加 @TableField 注解 |
.logicDeleteColumnName("deleted") |
逻辑删除字段 |
.versionColumnName("version") |
乐观锁字段 |
.addSuperEntityColumns("id", "create_time", "update_time") |
父类字段(不生成 getter/setter) |
Mapper 策略
方法 |
说明 |
.enableBaseResultMap() |
生成 <resultMap> |
.enableBaseColumnList() |
生成 <sql> 列字段 |
Service 策略
方法 |
说明 |
.formatServiceFileName("%sService") |
接口命名格式 |
.formatServiceImplFileName("%sServiceImpl") |
实现类命名格式 |
Controller 策略
方法 |
说明 |
.enableRestStyle() |
使用 @RestController |
.enableHyphenStyle() |
URL 驼峰转连字符(如 /user-info ) |
表过滤
方法 |
说明 |
.addInclude("user", "role") |
包含的表 |
.addExclude("dict") |
排除的表 |
.addTablePrefix("t_", "sys_") |
忽略表前缀(生成类名时不包含) |
三、常见错误与解决方案
错误现象 |
原因 |
解决方案 |
ClassNotFoundException: com.mysql.cj.jdbc.Driver |
缺少 MySQL 驱动 |
添加 mysql-connector-java 依赖 |
生成代码为空或未生成 |
输出目录错误 |
检查 outputDir 是否为 src/main/java |
表名未转驼峰 |
命名策略未设置 |
设置 .naming(NamingStrategy.underline_to_camel) |
Lombok 注解无效 |
IDE 未安装 Lombok 插件 |
安装 Lombok 插件并启用注解处理 |
逻辑删除字段未识别 |
未设置 logicDeleteColumnName |
在 entityBuilder 中设置 |
生成后中文乱码 |
文件编码问题 |
确保 IDE 和项目编码为 UTF-8 |
找不到模板文件 |
自定义模板路径错误 |
使用绝对路径或检查资源目录结构 |
四、注意事项
- 数据库连接必须可用:确保 URL、用户名、密码正确。
- 表必须有主键:否则无法生成
@TableId
。
- 使用 UTF-8 编码:避免中文注释乱码。
- 避免覆盖重要文件:首次生成建议备份或使用新模块。
- 逻辑删除字段必须为数字类型:如
tinyint
、int
。
- 版本号字段必须为
Long
或 Integer
:用于乐观锁。
- 不要在生产环境运行生成器:应作为开发工具使用。
五、使用技巧
- 批量生成多个模块:通过循环
addInclude(...)
不同表组。
- 自定义模板:复制默认模板到
resources/templates
修改。
- 集成到 Maven/Gradle:使用
exec-maven-plugin
执行生成类。
- 生成 DTO/VO:通过
injectionConfig
注入自定义模板。
- 跳过 Controller:
.disable(TemplateType.CONTROLLER)
。
- 使用抽象父类:通过
setSuperEntityClass()
设置 BaseEntity。
六、最佳实践与性能优化
✅ 最佳实践
- ✅ 使用 Lombok 减少样板代码。
- ✅ 统一命名规范(下划线 → 驼峰)。
- ✅ 启用逻辑删除和乐观锁。
- ✅ 为
create_time
, update_time
添加自动填充。
- ✅ 生成后立即提交 Git,便于追踪变更。
- ✅ 为不同环境配置不同的生成策略(开发/测试)。
⚡ 性能优化建议
- ❌ 不要频繁运行生成器(仅在建表后运行)。
- ✅ 禁用不需要的模板(如 XML、Controller)。
- ✅ 使用
addInclude
明确指定表,避免全库扫描。
- ✅ 将生成器放在独立模块或
src/test
中,避免打入生产包。
七、扩展:自定义模板示例(entity.java.vm)
package ${package.Entity};
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* ${table.comment!}
* </p>
*
* @author ${author}
* @since ${date}
*/
@Data
@TableName("${table.name}")
public class ${entity} implements Serializable {
private static final long serialVersionUID = 1L;
#foreach($field in ${table.fields})
#if(${field.keyFlag})
@TableId(value = "${field.name}", type = IdType.AUTO)
#end
private ${field.propertyType} ${field.propertyName};
#end
}
将此模板放入 resources/templates/entity.java.vm
即可生效。
总结
MyBatis-Plus 代码生成器极大提升了开发效率,通过合理配置 DataSourceConfig
、PackageConfig
、StrategyConfig
等,可一键生成高质量的 CRUD 代码。建议结合 Lombok、统一异常处理、分页插件等形成完整的技术栈。
🚀 提示:生成代码后,建议手动审查并根据业务需求调整,不可完全依赖自动生成。