【第32章】MyBatis-Plus之代码生成器配置

news2024/9/20 18:29:41

文章目录

  • 前言
  • 一、概述
    • 1.特点说明
    • 2.示例配置
    • 3. 数据库配置 (DataSourceConfig)
  • 二、全局配置 (GlobalConfig)
    • 1.方法说明
    • 2.示例配置
  • 三、包配置 (PackageConfig)
    • 1. 方法说明
    • 2. 示例配置
  • 四、模板配置 (TemplateConfig)
    • 1. 方法说明
    • 2. 示例配置
  • 五、注入配置 (InjectionConfig)
    • 1. 方法说明
    • 2. 示例配置
  • 六、策略配置 (StrategyConfig)
    • 1. 方法说明
    • 2. 示例配置
    • 3. Entity 策略配置
      • 3.1 方法说明
      • 3.2 示例配置
    • 4. Controller 策略配置
      • 1 方法说明
      • 2 示例配置
    • 5. Service 策略配置
      • 1 方法说明
      • 2 示例配置
    • 6. Mapper 策略配置
      • 1 方法说明
      • 2 示例配置
  • 七、自定义模板支持 (DTO/VO 等) 配置
  • 八、实战
    • 1. 准备
    • 2. 生成器代码
    • 3. 生成效果
      • 3.1 FileController
      • 3.2 FileMapper
      • 3.3 FileMapper.xml
      • 3.4 File
      • 3.5 FileServiceImpl
      • 3.6 FileService
  • 总结


前言

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


一、概述

1.特点说明

  1. Builder 模式:通过 builder 模式,开发者可以链式调用配置方法,直观地构建代码生成器的配置,使得代码更加清晰易读。

  2. 快速配置:新代码生成器提供了快速配置选项,如全局配置、包配置、策略配置等,可以一键设置常用选项,快速启动代码生成过程。

  3. 模板引擎:支持 Freemarker 等模板引擎,允许开发者自定义代码模板,以生成符合项目特定风格的代码。

  4. Lombok 集成:新代码生成器默认启用 Lombok,减少了样板代码的编写,提高了代码的可读性和维护性。

  5. 多数据库支持:支持多种数据库类型,如 MySQL、Oracle、SQL Server 等,只需配置相应的数据库连接信息即可。

  6. 灵活的数据源配置:提供了丰富的数据源配置选项,包括数据库查询方式、类型转换器、关键字处理器等,满足不同数据库的需求。

2.示例配置

// 使用 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(); // 执行生成

3. 数据库配置 (DataSourceConfig)

基础配置

属性说明示例
urljdbc 路径jdbc:mysql://127.0.0.1:3306/mybatis-plus
username数据库账号root
password数据库密码123456
DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus", "root", "123456").build();

可选配置

方法说明示例
dbQuery(IDbQuery)数据库查询new MySqlQuery(),只在SQLQuery下生效
schema(String)数据库 schema(部分数据库适用)mybatis-plus
typeConvert(ITypeConvert)数据库类型转换器new MySqlTypeConvert(),只在SQLQuery下生效
keyWordsHandler(IKeyWordsHandler)数据库关键字处理器new MySqlKeyWordsHandler()
typeConvertHandler(ITypeConvertHandler)类型转换器(默认)自定义实现ITypeConvertHandler,只在DefaultQuery下生效
databaseQueryClass(AbstractDatabaseQuery)数据库查询方式默认DefaultQuery.class(通用元数据), SQLQuery.class(SQL查询)
// 使用SQL查询的方式生成代码,属于旧的代码生成方式,通用性不是好,老的代码可以继续使用,适配数据库需要完成dbQuery和typeConvert的扩展,后期不再维护这种方式
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();

// 使用元数据查询的方式生成代码,默认已经根据jdbcType来适配java类型,支持使用typeConvertHandler来转换需要映射的类型映射
DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus", "root", "123456")
    .schema("mybatis-plus")
    .keyWordsHandler(new MySqlKeyWordsHandler())
    .build();

