【Spring Boot 快速入门】十一、Spring Boot集成AutoGenerator代码生成器

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 【Spring Boot 快速入门】十一、Spring Boot集成AutoGenerator代码生成器

开始正题,本次为大家介绍的代码生成器是MyBatis-Plus中的AutoGenerator。


初识 AutoGenerator。


  相信使用过的代码生成器小伙伴对此都感觉很爽,刷刷刷的基础代码就已经开发完成了。在Java开始过程中有一款经常使用的代码生成器AutoGenerator。AutoGenerator是MyBatis-Plus的代码生成器,通过AutoGenerator可以快速生成 Entity、Mapper、Mapper XML、Service、Controller等各个模块的代码,极大的提升了开发效率,减少了基础代码重复编写的工作。


快速开始


添加依赖


  MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖:本文针对Java开发者,使用Maven引入依赖包信息。

<!--    mybatis-plus    -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.29</version>
        </dependency>
        <!--    mybatis-plus    -->


基本配置


  在使用AutoGenerator代码生成器中,需要对相关参数进行配置,以便生成相关代码。主要配置包含:数据源配置、数据库表配置、包名配置、模板配置、全局策略配置、注入配置等。下面具体介绍各个配置的参数及其作用。


数据源配置


  数据源配置DataSourceConfig,其默认值:null,通过该配置,指定需要生成代码的具体数据库。


参数类型 描述 备注
dbQuery 数据库信息查询类 默认由 dbType 类型决定选择对应数据库内置实现
dbType 数据库类型 该类内置了常用的数据库类型【必须】
schemaName 数据库 schema name 例如 PostgreSQL 可指定为 public
typeConvert 类型转换 默认由 dbType 类型决定选择对应数据库内置实现
url 驱动连接的URL 数据库的链接地址
driverName 驱动名称 例如:com.mysql.cj.jdbc.Driver
username 数据库连接用户名 数据库连接用户名
password 数据库连接密码 数据库连接密码


数据库表配置


  数据库表配置StrategyConfig,其默认值:null,通过该配置,可指定需要生成哪些表或者排除哪些表。


