侧边栏壁纸
博主头像
爱探索

行动起来,活在当下

  • 累计撰写 42 篇文章
  • 累计创建 11 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

mybatis-plus-自动代码生成器(新版本)

jelly
2024-08-05 / 0 评论 / 0 点赞 / 79 阅读 / 0 字

mybatis-plus自动代码生成器(新版本)

MyBatis-Plus 全新代码生成器在继承原有功能的基础上,引入了更加灵活和高效的 builder 模式,使得开发者能够快速生成符合需求的代码,同时保持代码的优雅和整洁。这个新特性旨在进一步提升开发效率,减少重复劳动,让开发者能够更加专注于业务逻辑的实现。

基本示例:


// 使用 FastAutoGenerator 快速配置代码生成器
FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8", "root", "password")
    .globalConfig(builder -> {
        builder.author("Your Name") // 设置作者
            .outputDir("src/main/java"); // 输出目录
    })
    .packageConfig(builder -> {
        builder.parent("com.example") // 设置父包名
            .entity("model") // 设置实体类包名
            .mapper("dao") // 设置 Mapper 接口包名
            .service("service") // 设置 Service 接口包名
            .serviceImpl("service.impl") // 设置 Service 实现类包名
            .xml("mappers"); // 设置 Mapper XML 文件包名
    })
    .strategyConfig(builder -> {
        builder.addInclude("table1", "table2") // 设置需要生成的表名
            .entityBuilder()
            .enableLombok() // 启用 Lombok
            .enableTableFieldAnnotation() // 启用字段注解
            .controllerBuilder()
            .enableRestStyle(); // 启用 REST 风格
    })
    .templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 模板引擎这块需要导入具体的模版库
    .execute(); // 执行生成


集成


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

注意:全新的代码生成器添加于 3.5.1 版本,且对历史版本不兼容!

MyBatis-Plus Generator 支持如下模板引擎:

  • VelocityTemplateEngine(Default)
  • FreemarkerTemplateEngine
  • BeetlTemplateEngine
  • EnjoyTemplateEngine

由于代码生成器用到了模板引擎所以我们还需要导入模版引擎依赖
在mybatis-plus-generator-3.5.7.pom中可以看到以选择的模版引擎依赖,以下就是可选择的依赖:

<dependency>
      <groupId>org.apache.velocity</groupId>
      <artifactId>velocity-engine-core</artifactId>
      <version>2.3</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.32</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>com.ibeetl</groupId>
      <artifactId>beetl</artifactId>
      <version>3.16.1.RELEASE</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>com.jfinal</groupId>
      <artifactId>enjoy</artifactId>
      <version>5.1.3</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>

配置

在自动代码生成器中配置由FastAutoGenerator完成主要有一下几个方面的配置

  1. DataSourceConfig:数据源配置
  2. GlobalConfig:全局配置
  3. PackageConfig:包配置
  4. StrategyConfig:策略配置
  5. InjectionConfig:注入配置
  6. AbstractTemplateEngine:模板引擎配置

又一下几个构造器创建对应的配置

    /**
     * 数据源配置 Builder
     */
    private final DataSourceConfig.Builder dataSourceConfigBuilder;

    /**
     * 全局配置 Builder
     */
    private final GlobalConfig.Builder globalConfigBuilder;

    /**
     * 包配置 Builder
     */
    private final PackageConfig.Builder packageConfigBuilder;

    /**
     * 策略配置 Builder
     */
    private final StrategyConfig.Builder strategyConfigBuilder;

    /**
     * 注入配置 Builder
     */
    private final InjectionConfig.Builder injectionConfigBuilder;


    /**
     * 模板引擎
     */
    private AbstractTemplateEngine templateEngine;

创建FastAutoGenerator

FastAutoGenerator中有两个静态函数用来创建 基础FastAutoGenerator

      public static FastAutoGenerator create(@NotNull String url, String username, String password) {
        return new FastAutoGenerator(new DataSourceConfig.Builder(url, username, password));
    }

    public static FastAutoGenerator create(@NotNull DataSourceConfig.Builder dataSourceConfigBuilder) {
        return new FastAutoGenerator(dataSourceConfigBuilder);
    }

可以看出FastAutoGenerator最基础的属性有三个分别是

  • url:数据库连接路径
  • username:数据库账户
  • password:数据库密码

全局配置 GlobalConfig

