mybatis plus 代码生成器

354 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

前言

AutoGenerator是MyBatis-Plus的代码生成器,通过AutoGenerator可以快速生成EntityMapperMapper XMLServiceController等各个模块的代码,极大的提升了开发效率。

mybtis plus的代码生成器有两个版本,根据使用的mybatis使用的版本不同可能需要的依赖不同。本次介绍是版本是3.5.1+

创建子项目

工程的创建参考mybatis-plus 快速开始示例。在它的基础上再搭建的子工程。

在父工程xinxin-mybatis-plus-example中创建子项目xinxin-mybatis-plus-example-generator。创建过程同xinxin-mybatis-plus-example-crud

引入依赖

新增了mybatis-plus-generatorvelocity-engine-coremysql-connector-java依赖。

  • 先在父工程中增加依赖
<properties>
  ```
  <mybatisplus.generator.version>3.5.2</mybatisplus.generator.version>
  <velocity.version>2.3</velocity.version>
  <mysql.version>8.0.15</mysql.version>
  ```
</properties>

<dependencyManagement>
  <dependencies>
    ```
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-generator</artifactId>
      <version>${mybatisplus.generator.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.velocity</groupId>
      <artifactId>velocity-engine-core</artifactId>
      <version>${velocity.version}</version>
    </dependency>


    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>
    ```
  </dependencies>
</dependencyManagement>
  • 子工程中引入依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>p6spy</groupId>
            <artifactId>p6spy</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

生成工具类

快速生成代码的工具类。

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;

import java.util.Collections;

public class FastAutoGeneratorUtil {
   public static String dbUrl = "";
   public static String dbUser = "";
   public static String dbPassword = "";

   static {
       dbUrl = "jdbc:mysql://localhost:3306/vip?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull";
       dbUser = "root";
       dbPassword = "123456";
   }

   public static void main(String[] args) {
       // 获取当前资源路径 当前项目所在目录 /Users/jielingyang/IdeaProjects/i-workspace/xinxin-mybatis-plus-example
       String projectPath = System.getProperty("user.dir");
       // 数据库配置
       FastAutoGenerator.create(dbUrl, dbUser, dbPassword)
               // 全局配置
               .globalConfig(builder -> {
                   builder.author("yang") // 设置作者
                           .disableOpenDir()
                           .dateType(DateType.ONLY_DATE)
                           .commentDate("yyyy-MM-dd HH:mm:ss")
                           // .enableSwagger() // 开启 swagger 模式
                           // .fileOverride() // 覆盖已生成文件 3.5.3会放弃该方法
                           .outputDir(projectPath + "/xinxin.mybatis-plus-example-generator/src/main/java"); // 指定输出目录
               })
               // 包配置
               .packageConfig(builder -> {
                   builder.parent("com.xinxin.mybatis.plus.example.generator") // 设置父包名
                           .moduleName("sys") // 设置父包模块名
                           .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath + "/xinxin.mybatis-plus-example-generator/src/main/resources/mapper")); // 设置mapperXml生成路径
               })
               // 策略配置
               .strategyConfig(builder -> {
                   builder.addInclude("sys_region") // 设置需要生成的表名
                           .addTablePrefix("sys_"); // 设置过滤表前缀
               })
               // 模板配置
               // .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
               .execute();
   }

image.png

  • 优化版代码
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;
import java.util.function.Consumer;

public class FastAutoGeneratorUtil {
    public static String dbUrl = "";
    public static String dbUser = "";
    public static String dbPassword = "";
    public static String projectPath = "";

    static {
        dbUrl = "jdbc:mysql://localhost:3306/vip?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull";
        dbUser = "root";
        dbPassword = "123456";
        // 获取当前资源路径 当前项目所在目录 /Users/jielingyang/IdeaProjects/i-workspace/xinxin-mybatis-plus-example
        projectPath = System.getProperty("user.dir");
    }