参数类型 描述 备注与默认值
isCapitalMode 是否大写命名 false
skipView 是否跳过视图 false
naming 数据库表映射到实体的命名策略
columnNaming 数据库表字段映射到实体的命名策略, 未指定按照 naming 执行 null
tablePrefix 表前缀
fieldPrefix 字段前缀
superEntityClass 自定义继承的Entity类全称,带包名
superEntityColumns 自定义基础的Entity类,公共字段
superMapperClass 自定义继承的Mapper类全称,带包名 String SUPER_MAPPER_CLASS = "com.baomidou.mybatisplus.core.mapper.BaseMapper";
superServiceClass 自定义继承的Service类全称,带包名 String SUPER_SERVICE_CLASS = "com.baomidou.mybatisplus.extension.service.IService";
superServiceImplClass 自定义继承的ServiceImpl类全称,带包名
superControllerClass 自定义继承的Controller类全称,带包名
enableSqlFilter 默认激活进行sql模糊表名匹配,关闭之后likeTable与notLikeTable将失,include和exclude将使用内存过滤,如果有sql语法兼容性问题的话,请手动设置为false
include 需要包含的表名,当enableSqlFilter为false时,允许正则表达式(与exclude二选一配置 null
likeTable 自3.3.0起,模糊匹配表名(与notLikeTable二选一配置) likeTable
exclude 需要排除的表名,当enableSqlFilter为false时,允许正则表达式 null
notLikeTable 自3.3.0起,模糊排除表名 null
entityColumnConstant 【实体】是否生成字段常量(默认 false) false
chainMode 【实体】是否为构建者模型(默认 false)3.3.2开始 原来版本是 entityBuilderModel
entityLombokModel 【实体】是否为lombok模型(默认 false) 3.3.2以下版本默认生成了链式模型,3.3.2以后,
entityBooleanColumnRemoveIsPrefix Boolean类型字段是否移除is前缀(默认 false) false
restControllerStyle 生成 @RestController 控制器 false
controllerMappingHyphenStyle 驼峰转连字符 false
entityTableFieldAnnotationEnable 是否生成实体时,生成字段注解 false
versionFieldName 乐观锁属性名称
logicDeleteFieldName 逻辑删除属性名称 is_del
tableFillList 表填充字段


包名配置


  包名配置PackageConfig,其默认值:null,通过该配置,指定生成代码的包路径。


参数类型 描述 默认值
parent 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名 com.baomidou
moduleName 父包模块名 null
entity Entity包名 entity
service Service包名 service
serviceImpl Service Impl包名 service.impl
mapper Mapper mapper
xml Mapper XML包名 mapper.xml
controller Controller包名 controller
pathInfo 路径配置信息


模板配置


  模板配置TemplateConfig,其默认值:null,可自定义代码生成的模板,实现个性化操作。


参数类型 描述 备注
entity Java 实体类模板 /templates/entity.java
entityKt Kotin 实体类模板 /templates/entity.kt
service Service 类模板 /templates/service.java
serviceImpl Service impl 实现类模板 /templates/serviceImpl.java
mapper mapper 模板 /templates/mapper.java
xml mapper xml 模板 /templates/mapper.xml
controller controller 控制器模板 /templates/controller.java


全局策略配置


  全局策略配置GlobalConfig,其默认值:null。


参数类型 描述 备注
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
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,其默认值:null,通过该配置,可注入自定义参数等操作以实现个性化操作。


参数类型 描述 备注
map 自定义返回配置 Map 对象 该对象可以传递到模板引擎通过 cfg.xxx 引用
fileOutConfigList 自定义输出文件 配置 FileOutConfig 指定模板文件、输出文件达到自定义文件生成目的
fileCreate 自定义判断是否创建文件 实现 IFileCreate 接口
initMap 注入自定义 Map 对象(注意需要setMap放进去)

  

通过上述介绍的配置信息,MyBatis-Plus 的AutoGenerator代码生成器提供了大量的自定义参数,能够满足绝大部分人的使用需求。下面针对上述配置进行编写代码。其实就是针对DataSourceConfig、StrategyConfig、PackageConfig、TemplateConfig、GlobalConfig、InjectionConfig这些实体类赋值即可。

示例



设置常量


/**
     * 需要生成的表名
     * */
    private static final String[] TABLE_NAMES = new String[]{"z_seo"};
    /**
     * 文件路径
     * */
    public static final String PROJECT_PATH = "E:\\bootproject\\BootDemo\\";
    //
    /**
     * 项目名
     * */
    public static final String PROJECT_NAME = "18BootAutoGenerator";
    /**
     * 模块名称
     * */
    public static final String MODULE_NAME ="";
    /**
     * 数据源配置
     * */
    public static final String DATA_SOURCE_URL ="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior" +
            "=convertToNull";
    public static final String DATA_SOURCE_USERNAME ="test";
    public static final String DATA_SOURCE_PASSWORD ="123456";
    public static final String DATA_SOURCE_DRIVERNAME ="com.mysql.cj.jdbc.Driver";


初始化代码生成器


/**
     * @MethodName: main
     * @Description: 代码生成器
     * @Return: 
     * @Author: JavaZhan @公众号:Java全栈架构师
     * @Date: 2021/9/8
     **/
    public static void main(String[] args) {
            // 代码生成器
            AutoGenerator autoGenerator = new AutoGenerator();
            autoGenerator.setDataSource(getDataSourceConfigInfo());
            autoGenerator.setGlobalConfig(getGlobalConfigInfo());
            autoGenerator.setPackageInfo(getPackageConfigInfo());
            autoGenerator.setStrategy(getStrategyConfigInfo(TABLE_NAMES));
            autoGenerator.setTemplate(new TemplateConfig().setXml(null));
            autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine());
            autoGenerator.setCfg(getInjectionConfigInfo());
            autoGenerator.execute();
        }


数据源配置


/**
     * @MethodName: getDataSourceConfigInfo
     * @Description: 数据源配置
     * @Return: DataSourceConfig
     * @Author: JavaZhan @公众号:Java全栈架构师
     * @Date: 2021/9/8
     **/
     public static DataSourceConfig getDataSourceConfigInfo() {
            DataSourceConfig dataSourceConfig = new DataSourceConfig();
            dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull");
            dataSourceConfig.setUsername("test");
            dataSourceConfig.setPassword("123456");
            dataSourceConfig.setDbType(DbType.MYSQL);
            dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
            return dataSourceConfig;
     }


全局配置


/**
     * @MethodName: getGlobalConfigInfo
     * @Description: 全局配置
     * @Return: GlobalConfig
     * @Author: JavaZhan @公众号:Java全栈架构师
     * @Date: 2021/9/8
     **/
    public static GlobalConfig getGlobalConfigInfo() {
            // 全局配置
            GlobalConfig globalConfig = new GlobalConfig();
    //        String projectPath = System.getProperty("user.dir");
            globalConfig.setOutputDir(PROJECT_PATH + PROJECT_NAME + "/src/main/java/");
            globalConfig.setAuthor("JavaZhan");
            globalConfig.setOpen(false);
            globalConfig.setSwagger2(true);
            globalConfig.setBaseColumnList(true);
            globalConfig.setBaseResultMap(true);
            globalConfig.setActiveRecord(false);
            globalConfig.setFileOverride(true);
            globalConfig.setServiceName("%sService");
            return globalConfig;
        }


