【福利,掘金周边】【Spring Boot 快速入门】十一、Spring Boot集成AutoGenerator代码生成器

【福利,本文评论用户将有机会获得掘金新版徽章 1 枚】

前言

  XDM大家好,金秋时节,又与大家见面了。在8月分进行了满勤日更,已经“肝胆欲裂”了。8月底出来新的活动:一次免费申请掘金周边礼物的机会。抱着试试看的想法,提交了申请,争取为广大掘友申请福利。作者有幸获得了首批试行阶段的名额,感谢长期以来各位读者对小阿杰的认可,也感谢掘金提供本次机会,使作者与读者更好的互动。

  活动链接如下:请查收|你有一次免费申请掘金周边礼物的机会

  收到的系统站内信:

图片.png
  官网公布的名单。在收到申请周边活动成功之后的,也进行了充分的技术选题,在能输出技术知识的同时,又能充分调动读者的积极互动性。经过慎重思考之后,选择了写代码生成以及大家对代码生成器在项目中使用的一些思考,针对这些问题展开讨论。
图片.png
  好了开始正题,本次为大家介绍的代码生成器是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等相关文件。
图片.png

  如下图,生成的自动生成的文件相关文件目录结构,把我们需要的基本文件都已经生成了。
图片.png
  如下图中是我们生成的实体对象信息,其中包含了lombok和swagger2的相关注解,如果不需要这些,可以在GlobalConfig全局配置文件中进行配置。

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

思考(欢迎留言评论交流)

1、使用AutoGenerator代码生成器有哪些弊端?

2、大家还有哪些常用的代码生成器推荐,分享给大家?

3、关于使用代码生成器,在使用过程中都遇到过哪些奇葩的事情?

4、针对代码生成器你持什么态度?

5、在使用AutoGenerator代码生成器中遇到哪些问题,大家一起讨论学习。

欢迎大家积极交流评论。

福利

  本文参加的是:请查收|你有一次免费申请掘金周边礼物的机会 ,在所有评论用户中,将产生2位幸运的评论用户,将获得掘金官方提供的掘金新版徽章 2 枚

评论区抽奖要求(官方要求):

  • 截止到 9月10日,如果评论区超过 10 人互动(不含作者本人),作者可以以自己的名义抽奖送出掘金新版徽章 2 枚(掘金官方承担)。
  • 截止到 9月10日,如果评论区超过 10 人互动(不含作者本人),评论数超过 20 条(含作者本人),作者本人额外获得一份掘金周边礼物。
  • 评论区热度最高(评论人数+条数综合数据)TOP 1-5:新版徽章1套 或 掘金新版IPT恤1件

获奖条件

  热评幸运用户
如果本文评论达到掘金活动的要求,将从热评区用户中抽取一位幸运读者赠送掘金新版徽章 1 枚。如无热评用户,将转为评论幸运用户。

  评论幸运用户
如果本文评论达到掘金活动的要求,将所有评论区用户中抽取一位幸运读者赠送掘金新版徽章 1 枚。

开奖规则

  将于9月11日(星期六下午|晚上开奖),随机方式抽取。

结语

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

  作者介绍:【小阿杰】一个爱鼓捣的程序猿,JAVA开发者和爱好者。公众号【Java全栈架构师】维护者,欢迎关注阅读交流。

  好了,感谢您的阅读,希望您喜欢,如对您有帮助,欢迎点赞收藏。如有不足之处,欢迎评论指正。下次见。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享