MybatisPlus中代码生成器教程详解

MybatisPlus代码生成器

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。因此本文章介绍如何使用 MyBatis-Plus的代码生成器如何使用。

基于Spring整合Mybatis-Plus代码生成器

创建Spring项目并导入依赖

<dependencies>
<!--mp核心依赖 -->
  <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.0</version>
  </dependency>
  <dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.31</version>
  </dependency>
  <dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
  </dependency>
<!--mysql驱动-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.47</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
</dependency>
</dependencies>
复制代码

在test文件下创建CodeGeneratorTest文件

public class CodeGeneratorTest {
  /**
   * <p>
   * 读取控制台内容
   * </p>
   */
  @Test
  public static String scanner(String tip) {
    Scanner scanner = new Scanner(System.in);
    StringBuilder help = new StringBuilder();
    help.append("请输入" + tip + ":");
    System.out.println(help.toString());
    if (scanner.hasNext()) {
      String ipt = scanner.next();
      if (StringUtils.isNotBlank(ipt)) {
        return ipt;
      }
    }
    throw new MybatisPlusException("请输入正确的" + tip + "!");
  }

  public static void main(String[] args) {
    // 代码生成器
    AutoGenerator mpg = new AutoGenerator();
    // 全局配置
    GlobalConfig gc = new GlobalConfig();
    //获取当前系统目录
    String projectPath = System.getProperty("user.dir");
    gc.setOutputDir(projectPath + "/src/main/java");
    gc.setAuthor("author");  //生成作者注释
    gc.setOpen(false); //生成后是否打开资源管理器
    gc.setFileOverride(false); //重新生成时文件是否覆盖
    gc.setServiceName("%sService"); //去掉Service接口的首字母I
    gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
    gc.setSwagger2(false);//开启Swagger2模式
    mpg.setGlobalConfig(gc);
    // 数据源配置
    DataSourceConfig dsc = new DataSourceConfig();
    dsc.setUrl("jdbc:mysql://localhost:3306/mp?useUnicode=true&useSSL=false&characterEncoding=utf8");
    // dsc.setSchemaName("public");
    dsc.setDriverName("com.mysql.jdbc.Driver");
    dsc.setUsername("root");
    dsc.setPassword("root");
    //数据库类型
    dsc.setDbType(DbType.MYSQL);
    mpg.setDataSource(dsc);

    // 包配置
    PackageConfig pc = new PackageConfig();
    pc.setModuleName("test"); //模块名,可以不设置
    //放在哪个包下,父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
    pc.setParent("com.mybatis");
    pc.setController("controller");
    pc.setEntity("entity");
    pc.setService("service");
    pc.setMapper("mapper");
    mpg.setPackageInfo(pc);
    // 自定义包配置
    InjectionConfig cfg = new InjectionConfig() {
      @Override
      public void initMap() {
        // to do nothing
      }
    };

    // 如果模板引擎是 freemarker
    String templatePath = "/templates/mapper.xml.ftl";
    // 如果模板引擎是 velocity
    // String templatePath = "/templates/mapper.xml.vm";

    // 自定义输出配置
    List<FileOutConfig> focList = new ArrayList<>();
    // 自定义配置会被优先输出
    focList.add(new FileOutConfig(templatePath) {
      @Override
      public String outputFile(TableInfo tableInfo) {
        // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
        return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
          + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
      }
    });

    cfg.setFileOutConfigList(focList);
    mpg.setCfg(cfg);

    // 配置模板
    TemplateConfig templateConfig = new TemplateConfig();
    templateConfig.setXml(null);
    mpg.setTemplate(templateConfig);

    // 策略配置
    StrategyConfig strategy = new StrategyConfig();
    //数据库表映射到实体的命名策略
    strategy.setNaming(NamingStrategy.underline_to_camel);
    //数据库表字段映射到实体的命名策略, 未指定按照 naming 执行
    strategy.setColumnNaming(NamingStrategy.underline_to_camel);
    //自定义继承的Entity类全称,带包名
    strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
    //是否为lombok模型(默认 false)
    strategy.setEntityLombokModel(true);
    //生成 @RestController 控制器
    strategy.setRestControllerStyle(true);
    // 公共父类
    strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
    // 写于父类中的公共字段
    strategy.setSuperEntityColumns("id");
    strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
    strategy.setControllerMappingHyphenStyle(true);
    strategy.setTablePrefix(pc.getModuleName() + "_");
    mpg.setStrategy(strategy);
    mpg.setTemplateEngine(new FreemarkerTemplateEngine());
    mpg.execute();
  }
}
复制代码

打开目录就可以看到生成的文件

image.png