    /**
     * 数据库配置 {@link com.xinxin.mybatis.plus.example.generator.codegenerator.FastAutoGeneratorUtil#datasourceBuilder()}
     * 全局配置 {@link com.xinxin.mybatis.plus.example.generator.codegenerator.FastAutoGeneratorUtil#globalConfigConsumer()}
     * 包配置 {@link com.xinxin.mybatis.plus.example.generator.codegenerator.FastAutoGeneratorUtil#packageConfigConsumer()}
     * 策略配置 {@link com.xinxin.mybatis.plus.example.generator.codegenerator.FastAutoGeneratorUtil#strategyConfigConsumer()}
     * 模板配置 {@link com.xinxin.mybatis.plus.example.generator.codegenerator.FastAutoGeneratorUtil#templateEngine()}
     * 注入配置 {@link com.xinxin.mybatis.plus.example.generator.codegenerator.FastAutoGeneratorUtil#injectionConfigConsumer()}
     *
     * @see com.xinxin.mybatis.plus.example.generator.codegenerator.FastAutoGeneratorUtil#datasourceBuilder()
     *
     * @param args
     */
    public static void main(String[] args) {
        // 数据库配置
        FastAutoGenerator.create(datasourceBuilder())
                // 全局配置
                .globalConfig(globalConfigConsumer())
                // 包配置
                .packageConfig(packageConfigConsumer())
                // 策略配置
                .strategyConfig(strategyConfigConsumer())
                // 模板配置
                // .templateEngine(templateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                // 注入配置
                // .injectionConfig(injectionConfigConsumer())
                .execute();
    }

    /**
     * 数据库配置
     * https://www.mybatis-plus.com/guide/generator-new.html#%E6%95%B0%E6%8D%AE%E5%BA%93%E9%85%8D%E7%BD%AE-datasourceconfig
     *
     * @return
     */
    public static DataSourceConfig.Builder datasourceBuilder() {
        return new DataSourceConfig.Builder(dbUrl, dbUser, dbPassword);
    }

    /**
     * 全局配置 是数据配置下的一个小节 所以地址是数据库配置的地址 往下翻一点就是
     * https://www.mybatis-plus.com/guide/generator-new.html#%E6%95%B0%E6%8D%AE%E5%BA%93%E9%85%8D%E7%BD%AE-datasourceconfig
     *
     * @return
     */
    public static Consumer<GlobalConfig.Builder> globalConfigConsumer() {
        return builder -> {
            builder.author("yang") // 设置作者
                    .disableOpenDir()
                    .dateType(DateType.ONLY_DATE)
                    .commentDate("yyyy-MM-dd HH:mm:ss")
                    .outputDir(projectPath + "/xinxin.mybatis-plus-example-generator/src/main/java"); // 指定输出目录
        };
    }

    /**
     * 包配置
     * https://www.mybatis-plus.com/guide/generator-new.html#%E5%8C%85%E9%85%8D%E7%BD%AE-packageconfig
     *
     * @return
     */
    public static Consumer<PackageConfig.Builder> packageConfigConsumer() {
        return builder -> {
            builder.parent("com.xinxin.mybatis.plus.example.generator") // 设置父包名
                    .moduleName("sys") // 设置父包模块名
                    .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath + "/xinxin.mybatis-plus-example-generator/src/main/resources/mapper")); // 设置mapperXml生成路径
        };
    }

    /**
     * 策略配置
     * https://www.mybatis-plus.com/guide/generator-new.html#%E7%AD%96%E7%95%A5%E9%85%8D%E7%BD%AE-strategyconfig
     *
     * @return
     */
    public static Consumer<StrategyConfig.Builder> strategyConfigConsumer() {
        return builder -> {
            builder.addInclude("sys_region") // 设置需要生成的表名
                    .addTablePrefix("sys_"); // 设置过滤表前缀
        };
    }

    /**
     * 模板配置
     * https://www.mybatis-plus.com/guide/generator-new.html#%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE-templateconfig
     *
     * @return
     */
    public static AbstractTemplateEngine templateEngine() {
        return new FreemarkerTemplateEngine();
    }

    /**
     * 注入配置
     * https://www.mybatis-plus.com/guide/generator-new.html#%E6%B3%A8%E5%85%A5%E9%85%8D%E7%BD%AE-injectionconfig
     *
     * @return
     */
    public static Consumer<InjectionConfig.Builder> injectionConfigConsumer() {
        return builder -> {
            builder.beforeOutputFile((tableInfo, objectMap) -> {
                        System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
                    })
                    .customMap(Collections.singletonMap("test", "baomidou"))
                    .customFile(Collections.singletonMap("test.txt", "/templates/test.vm"));
        };
    }
}

以上就是快速生成基于mybatis plus的crud的java代码。mybatis plus还有很多定制化的代码生成配置,几乎涵盖了常见的代码生成需求。如果项目采用了mybatis plus框架,那么可以根据实际需求定制代码生成模板,为项目提供一个代码生成器项目,可以大大提高项目的开发效率,降低人力资源投入成本,希望能在以后工作中好好推广和学习。