Skip to content

MyBatis-Plus 代码生成器

  MyBatis-Plus 代码生成器(AutoGenerator)可以一键生成 Entity、Mapper、Mapper XML、Service、Controller 等代码,大幅提升开发效率。

一、为什么需要代码生成器?

手动编写 vs 代码生成:

  手动编写(30 张表):
    Entity × 30
    Mapper × 30
    Mapper XML × 30
    Service × 30
    ServiceImpl × 30
    Controller × 30
    → 180+ 个文件,重复劳动

  代码生成器:
    配置好数据库连接 → 一键生成所有文件
    → 几分钟完成

二、快速使用(3.5.3+ 新 API)

java
public class CodeGenerator {

    public static void main(String[] args) {
        // 数据源配置
        FastAutoGenerator.create(
                "jdbc:mysql://localhost:3306/mp_demo?useSSL=false&serverTimezone=Asia/Shanghai",
                "root",
                "123456"
        )
        // 全局配置
        .globalConfig(builder -> {
            builder.author("iRain")           // 作者
                   .outputDir("D://code-gen") // 输出目录
                   .disableOpenDir()          // 生成后不打开目录
                   .commentDate("yyyy-MM-dd"); // 注释日期格式
        })
        // 包配置
        .packageConfig(builder -> {
            builder.parent("com.example")     // 父包名
                   .moduleName("system")      // 模块名
                   .entity("entity")          // 实体类包名
                   .mapper("mapper")          // Mapper 包名
                   .service("service")        // Service 包名
                   .serviceImpl("service.impl") // ServiceImpl 包名
                   .controller("controller")  // Controller 包名
                   .xml("mapper.xml");        // Mapper XML 目录
        })
        // 策略配置
        .strategyConfig(builder -> {
            builder.addInclude("user", "order", "product") // 指定表名
                   .addTablePrefix("t_", "sys_")  // 过滤表前缀

                   // Entity 策略
                   .entityBuilder()
                   .enableLombok()           // 使用 Lombok
                   .enableTableFieldAnnotation() // 生成 @TableField
                   .logicDeleteColumnName("deleted") // 逻辑删除字段
                   .versionColumnName("version")     // 乐观锁字段
                   .enableFileOverride()     // 覆盖已有文件

                   // Mapper 策略
                   .mapperBuilder()
                   .enableBaseResultMap()    // 生成 BaseResultMap
                   .enableBaseColumnList()   // 生成 BaseColumnList

                   // Service 策略
                   .serviceBuilder()
                   .formatServiceFileName("%sService")
                   .formatServiceImplFileName("%sServiceImpl")

                   // Controller 策略
                   .controllerBuilder()
                   .enableRestStyle()        // 生成 @RestController
                   .enableHyphenStyle()      // URL 中划线风格
                   .formatFileName("%sController");
        })
        // 模板引擎(默认 Velocity)
        .templateEngine(new VelocityTemplateEngine())
        .execute();
    }
}

三、生成效果

生成目录结构:

D:/code-gen/
└── com/example/system/
    ├── entity/
    │   └── User.java
    ├── mapper/
    │   ├── UserMapper.java
    │   └── xml/
    │       └── UserMapper.xml
    ├── service/
    │   ├── UserService.java
    │   └── impl/
    │       └── UserServiceImpl.java
    └── controller/
        └── UserController.java

生成的 Entity:

java
@Data
@TableName("user")
public class User {

    @TableId(type = IdType.ASSIGN_ID)
    private Long id;

    private String name;
    private Integer age;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @TableLogic
    private Integer deleted;

    @Version
    private Integer version;
}

生成的 Controller:

java
@RestController
@RequestMapping("/system/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) {
        return userService.getById(id);
    }

    @GetMapping
    public List<User> list() {
        return userService.list();
    }

    @PostMapping
    public boolean save(@RequestBody User user) {
        return userService.save(user);
    }

    @PutMapping
    public boolean update(@RequestBody User user) {
        return userService.updateById(user);
    }

    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Long id) {
        return userService.removeById(id);
    }
}

四、常用配置一览

4.1 全局配置

java
.globalConfig(builder -> {
    builder.author("iRain")
           .outputDir("D://code-gen")
           .disableOpenDir()
           .commentDate("yyyy-MM-dd")
           .enableSpringdoc();  // 生成 Swagger 注解
})

4.2 实体策略

java
.entityBuilder()
    .enableLombok()                // @Data
    .enableChainModel()            // 链式调用
    .enableTableFieldAnnotation()  // @TableField
    .logicDeleteColumnName("deleted")  // 逻辑删除
    .versionColumnName("version")      // 乐观锁
    .addSuperEntityColumns("id", "createTime", "updateTime") // 父类排除
    .enableFileOverride()          // 覆盖已有文件
    .idType(IdType.ASSIGN_ID)      // 主键策略
    .formatFileName("%s")          // 实体名格式

4.3 Mapper 策略

java
.mapperBuilder()
    .enableBaseResultMap()     // 生成 resultMap
    .enableBaseColumnList()    // 生成 SQL 片段
    .superClass(BaseMapper.class)
    .formatMapperFileName("%sMapper")
    .formatXmlFileName("%sMapper")

4.4 Service 策略

java
.serviceBuilder()
    .superServiceClass(IService.class)
    .superServiceImplClass(ServiceImpl.class)
    .formatServiceFileName("%sService")
    .formatServiceImplFileName("%sServiceImpl")

4.5 Controller 策略

java
.controllerBuilder()
    .enableRestStyle()         // @RestController
    .enableHyphenStyle()       // /system/user-info
    .superClass(BaseController.class)
    .formatFileName("%sController")

五、自定义模板

java
// 使用自定义模板
FastAutoGenerator.create(url, username, password)
    .templateConfig(builder -> {
        builder.entity("/templates/entity.java")
               .mapper("/templates/mapper.java")
               .service("/templates/service.java")
               .serviceImpl("/templates/serviceImpl.java")
               .controller("/templates/controller.java")
               .xml("/templates/mapper.xml");
    })
    .templateEngine(new FreemarkerTemplateEngine())  // 使用 Freemarker
    .execute();

六、速记总结

代码生成器配置流程:

  ① 数据源 → 连数据库
  ② 全局配置 → 作者、输出路径
  ③ 包配置 → 父包、模块名、各层包名
  ④ 策略配置 → 表名、Entity/Mapper/Service/Controller 策略
  ⑤ 模板引擎 → Velocity(默认)/ Freemarker
  ⑥ 执行 → execute()

速记口诀:
  数据源连库,全局定输出,
  包配置定路径,策略定细节,
  模板定风格,一键全生成。

七、面试要点

问题答案要点
代码生成器能生成什么?Entity、Mapper、XML、Service、ServiceImpl、Controller
推荐哪个 API?3.5.3+ 推荐 FastAutoGenerator(链式 API)
支持哪些模板引擎?Velocity(默认)、Freemarker、Beetl