image.png

基于SpringBoot整合Mybatis-Plus代码生成器

创建SpringBoot项目

image.png

引入依赖

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.3.5.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lagou</groupId>
<artifactId>springBoot-mp-generator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mp-generator</name>
<description>Demo project for Spring Boot</description>

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

  <!--mybatis-plus的springboot支持-->
  <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.1.1</version>
  </dependency>
  <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.1.1</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
  </dependency>
  <!--mysql驱动-->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
  </dependency>
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
  </dependency>

</dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>
</project>
复制代码

在test文件下创建CodeGeneratorTest文件

public class CodeGenerator {

  /**
   * <p>
   * 读取控制台内容
   * </p>
   */
  public static String scanner(String tip) {
    Scanner scanner = new Scanner(System.in);
    StringBuilder help = new StringBuilder();
    help.append("请输入" + tip + ":");
    System.out.println(help.toString());
    if (scanner.hasNext()) {
      String ipt = scanner.next();
      if (StringUtils.isNotEmpty(ipt)) {
        return ipt;
      }
    }
    throw new MybatisPlusException("请输入正确的" + tip + "!");
  }

  /**
   * RUN THIS
   */
  public static void main(String[] args) {
    // 代码生成器
    AutoGenerator mpg = new AutoGenerator();

    // 全局配置
    GlobalConfig gc = new GlobalConfig();
    final String projectPath = System.getProperty("user.dir");
    gc.setOutputDir(projectPath + "/src/main/java");
    gc.setAuthor("author");
    gc.setOpen(false);
    mpg.setGlobalConfig(gc);

    // 数据源配置
    DataSourceConfig dsc = new DataSourceConfig();
    dsc.setUrl("jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&useSSL=false&characterEncoding=utf8");
    // dsc.setSchemaName("public");
    dsc.setDriverName("com.mysql.jdbc.Driver");
    dsc.setUsername("root");
    dsc.setPassword("root");
    mpg.setDataSource(dsc);

    // 包配置
    final PackageConfig pc = new PackageConfig();
    pc.setModuleName(scanner("模块名"));
    pc.setParent("com.mybatis.mp.generator");
    mpg.setPackageInfo(pc);

    // 自定义配置
    InjectionConfig cfg = new InjectionConfig() {
      @Override
      public void initMap() {
        // to do nothing
      }
    };
    List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
    focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
      @Override
      public String outputFile(TableInfo tableInfo) {
        // 自定义输入文件名称
        return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
          + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
      }
    });
    cfg.setFileOutConfigList(focList);
    mpg.setCfg(cfg);
    mpg.setTemplate(new TemplateConfig().setXml(null));

    // 策略配置
    StrategyConfig strategy = new StrategyConfig();
    strategy.setNaming(NamingStrategy.underline_to_camel);
    strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//        strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.generator.common.BaseEntity");
    strategy.setEntityLombokModel(true);
//        strategy.setSuperControllerClass("com.baomidou.mybatisplus.samples.generator.common.BaseController");
    strategy.setInclude(scanner("表名"));
    strategy.setSuperEntityColumns("id");
    strategy.setControllerMappingHyphenStyle(true);
    strategy.setTablePrefix(pc.getModuleName() + "_");
    mpg.setStrategy(strategy);
    // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
    mpg.setTemplateEngine(new FreemarkerTemplateEngine());
    mpg.execute();
  }
}
复制代码

测试并验证

image.png

image.png

代码生成器常用配置

数据源 dataSourceConfig 配置

  • dbQuery

数据库信息查询类 默认由 dbType 类型决定选择对应数据库内置实现 实现 IDbQuery 接口自定义数据库查询 SQL 语句 定制化返回自己需要的内容

  • dbType

数据库类型 该类内置了常用的数据库类型【必须】

  • schemaName

数据库 schema name 例如 PostgreSQL 可指定为 public

  • typeConvert

类型转换 默认由 dbType 类型决定选择对应数据库内置实现 实现 ITypeConvert 接口自定义数据库 字段类型 转换为自己需要的 java 类型,内置转换类型无法满足可实现 IColumnType 接口自定义

  • url

驱动连接的URL

  • driverName

驱动名称

  • username

数据库连接用户名

  • password

数据库连接密码

数据库表配置

  • isCapitalMode

是否大写命名

  • skipView

是否跳过视图

  • naming

数据库表映射到实体的命名策略

  • columnNaming

数据库表字段映射到实体的命名策略, 未指定按照 naming 执行

  • tablePrefix

表前缀

  • fieldPrefix

字段前缀

  • superEntityClass

自定义继承的Entity类全称,带包名

  • superEntityColumns