二、全局配置 (GlobalConfig)

全局配置提供了对代码生成器整体行为的设置,包括输出目录、作者信息、Kotlin 模式、Swagger 集成、时间类型策略等。

1.方法说明

方法说明示例
disableOpenDir()禁止自动打开输出目录默认值: true
outputDir(String)指定代码生成的输出目录/opt/baomidou 默认值: Windows: D:// Linux/Mac: /tmp
author(String)设置作者名baomidou 默认值: 配置文件中的作者名
enableKotlin()开启 Kotlin 模式默认值: false
enableSwagger()开启 Swagger 模式默认值: false
dateType(DateType)设置时间类型策略DateType.ONLY_DATE 默认值: DateType.TIME_PACK
commentDate(String)设置注释日期格式默认值: yyyy-MM-dd

2.示例配置

GlobalConfig globalConfig = new GlobalConfig.Builder()
    .disableOpenDir(false) // 允许自动打开输出目录
    .outputDir("/path/to/output") // 设置输出目录
    .author("Your Name") // 设置作者名
    .enableKotlin(true) // 开启 Kotlin 模式
    .enableSwagger(true) // 开启 Swagger 模式
    .dateType(DateType.ONLY_DATE) // 设置时间类型策略
    .commentDate("yyyy-MM-dd") // 设置注释日期格式
    .build();

三、包配置 (PackageConfig)

包配置用于定义生成代码的包结构,包括父包名、模块名、实体类包名、服务层包名等。

1. 方法说明

方法说明示例
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)设置 Mapper XML 包名默认值: mapper.xml
controller(String)设置 Controller 包名默认值: controller
pathInfo(Map<OutputFile, String>)设置路径配置信息Collections.singletonMap(OutputFile.mapperXml, “D://”)

2. 示例配置

PackageConfig packageConfig = new PackageConfig.Builder()
    .parent("com.example") // 设置父包名
    .moduleName("myapp") // 设置父包模块名
    .entity("model") // 设置 Entity 包名
    .service("service") // 设置 Service 包名
    .serviceImpl("service.impl") // 设置 Service Impl 包名
    .mapper("dao") // 设置 Mapper 包名
    .xml("mappers") // 设置 Mapper XML 包名
    .controller("controller") // 设置 Controller 包名
    .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "/path/to/xml")) // 设置路径配置信息
    .build();

四、模板配置 (TemplateConfig)

注意:自 MyBatis-Plus 3.5.6 版本开始,模板配置已迁移至 StrategyConfig 中。以下是迁移后的配置方式。

1. 方法说明

方法说明示例
entityBuilder()设置实体类模板
javaTemplate(String)设置 Java 实体模板/templates/entity.java
disable()禁用实体类生成
serviceBuilder()设置 Service 层模板
disableService()禁用 Service 层生成
serviceTemplate(String)设置 Service 模板/templates/service.java
serviceImplTemplate(String)设置 ServiceImpl 模板/templates/serviceImpl.java

2. 示例配置

// 3.5.6 之前的配置示例
TemplateConfig templateConfig = new TemplateConfig.Builder()
    .disable(TemplateType.ENTITY)
    .entity("/templates/entity.java")
    .service("/templates/service.java")
    .serviceImpl("/templates/serviceImpl.java")
    .mapper("/templates/mapper.java")
    .mapperXml("/templates/mapper.xml")
    .controller("/templates/controller.java")
    .build();

// 3.5.6 之后的配置示例
StrategyConfig strategyConfig = new StrategyConfig.Builder()
    .entityBuilder()
    .javaTemplate("/templates/entity.java") // 设置实体类模板
    .disable() // 禁用实体类生成
    .serviceBuilder()
    .disableService() // 禁用 Service 层生成
    .serviceTemplate("/templates/service.java") // 设置 Service 模板
    .serviceImplTemplate("/templates/serviceImpl.java") // 设置 ServiceImpl 模板
    .build();

