八、代码生成器

32 阅读3分钟

1)代码生成器能帮你做什么

它会根据数据库表结构,自动生成一套常用代码骨架(可按需开关):

  • Entity(实体类)
  • Mapper 接口
  • Mapper.xml(可选)
  • Service / ServiceImpl
  • Controller(可选,REST 风格也可一键开)

适用场景:新建模块/新表、快速起 CRUD;之后你再在生成代码上二次开发即可。


2)前置准备(必须具备)

  1. 数据库已建库建表(建议先准备 1~2 张表练手,比如 t_user

  2. 项目能正常连接数据库(spring.datasource.* 配好)

  3. 建议把“生成器代码”放在:

    • src/test/java 下的一个 GeneratorTest(最常见)
    • 或者独立一个 xxx-generator 模块(更干净,推荐团队)

3)引入依赖(Maven)

<dependencies>
  <!-- MyBatis-Plus 代码生成器 -->
  <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
  </dependency>

  <!-- 模板引擎:二选一(Freemarker / Velocity),你选哪个就留哪个 -->
  <dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.32</version>
  </dependency>
  <!-- 或 Velocity -->
  <!--
  <dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
  </dependency>
  -->

  <!-- 数据库驱动(以 MySQL8 为例) -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
  </dependency>
</dependencies>

4)快速生成(可直接运行的最小示例)

src/test/java/.../GeneratorTest.java 写一个 main 方法即可跑生成。

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

public class GeneratorTest {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf-8";
        String username = "root";
        String password = "123456";

        String projectPath = System.getProperty("user.dir");

        FastAutoGenerator.create(url, username, password)
                // 1) 全局配置
                .globalConfig(builder -> builder
                        .author("你的名字")
                        .outputDir(projectPath + "/src/main/java")
                        .disableOpenDir()
                        // .fileOverride() // 想覆盖旧文件时打开(谨慎)
                )
                // 2) 包配置
                .packageConfig(builder -> builder
                        .parent("com.atguigu.mybatisplus") // 改成你的包名
                        .pathInfo(Collections.singletonMap(
                                OutputFile.xml, projectPath + "/src/main/resources/mapper"
                        ))
                )
                // 3) 策略配置(最关键:选表、前缀、Lombok、Rest等)
                .strategyConfig(builder -> builder
                        .addInclude("t_user")      // 要生成的表(可多个)
                        .addTablePrefix("t_")      // 表前缀过滤:t_user -> User
                        .entityBuilder()
                            .enableLombok()
                        .controllerBuilder()
                            .enableRestStyle()
                        .mapperBuilder()
                            .enableMapperAnnotation()
                            .enableBaseResultMap()
                            .enableBaseColumnList()
                )
                // 4) 模板引擎
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }
}

运行后,你会在:

  • src/main/java/com/xxx/... 看到 entity/mapper/service/controller
  • src/main/resources/mapper 看到 xml(如果你开启了 xml 输出)

5)你必须掌握的配置点

A. 选哪些表生成

  • .addInclude("t_user"):只生成这些表
  • .addExclude("xxx"):排除某些表(少用)

B. 表前缀处理

  • .addTablePrefix("t_", "tbl_")

    • 表叫 t_user,实体叫 User(否则会生成 TUser 或直接 TUser 风格)

C. Entity 常用开关

  • .entityBuilder().enableLombok():一键 Lombok
  • 还可以加:链式模型、字段注解、驼峰等(后面你需要再加)

D. Controller 风格

  • .controllerBuilder().enableRestStyle():生成 @RestController

E. 覆盖旧文件(慎用)

  • .globalConfig(builder -> builder.fileOverride())

    • 建议:第一次生成不开;确认要重来才开

6)模板与自定义(从“能用”到“好用”)

当你不满足默认代码风格时,有两条路:

路线1:少改配置就够了(推荐先掌握)

  • 改包名、输出路径、作者、选表、表前缀、是否生成 controller/xml 等

路线2:自定义模板(进阶)

  • 把默认模板拷贝到项目里(如 resources/templates
  • 在生成器里指定模板路径(不同版本写法略有差异)
  • 常见用途:统一注释、统一返回体、统一 Controller 风格、加 DTO/VO、加基础字段等

7)常见踩坑与排错清单

  1. 连不上数据库:url / 用户名密码 / 驱动版本不匹配
  2. MySQL8 时区报错:url 加 serverTimezone=Asia/Shanghai
  3. xml 没生成/路径不对:检查 OutputFile.xml 的输出目录
  4. 实体名不想要表前缀:加 .addTablePrefix("t_")
  5. 不想生成 Controller:把 .controllerBuilder() 整段删掉即可
  6. 重复生成导致文件冲突:不要随便开 fileOverride()

8)建议的练习任务(按顺序做,学习最快)

  1. t_user 表跑通一次生成(只生成 entity/mapper/service)
  2. 加上 controller(REST 风格),写一个 GET /users/{id} 跑通
  3. 新增第二张表 t_product,练习 .addInclude("t_user","t_product")
  4. 给表加前缀 tbl_,练习 .addTablePrefix("t_","tbl_")
  5. 最后再尝试模板自定义(比如统一 controller 返回体)