MyBatis-Plus代码生成器实战-3分钟生成全套代码,老板直呼内行!


副标题:“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代码?

操作指南

  1. 复制mybatis-plus-generatorsrc/main/resources/templates到项目resources目录
  2. 修改模板文件(如entity.java.ftl),添加Swagger注解:
// 在entity模板中加入
import io.swagger.annotations.ApiModelProperty;

public class ${entity} {
    @ApiModelProperty("${field.comment}")
    private ${field.propertyType} ${field.propertyName};
}
  1. 在策略配置中指定模板路径:
TemplateConfig templateConfig = new TemplateConfig.Builder()
        .entity("/templates/entity.java.ftl") // 指定自定义模板路径
        .build();
generator.template(templateConfig);

四、避坑指南

  1. 表字段注释丢失:确认数据库表字段有填写注释,否则生成的Entity字段注释为空
  2. 生成的Service不翼而飞:检查策略配置是否漏了.serviceBuilder()
  3. 连接数据库报错:检查数据库地址、权限,本地数据库记得启动!

五、结语:摸鱼有道,生成高效

从此告别重复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(); // 执行生成
    }

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿小白菜

打赏换头发,BUG退散!✨

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值