五、注入配置 (InjectionConfig)

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

1. 方法说明

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

2. 示例配置

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 代码生成器能够适应各种复杂的项目需求。

六、策略配置 (StrategyConfig)

策略配置是 MyBatis-Plus 代码生成器的核心部分,它允许开发者根据项目需求定制代码生成的规则,包括命名模式、表和字段的过滤、以及各个代码模块的生成策略。

1. 方法说明

方法说明示例
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 策略配置

2. 示例配置

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

3. Entity 策略配置

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

3.1 方法说明

方法说明示例
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)添加表字段填充
idType(IdType)全局主键类型
convertFileName(ConverterFileName)转换文件名称
formatFileName(String)格式化文件名称

3.2 示例配置

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();

4. Controller 策略配置

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

1 方法说明

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

2 示例配置

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

5. Service 策略配置

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

1 方法说明

方法说明示例
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 实现类文件名称

2 示例配置

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

6. Mapper 策略配置

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

1 方法说明

方法说明示例
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 实现类文件名称

2 示例配置

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

七、自定义模板支持 (DTO/VO 等) 配置

MyBatis-Plus 代码生成器支持自定义模板,如 DTO (Data Transfer Object) 和 VO (Value Object) 等,通过扩展 FreemarkerTemplateEngine 类来实现。

以下是如何配置和使用自定义 Freemarker 模板的示例。

首先,创建一个自定义的 Freemarker 模板引擎类,该类继承自 FreemarkerTemplateEngine,并重写 outputCustomFile 方法来输出自定义文件。

/**
 * 代码生成器支持自定义[DTO\VO等]模版
 */
public class EnhanceFreemarkerTemplateEngine extends FreemarkerTemplateEngine {

    @Override
    protected void outputCustomFile(@NotNull Map<String, String> customFile, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
        String entityName = tableInfo.getEntityName();
        String otherPath = this.getPathInfo(OutputFile.other);
        customFile.forEach((key, value) -> {
            String fileName = String.format(otherPath + File.separator + entityName + "%s", key);
            this.outputFile(new File(fileName), objectMap, value);
        });
    }
}

在配置代码生成器时,可以通过 injectionConfig 方法添加自定义文件配置。以下是一个使用自定义 Freemarker 模板的示例。

FastAutoGenerator.create(url, username, password)
    .globalConfig(builder -> {
        builder.author("abc") // 设置作者
            .enableSwagger() // 开启 swagger 模式
            .fileOverride() // 覆盖已生成文件
            .disableOpenDir() // 禁止打开输出目录
            .outputDir(finalProjectPath + "/src/main/java"); // 指定输出目录
    })
    .packageConfig(builder -> {
        builder.parent("com.baomidou.mybatisplus.samples") // 设置父包名
            .moduleName("test") // 设置父包模块名
            .entity("model.entity") // 设置实体类包名
            .other("model.dto") // 设置 DTO 包名
            .pathInfo(Collections.singletonMap(OutputFile.xml, finalProjectPath + "/src/main/resources/mapper")); // 设置 Mapper XML 文件生成路径
    })
    .injectionConfig(consumer -> {
        Map<String, String> customFile = new HashMap<>();
        // DTO
        customFile.put("DTO.java", "/templates/entityDTO.java.ftl");
        consumer.customFile(customFile);
    })
    .templateEngine(new EnhanceFreemarkerTemplateEngine()) // 使用自定义的模板引擎
    .execute(); // 执行生成

在上面的示例中,我们定义了一个名为 entityDTO.java.ftl 的自定义 Freemarker 模板,并将其路径添加到 customFile 映射中。在生成代码时,代码生成器将使用这个模板来生成 DTO 类。

