本文基于 MyBatis-Plus 3.5.x+ 版本的 mybatis-plus-generator 模块(使用 VelocityFreemarker 模板引擎)进行讲解,适用于 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
找不到模板文件 自定义模板路径错误 使用绝对路径或检查资源目录结构

四、注意事项

  1. 数据库连接必须可用:确保 URL、用户名、密码正确。
  2. 表必须有主键:否则无法生成 @TableId
  3. 使用 UTF-8 编码:避免中文注释乱码。
  4. 避免覆盖重要文件:首次生成建议备份或使用新模块。
  5. 逻辑删除字段必须为数字类型:如 tinyintint
  6. 版本号字段必须为 LongInteger:用于乐观锁。
  7. 不要在生产环境运行生成器:应作为开发工具使用。

五、使用技巧

  1. 批量生成多个模块:通过循环 addInclude(...) 不同表组。
  2. 自定义模板:复制默认模板到 resources/templates 修改。
  3. 集成到 Maven/Gradle:使用 exec-maven-plugin 执行生成类。
  4. 生成 DTO/VO:通过 injectionConfig 注入自定义模板。
  5. 跳过 Controller.disable(TemplateType.CONTROLLER)
  6. 使用抽象父类:通过 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 代码生成器极大提升了开发效率,通过合理配置 DataSourceConfigPackageConfigStrategyConfig 等,可一键生成高质量的 CRUD 代码。建议结合 Lombok、统一异常处理、分页插件等形成完整的技术栈。

🚀 提示:生成代码后,建议手动审查并根据业务需求调整,不可完全依赖自动生成。