包配置


/**
     * @MethodName: getPackageConfigInfo
     * @Description: 包配置
     * @Return: PackageConfig
     * @Author: JavaZhan @公众号:Java全栈架构师
     * @Date: 2021/9/8
     **/
     public static PackageConfig getPackageConfigInfo() {
            PackageConfig packageConfig = new PackageConfig();
            packageConfig.setParent("com.example.demo");
            packageConfig.setModuleName("test");
            packageConfig.setEntity("module");
            return packageConfig;
        }


策略配置


/**
     * @MethodName: getStrategyConfigInfo
     * @Description: 策略配置
     * @Return: StrategyConfig
     * @Author: JavaZhan @公众号:Java全栈架构师
     * @Date: 2021/9/8
     **/
    public static StrategyConfig getStrategyConfigInfo(String... tableNames) {
            StrategyConfig strategyConfigInfo = new StrategyConfig();
            strategyConfigInfo.setCapitalMode(true);
            strategyConfigInfo.setNaming(NamingStrategy.underline_to_camel);
            //下划线转驼峰命名
            strategyConfigInfo.setColumnNaming(NamingStrategy.underline_to_camel);
            //需要生成的的表名,多个表名传数组
            strategyConfigInfo.setInclude(tableNames);
            //设置逻辑删除字段
            strategyConfigInfo.setLogicDeleteFieldName("data_state");
            //使用lombok
            strategyConfigInfo.setEntityLombokModel(true);
            //设置表格前缀
            strategyConfigInfo.setTablePrefix("");
            //rest风格
            strategyConfigInfo.setRestControllerStyle(true);
            return strategyConfigInfo;
        }


抽象的对外接口


/**
     * @MethodName: getInjectionConfigInfo
     * @Description: 抽象的对外接口
     * @Return: InjectionConfig
     * @Author: JavaZhan @公众号:Java全栈架构师
     * @Date: 2021/9/8
     **/
    public static InjectionConfig getInjectionConfigInfo(){
            InjectionConfig injectionConfig = new InjectionConfig() {
                @Override
                public void initMap() {
                }
            };
            List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
            focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
                @Override
                public String outputFile(TableInfo tableInfo) {
                    // 输出xml
                    return PROJECT_PATH + PROJECT_NAME + "/src/main/resources/mapper/" + MODULE_NAME
                            + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
                }
            });
            injectionConfig.setFileOutConfigList(focList);
            return injectionConfig;
        }


执行


  在项目中执行初始化main方法,出现如下图中日志,包含module、service、impl、mapper、xml等相关文件。

image.png


  如下图,生成的自动生成的文件相关文件目录结构,把我们需要的基本文件都已经生成了。


image.png


  如下图中是我们生成的实体对象信息,其中包含了lombok和swagger2的相关注解,如果不需要这些,可以在GlobalConfig全局配置文件中进行配置。


image.png


 好了,本文基于Spring Boot集成AutoGenerator代码生成器的相关功能已经介绍完了,并针对配置进行了Demo演示。大家可以根据项目中具体的需要,进行更加详实的参数配置,以满足个性化的需求。


结语


  本次基于Spring Boot集成AutoGenerator代码生成器的项目就完成了,粗枝大叶的建立了一个快速代码生成的框架,当然还有更深入的配置参数去满足个性化的需求。本文主要针对新手入门练习使用,也作为基础查询手册使用,希望本文可以帮助到你。感谢阅读。



相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
22天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
38 0
|
1月前
|
存储 安全 Java
Spring Boot整合Spring Security--学习笔记
Spring Boot整合Spring Security--学习笔记
53 0
|
11天前
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
|
1月前
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
404 0
|
1天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
4 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
3天前
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
28 0
【Spring系列】Sping VS Sping Boot区别与联系
|
11天前
|
Java 容器
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
12 0
|
18天前
|
开发框架 负载均衡 Java
Spring boot与Spring cloud之间的关系
总之,Spring Boot和Spring Cloud之间的关系是一种构建和扩展的关系,Spring Boot提供了基础,而Spring Cloud在此基础上提供了分布式系统和微服务架构所需的扩展和工具。
16 4
Spring boot与Spring cloud之间的关系
|
22天前
|
JavaScript Java 关系型数据库
SpringBoot + Mybatis + Vue的代码生成器
SpringBoot + Mybatis + Vue的代码生成器
32 2
|
1月前
|
Java 数据库连接 数据库
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
26 2

热门文章

最新文章