注意

  • 自定义模板文件应放置在项目的 templates 目录下,或者指定一个有效的路径。
  • 模板文件的命名应遵循一定的规则,例如 entityDTO.java.ftl,其中 entityDTO 是生成的类名,.java 表示生成的文件类型,.ftlFreemarker 模板的扩展名。
  • 在模板文件中,可以使用 Freemarker 的语法来访问 objectMap 中的数据,例如 ${entityName} 可以获取实体类的名称。

八、实战

其实前面我们已经介绍过代码生成器,这里的内容配置更加详细,算是一定的补充,我这里再提供一份案例,让大家稍做修改即可使用代码生成器的功能。

1. 准备

DROP TABLE IF EXISTS `file`;
CREATE TABLE `file`  (
  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `file_path` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '文件路径',
  `file_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件名',
  `file_size` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '文件大小',
  `file_type` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '文件类型',
  `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '租户ID',
  `create_time` datetime(0) NOT NULL COMMENT '创建时间',
  `update_time` datetime(0) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '文件表' ROW_FORMAT = DYNAMIC;

2. 生成器代码

package org.example.springboot3.mybatisplus;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import jakarta.servlet.http.PushBuilder;
import org.apache.ibatis.annotations.Mapper;

import java.sql.Types;
import java.util.Collections;

/**
 * Create by zjg on 2024/6/23
 */
public class Generator {
    public static void main(String[] args) {
        // 使用 FastAutoGenerator 快速配置代码生成器
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true", "root", "123456a?")
                .globalConfig(builder -> {
                    builder.author("zhangjg") // 设置作者
                            .outputDir("src\\main\\java")// 输出目录
                            .disableOpenDir();//禁止自动打开输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("org.example.generator") // 设置父包名
                            .entity("model") // 设置实体类包名
                            .controller("controller")// 设置 Controller 类包名
                            .service("service") // 设置 Service 接口包名
                            .serviceImpl("service.impl") // 设置 Service 实现类包名
                            .mapper("dao") // 设置 Mapper 接口包名
                            .xml("mappers"); // 设置 Mapper XML 文件包名
                })
                .strategyConfig(builder -> {
                    builder.addInclude("file") // 设置需要生成的表名
                            .entityBuilder()
                            .enableLombok() // 启用 Lombok
                            .enableTableFieldAnnotation() // 启用字段注解
                            .controllerBuilder()
                            .enableRestStyle()// 启用 REST 风格
                            .serviceBuilder()
                            .formatServiceFileName("%sService")
                            .mapperBuilder()
                            .mapperAnnotation(Mapper.class);
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 模板引擎
                .execute(); // 执行生成
        System.out.println("success");
    }
}

3. 生成效果

在这里插入图片描述

3.1 FileController

package org.example.generator.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 * 文件表 前端控制器
 * </p>
 *
 * @author zhangjg
 * @since 2024-07-07
 */
@RestController
@RequestMapping("/file")
public class FileController {

}

3.2 FileMapper

package org.example.generator.dao;

import org.example.generator.model.File;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

/**
 * <p>
 * 文件表 Mapper 接口
 * </p>
 *
 * @author zhangjg
 * @since 2024-07-07
 */
@Mapper
public interface FileMapper extends BaseMapper<File> {

}

3.3 FileMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.generator.dao.FileMapper">

</mapper>

3.4 File

package org.example.generator.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;

/**
 * <p>
 * 文件表
 * </p>
 *
 * @author zhangjg
 * @since 2024-07-07
 */
@Getter
@Setter
@TableName("file")
public class File implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 文件路径
     */
    @TableField("file_path")
    private String filePath;

    /**
     * 文件名
     */
    @TableField("file_name")
    private String fileName;

    /**
     * 文件大小
     */
    @TableField("file_size")
    private String fileSize;

    /**
     * 文件类型
     */
    @TableField("file_type")
    private String fileType;

    /**
     * 租户ID
     */
    @TableField("tenant_id")
    private String tenantId;

    /**
     * 创建时间
     */
    @TableField("create_time")
    private LocalDateTime createTime;

    /**
     * 修改时间
     */
    @TableField("update_time")
    private LocalDateTime updateTime;
}

3.5 FileServiceImpl

package org.example.generator.service.impl;

import org.example.generator.model.File;
import org.example.generator.dao.FileMapper;
import org.example.generator.service.FileService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 文件表 服务实现类
 * </p>
 *
 * @author zhangjg
 * @since 2024-07-07
 */
@Service
public class FileServiceImpl extends ServiceImpl<FileMapper, File> implements FileService {

}

3.6 FileService

package org.example.generator.service;

import org.example.generator.model.File;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * <p>
 * 文件表 服务类
 * </p>
 *
 * @author zhangjg
 * @since 2024-07-07
 */
public interface FileService extends IService<File> {

}

总结

回到顶部

通过上述配置,开发者可以根据项目需求自定义代码生成器的模板,从而生成符合特定项目结构的代码文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1923544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第三期书生大模型实战营之Python前置知识

闯关任务1 请实现一个wordcount函数&#xff0c;统计英文字符串中每个单词出现的次数。返回一个字典&#xff0c;key为单词&#xff0c;value为对应单词出现的次数。 算法流程 1. 去除标点&#xff1a;使用string.punctuation和str.translate去除文本中的标点符号。 2. 转换…

制造业ERP源码 ERP系统源码 ERP小程序源码

制造业ERP源码 ERP系统源码 ERP小程序源码 资料&#xff1a; 委外工厂管理 客户列表 车间管理 供应商管理 账户管理 商品管理 仓库管理 职员管理 自取地址管理 司机管理 辅助资料 客户等级 供应商分类 客户分类 商品分类 支出类别管理 收入类别管…

第一次构建一个对话机器人流程解析(一)

1.问答机器人的组成 1.1 问答机器人的组成结构图 2. 问答机器人的组成-机器人的个人属性 所谓的机器人一般具备有个人的属性&#xff0c;这些属性固定&#xff0c;形成了机器人的个人偏好 在实现过程中&#xff0c;此处使用一个xml配置文件&#xff0c;配置了机器人的个人年…

Jetbrains IDEA中Git常用操作

Git简介与使用 Intro Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一款分布式版本控制系统&#xff08;VSC&#xff09;&#xff0c;是团队合作开发…

通信协议 | 一文玩转UART协议就够了

文章目录 协议基础1、UART简介2、UART特性3、UART协议帧3.1、起始位3.2、数据位3.3、奇偶校验位3.4、停止位 4、UART通信步骤 最详细的UART通讯协议分析Verilog代码实现UART接口模块驱动 协议基础 1、UART简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&…

注意!避免计算组覆盖!

问题描述&#xff1a; PowerBI在实际使用中&#xff0c;针对于某些数据&#xff0c;需要呈现文本类型的标签&#xff0c;一般这类需求&#xff0c;都是通过计算组来解决的。 但计算组在使用中&#xff0c;也会存在一些问题&#xff0c;就是一旦点击交互&#xff0c;就会影响到其…

vue 自定义滚动条同步拖动(移动端)

实现效果&#xff0c;拖动左右箭头实现图片区域同步滚动&#xff0c;到边缘停止拖动。 HTML代码 <template><div touchstart"onClick"><!--使用draggable组件 图片列表区域--><draggablev-model"select_list"end"onEnd"cl…

2024软件测试面试题汇总【备战金九银十】内容较长建议收藏

一、面试基础题 简述测试流程: 1、阅读相关技术文档&#xff08;如产品PRD、UI设计、产品流程图等&#xff09;。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划。 4、编写测试用例&#xff08;等价类划分法、边界值分析法等&#xff09;。 5、用例评审(…

鸿蒙语言基础类库:【@ohos.convertxml (xml转换JavaScript)】

xml转换JavaScript 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 …

【Python】日期和时间模块

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言时间元组datetime 模块datetime类获取当前日期和时间 timedelta类日期和时间运算 strftime()方法格式化时间日期格式化符号 strptime()方法 Time 模块Time 模块内置函数Time 模…

牛客小白月赛98 (个人题解)(待补完)

前言&#xff1a; 昨天晚上自己一个人打的小白月赛&#xff08;因为准备数学期末已经写烦了&#xff09;&#xff0c;题目难度感觉越来越简单了&#xff08;不在像以前一样根本写不了一点&#xff0c;现在看题解已经能看懂一点了&#xff09;&#xff0c;能感受到自己在不断进步…

LLM基础模型系列:Prompt-Tuning

------->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<------ 大型预训练语言模型的规模不断扩大&#xff0c;在许多自然语言处理 &#xff08;NLP&#xff09; 基准测试中取得了最先进的结果。自GPT和BERT开发以来&#xff0c;标准做法一直是在下游…

802.11ax RU - 传输的最小单元

子载波 无线信号是加载在某个固定频率上进行传输的&#xff0c;这个频率被称为载波。802.11标准中&#xff0c;对传输频率有更新的划分&#xff0c;而这些划分的频率被称为子载波。Wi-Fi 6中&#xff0c;以20Mhz信道为例&#xff0c;20Mhz信道被划分成256个子载波&#xff0c;…

Go-知识测试-子测试

Go-知识测试-子测试 1. 介绍2. 例子3. 子测试命名规则4. 选择性执行5. 子测试并发6. testing.T.Run7. testing.T.Parallel8. 子测试适用于单元测试9. 子测试适用于性能测试10. 总结10.1 启动子测试 Run10.2 启动并发测试 Parallel 建议先看&#xff1a;https://blog.csdn.net/a…

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud【翻译与解读】

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud 摘要 特征提取和匹配是许多机器人视觉任务的基本组成部分&#xff0c;如 2D 或 3D 目标检测、识别和配准。2D 特征提取和匹配已取得巨大成功。然而&#xff0c;在 3D 领域&#xff0c;当前方法由于描述性差…

手机大模型能否撑起“全村的希望”?

2023年&#xff0c;ChatGPT、SD的火爆带火了AI赛道。但现有的AI痛点则是&#xff1a;操作复杂&#xff0c;需要网络&#xff0c;大家对本地AI的呼声越来越高。也因此产生了AI PC和手机上装上大模型。手机上装大模型&#xff0c;确实会对现在低迷的手机市场带来一些影响&#xf…

链路追踪系列-02.演示zipkin

当本机启动docker es zipkinServer之后&#xff1a; 启动3个项目&#xff1a;先eureka-server&#xff0c;再 PaymentMain8001,… 浏览器打开&#xff1a;http://localhost:9001/consumer/payment/zipkin consumer代码 &#xff1a; provider: 此时查询es:

安全防御----防火墙综合实验2

安全防御----防火墙综合实验2 一、题目 二、实验要求&#xff1a; 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00 - 18&#xff1a;00&#xff09;可以访问&#xff0c;生产区的设备全天可以访问. 2&#xff0c;生产区不允许访…

微积分-导数7(关联变化率)

例一 空气被充入一个球形气球中&#xff0c;使其体积以每秒100立方厘米的速度增加。当气球的直径为50厘米时&#xff0c;气球半径的增加速度是多少&#xff1f; 解答&#xff1a;球体的体积公式为 V 4 3 π r 3 V \frac{4}{3}\pi r^3 V34​πr3 为了使用给定的信息&#x…

Java中标识符和关键字

1.标识符 public class HelloWorld{public static void main(String[] args){System.out.println("Hello,world");} }上述代码中在public class 后面的HelloWorld称为类名&#xff0c;main称为方法名&#xff0c;也可以将其称为标识符&#xff0c;即&#xff1a;在程…