自定义基础的Entity类,公共字段

  • superMapperClass

自定义继承的Mapper类全称,带包名

  • superServiceClass

自定义继承的Service类全称,带包名

  • superServiceImplClass

自定义继承的ServiceImpl类全称,带包名

  • superControllerClass

自定义继承的Controller类全称,带包名

  • enableSqlFilter(since 3.3.1)

默认激活进行sql模糊表名匹配关闭之后likeTable与notLikeTable将失效,include和exclude将使用内存过滤 如果有sql语法兼容性问题的话,请手动设置为false 已知无法使用:MyCat中间件, 支持情况传送门(opens new window)

  • include

需要包含的表名,当enableSqlFilter为false时,允许正则表达式(与exclude二选一配置)

  • likeTable

自3.3.0起,模糊匹配表名(与notLikeTable二选一配置)

  • exclude

需要排除的表名,当enableSqlFilter为false时,允许正则表达式

  • notLikeTable

自3.3.0起,模糊排除表名

  • entityColumnConstant

【实体】是否生成字段常量(默认 false)

  • entityBuilderModel

【实体】是否为构建者模型(默认 false),自3.3.2开始更名为 chainModel

  • chainModel(since 3.3.2)

【实体】是否为链式模型(默认 false)

  • entityLombokModel

【实体】是否为lombok模型(默认 false)

3.3.2以下版本默认生成了链式模型,3.3.2以后,默认不生成,如有需要,请开启 chainModel

  • entityBooleanColumnRemoveIsPrefix

Boolean类型字段是否移除is前缀(默认 false)

  • restControllerStyle

生成 @RestController 控制器

  • controllerMappingHyphenStyle

驼峰转连字符

  • entityTableFieldAnnotationEnable

是否生成实体时,生成字段注解

  • versionFieldName

乐观锁属性名称

#logicDeleteFieldName 逻辑删除属性名称

  • tableFillList

表填充字段

包名配置

  • parent

父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名

  • moduleName

父包模块名

  • entity

Entity包名

  • service

Service包名

  • serviceImpl

Service Impl包名

  • mapper

Mapper包名

  • xml

Mapper XML包名

  • controller

Controller包名

  • pathInfo

路径配置信息

模板配置

  • entity

Java 实体类模板

  • entityKt

Kotin 实体类模板

  • service

Service 类模板

  • serviceImpl

Service impl 实现类模板

  • mapper

mapper 模板

  • xml

mapper xml 模板

  • controller

controller 控制器模板

全局策略 globalConfig 配置

  • outputDir

生成文件的输出目录 默认值:D 盘根目录

  • fileOverride

是否覆盖已有文件 默认值:false

  • open

是否打开输出目录 默认值:true #enableCache 是否在xml中添加二级缓存配置 默认值:false

  • author

开发人员 默认值:null

  • kotlin

开启 Kotlin 模式 默认值:false

  • swagger2

开启 swagger2 模式 默认值:false

  • activeRecord

开启 ActiveRecord 模式 默认值:false

  • baseResultMap

开启 BaseResultMap 默认值:false

  • baseColumnList

开启 baseColumnList 默认值:false

  • dateType

时间类型对应策略 默认值:TIME_PACK 注意事项: 如下配置 %s 为占位符

  • entityName

实体命名方式 默认值:null 例如:%sEntity 生成 UserEntity

  • mapperName

mapper 命名方式 默认值:null 例如:%sDao 生成 UserDao

  • xmlName

Mapper xml 命名方式 默认值:null 例如:%sDao 生成 UserDao.xml

  • serviceName

service 命名方式 默认值:null 例如:%sBusiness 生成 UserBusiness

  • serviceImplName

service impl 命名方式 默认值:null 例如:%sBusinessImpl 生成 UserBusinessImpl

  • controllerName

controller 命名方式 默认值:null 例如:%sAction 生成 UserAction

  • idType

指定生成的主键的ID类型 默认值:null

注入 injectionConfig 配置

  • map

自定义返回配置 Map 对象 该对象可以传递到模板引擎通过 cfg.xxx 引用

  • fileOutConfigList

自定义输出文件 配置 FileOutConfig 指定模板文件、输出文件达到自定义文件生成目的

  • fileCreate

自定义判断是否创建文件 实现 IFileCreate 接口 该配置用于判断某个类是否需要覆盖创建,当然你可以自己实现差异算法 merge 文件

  • initMap

注入自定义 Map 对象(注意需要setMap放进去)

更多Mybatis-Plus代码生成器配置请看官网。 MybatisPlus代码生成器官网

猜你喜欢

转载自juejin.im/post/7036666129221320740