方法说明
outputDir设置输出路径(可选,默认System.getProperty("os.name").toLowerCase().contains("windows") ? "D://" : "/tmp";)
author设置作者(可选,默认:baomidou)
enableKotlin开启后生成的代码为kotlin代码(可选,默认关闭)
enableSwagger开启swagger模式,(可选,默认关闭)。注意:生成代码中有swagger中的类,所以项目需要依赖swagger
enableSpringdoc开启Springdoc(可选,默认关闭)。注意:与swagger互斥
disableServiceInterface不生成service接口(可选,默认默认生成service接口)
dateType时间类型对应策略(可选:默认DateType.TIME_PACK)
commentDate(@NotNull Supplier<String> commentDate)注释日期获取处理(可选,默认 new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
commentDate(@NotNull String pattern)指定注释日期格式化(可选),与上一个commentDate函数只生效一个,最后一个生效

示例


   FastAutoGenerator.create(properties.getProperty("jdbc.url"), properties.getProperty("jdbc.username"), properties.getProperty("jdbc.password"))
                //全局配置
                .globalConfig(builder -> builder
                        .outputDir("/home/jelly/JavaProject/spring-data-demo/spring-boot-mybatis-plus/src/main/java")//设置输出路径(可选)
                        .author("Baomidou")//设置作者(可选,默认:baomidou)
                        .enableKotlin()//开启kotlin模式,开启后生成的代码为kotlin代码(可选,默认关闭)。注意:与 springdoc
                        .enableSwagger()//开启swagger模式,(可选,默认关闭)。注意:生成代码中有swagger中的类,所以项目需要依赖swagger
                        //.enableSpringdoc()//开启Springdoc(可选,默认关闭)。注意:与swagger互斥
                        .disableServiceInterface()//不生成service接口(可选,默认默认生成service接口)
                        .dateType(DateType.SQL_PACK)//时间类型对应策略(可选:默认DateType.TIME_PACK)
                        .commentDate(() -> {
                             "创建时间" + new SimpleDateFormat("yyyy-MM-dd").format(new Date());
                        })//注释日期获取处理(可选,默认 new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
                        .commentDate("yyyy-mm")//指定注释日期格式化(可选),与上一个commentDate函数只生效一个,最后一个生效
                        .build()//这个不调用也可以生效

                )
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();

数据库配置:DataSourceConfig

DataSourceConfig有三个基础配置

  • url:数据库连接路径
  • username:数据库账户
  • password:数据库密码

一般来说在FastAutoGenerator.create函数中已经指定了可以不在设置这三个属性,如果再次设置这使用最后设置的配置。

可选配置

方法用途
dbQuery设置数据库查询实现
schemaschema(部分数据库适用)
typeConvert数据库类型转换器
keyWordsHandler数据库类型转换器
databaseQueryClass数据库查询方式 。默认DefaultQuery.class(通用元数据)
1. DefaultQuery 默认查询方式,配合{@link #getTypeConvertHandler()} 使用
2. SQLQuery SQL语句查询方式,配合{@link #typeConvert} 使用
typeConvertHandler指定类型转换器
addConnectionProperty增加数据库连接属性

示例代码

DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus", "root", "123456")
    .dbQuery(new MySqlQuery())
    .schema("mybatis-plus")
    .typeConvert(new MySqlTypeConvert())
    .keyWordsHandler(new MySqlKeyWordsHandler())
    .databaseQueryClass(SQLQuery.class)
    .build();

包配置 PackageConfig

可选配置

方法用途
parent(String)设置父包名 默认值: com.baomidou
moduleName(String)设置父包模块名,默认值: 无
entity (String)设置 Entity 包名,默认值: entity
service (String)设置 Service 包名,默认值: service
serviceImpl(String)设置 Service Impl 包名,默认值: service.impl
mapper(String)设置 Mapper 包名,默认值: mapper
xml(String)指定类型转换器
controller(String)设置 Controller 包名,默认值: controller
pathInfo(Map<OutputFile, String>)设置路径配置信息

StrategyConfig策略配置

方法用途
enableCapitalMode开启大写命名 默认值: false
enableSkipView开启跳过视图 默认值: false
disableSqlFilter禁用 SQL 过滤 默认值: true,如果 SQL 过滤不支持,可以关闭此选项
enableSchema启用 schema 默认值: false,多 schema 场景时启用
likeTable(LikeTable)模糊表匹配(SQL 过滤) 与 notLikeTable 互斥,只能配置一项
notLikeTable(LikeTable)模糊表排除(SQL 过滤) 与 likeTable 互斥,只能配置一项
addInclude(String…)增加表匹配(内存过滤) 与 addExclude 互斥,只能配置一项,支持正则匹配,如 ^t_.* 匹配所有以 t_ 开头的表名
addExclude(String…)增加表排除匹配(内存过滤) 与 addInclude 互斥,只能配置一项,支持正则匹配,如 .*st$ 匹配所有以 st 结尾的表名
addTablePrefix(String…)增加过滤表前缀
addTableSuffix(String…)增加过滤表后缀
addFieldPrefix(String…)增加过滤字段前缀
addFieldSuffix(String…)增加过滤字段后缀
outputFile内置模板输出文件处理 参考测试用例 H2CodeGeneratorTest.testOutputFile
entityBuilder实体策略配置
controllerBuilderController 策略配置
mapperBuilderMapper 策略配置
serviceBuilderService 策略配置

StrategyConfig strategyConfig = new StrategyConfig.Builder()
    .enableCapitalMode() // 开启大写命名
    .enableSkipView() // 开启跳过视图
    .disableSqlFilter() // 禁用 SQL 过滤
    .likeTable(new LikeTable("USER")) // 模糊匹配表名
    .addInclude("t_simple") // 增加表匹配
    .addTablePrefix("t_", "c_") // 增加过滤表前缀
    .addFieldSuffix("_flag") // 增加过滤字段后缀
    .build();

Entity 策略配置

实体策略配置用于定制实体类的生成规则,包括父类、序列化版本 UID、文件覆盖、字段常量、链式模型、Lombok 模型等。

方法说明示例
nameConvert(INameConvert)名称转换实现
superClass(Class<?>)设置父类BaseEntity.class
superClass(String)设置父类com.baomidou.global.BaseEntity
disableSerialVersionUID禁用生成 serialVersionUID默认值: true
enableFileOverride覆盖已生成文件默认值: false
enableColumnConstant开启生成字段常量默认值: false
enableChainModel开启链式模型默认值: false
enableLombok开启 Lombok 模型默认值: false
enableRemoveIsPrefix开启 Boolean 类型字段移除 is 前缀默认值: false
enableTableFieldAnnotation开启生成实体时生成字段注解默认值: false
enableActiveRecord开启 ActiveRecord 模型默认值: false
versionColumnName(String)乐观锁字段名(数据库字段)versionColumnName 与 versionPropertyName 二选一即可
versionPropertyName(String)乐观锁属性名(实体)versionColumnName 与 versionPropertyName 二选一即可
logicDeleteColumnName(String)逻辑删除字段名(数据库字段)logicDeleteColumnName 与 logicDeletePropertyName 二选一即可
logicDeletePropertyName(String)逻辑删除属性名(实体)logicDeleteColumnName 与 logicDeletePropertyName 二选一即可
naming数据库表映射到实体的命名策略默认下划线转驼峰命名: NamingStrategy.underline_to_camel
columnNaming数据库表字段映射到实体的命名策略默认为 null,未指定按照 naming 执行
addSuperEntityColumns(String…)添加父类公共字段
addIgnoreColumns(String…)添加忽略字段
addTableFills(IFill…)添加表字段填充
addTableFills(List<IFill>)添加表字段填充
idType(IdType)全局主键类型
convertFileName(ConverterFileName)转换文件名称
formatFileName(String)格式化文件名称

StrategyConfig strategyConfig = new StrategyConfig.Builder()
    .entityBuilder()
    .superClass(BaseEntity.class)
    .disableSerialVersionUID()
    .enableChainModel()
    .enableLombok()
    .enableRemoveIsPrefix()
    .enableTableFieldAnnotation()
    .enableActiveRecord()
    .versionColumnName("version")
    .logicDeleteColumnName("deleted")
    .naming(NamingStrategy.no_change)
    .columnNaming(NamingStrategy.underline_to_camel)
    .addSuperEntityColumns("id", "created_by", "created_time", "updated_by", "updated_time")
    .addIgnoreColumns("age")
    .addTableFills(new Column("create_time", FieldFill.INSERT))
    .addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))
    .idType(IdType.AUTO)
    .formatFileName("%sEntity")
    .build();

方法说明示例
superClass(Class<?>)设置父类BaseController.class
superClass(String)设置父类com.baomidou.global.BaseController
enableFileOverride覆盖已生成文件默认值: false
enableHyphenStyle开启驼峰转连字符默认值: false
enableRestStyle开启生成@RestController 控制器默认值: false
convertFileName(ConverterFileName)转换文件名称
formatFileName(String)格式化文件名称

Controller 策略配置

Controller 策略配置用于定制 Controller 类的生成规则,包括父类、文件覆盖、驼峰转连字符、RestController 注解等。


StrategyConfig strategyConfig = new StrategyConfig.Builder()
    .controllerBuilder()
    .superClass(BaseController.class)
    .enableHyphenStyle()
    .enableRestStyle()
    .formatFileName("%sAction")
    .build();

Service 策略配置

Service 策略配置用于定制 Service 接口和实现类的生成规则,包括父类、文件覆盖、文件名称转换等。

方法说明示例
superServiceClass(Class<?>)接口父类BaseService.class
superServiceClass(String)设置 Service 接口父类com.baomidou.global.BaseService
superServiceImplClass(Class<?>)设置 Service 实现类父类BaseServiceImpl.class
superServiceImplClass(String)设置 Service 实现类父类com.baomidou.global.BaseServiceImpl
enableFileOverride覆盖已生成文件默认值: false
convertServiceFileName(ConverterFileName)转换 Service 接口文件名称
convertServiceImplFileName(ConverterFileName)转换 Service 实现类文件名称
formatServiceFileName(String)格式化 Service 接口文件名称
formatServiceImplFileName(String)格式化 Service 实现类文件名称

StrategyConfig strategyConfig = new StrategyConfig.Builder()
    .serviceBuilder()
    .superServiceClass(BaseService.class)
    .superServiceImplClass(BaseServiceImpl.class)
    .formatServiceFileName("%sService")
    .formatServiceImplFileName("%sServiceImp")
    .build();

Mapper 策略配置

Mapper 策略配置用于定制 Mapper 接口和对应的 XML 映射文件的生成规则,包括父类、文件覆盖、Mapper 注解、结果映射、列列表、缓存实现类等。

|方法|说明|示例|
|superClass(Class<?>)|设置父类|BaseMapper.class|
|superClass(String)|设置父类|com.baomidou.global.BaseMapper|
|enableFileOverride|覆盖已生成文件|默认值: false|
|enableMapperAnnotation|开启 @Mapper 注解|默认值: false|
|enableBaseResultMap|启用 BaseResultMap 生成|默认值: false|
|enableBaseColumnList|启用 BaseColumnList|默认值: false|
|cache(Class<? extends Cache>)|设置缓存实现类|MyMapperCache.class||
|convertMapperFileName(ConverterFileName)|转换 Mapper 类文件名称||
|convertXmlFileName(ConverterFileName)|转换 XML 文件名称||
|formatMapperFileName(String)|格式化 Mapper 文件名称||
|formatXmlFileName(String)|格式化 XML 实现类文件名称||


StrategyConfig strategyConfig = new StrategyConfig.Builder()
    .mapperBuilder()
    .superClass(BaseMapper.class)
    .enableMapperAnnotation()
    .enableBaseResultMap()
    .enableBaseColumnList()
    .cache(MyMapperCache.class)
    .formatMapperFileName("%sDao")
    .formatXmlFileName("%sXml")
    .build();

InjectionConfig 注入配置

注入配置允许开发者自定义代码生成器的行为,包括在输出文件之前执行的逻辑、自定义配置 Map 对象、自定义配置模板文件等。

方法说明
beforeOutputFile(BiConsumer<TableInfo, Map<String, Object>>)输出文件之前执行的逻辑在生成文件之前执行自定义逻辑,如打印表信息或修改配置数据
customMap(Map<String, Object>)自定义配置 Map 对象用于在模板中访问自定义的配置信息,如项目名称、作者等
customFile(Map<String, String>)自定义配置模板文件用于指定自定义的模板文件路径,可以格式化文件名,参考测试用例 H2CodeGeneratorTest.testCustomFileByList

InjectionConfig injectionConfig = new InjectionConfig.Builder()
    .beforeOutputFile((tableInfo, objectMap) -> {
        System.out.println("准备生成文件: " + tableInfo.getEntityName());
        // 可以在这里添加自定义逻辑,如修改 objectMap 中的配置
    })
    .customMap(Collections.singletonMap("projectName", "MyBatis-Plus Generator"))
    .customFile(Collections.singletonMap("custom.txt", "/templates/custom.vm"))
    .build();

通过上述配置,开发者可以根据自己的需求,灵活地定制代码生成器的行为。例如,在生成文件之前执行特定的逻辑,或者使用自定义的模板文件来生成代码。这些配置选项提供了极大的灵活性,使得 MyBatis-Plus 代码生成器能够适应各种复杂的项目需求。

其他说明

DataSourceConfig.Builder.typeConvertHandler 说明

参数实现以下接口


public interface ITypeConvertHandler {

    /**
     * 转换字段类型
     *
     * @param globalConfig 全局配置
     * @param typeRegistry 类型注册信息,可以用来获取当前列字段类型
     * @param metaInfo     字段元数据信息,当前列字段信息
     * @return 子类类型
     */
    @NotNull
    IColumnType convert(GlobalConfig globalConfig, TypeRegistry typeRegistry, TableField.MetaInfo metaInfo);

}

//可以对指定字,指定其他类型


0

评论区