• MybatisPlus自设模板:填补原模板在controller层对CURD操作的缺乏


    前言

    本篇博客将介绍如何自定义MybatisPlus生成模板,读者可从文中获取到以下知识:

    • 自动生成控制器对象相关代码,以及其中可自主定义的变量
    • 生成模板相关代码,以及如何为模板自定义新的方法

    最后,分享一个本人实现的MybatisPlus自设模板,相关代码已开源在gitee,可以作为一个比较好的初始化项目使用CURD_Templates

    正文

    正文部分,将分成以下板块:

    • 如何获取MybatisPlus对于MVC各层所设定的原始模板
    • 一个自动生成控制器由哪几部分组成
    • 模板中的变量获取以及函数控制规则
    • 介绍一下我的MybatisPlus自设模板项目

    1. 如何获取MybatisPlus对于MVC各层所设定的原始模板

    首先,要使用MybatisPlus的模板,需要导入其定义的模板依赖,版本必须与MybatisPlus依赖一致,否则会出现一些预料之外的错误:

    <dependency>
        <groupId>com.baomidougroupId>
        <artifactId>mybatis-plus-generatorartifactId>
        <version>3.4.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    模板要正常工作,还需要模板的解释器,这里有不同的选择,常用的是两种:

    • freemaker:对应模板文件后缀.ftl
    • velocity:对应模板文件后缀.vm

    解释器的规则并不通用,所以只能择其一介绍,这里我以velocity为例,导入依赖

    
     <dependency>
         <groupId>org.apache.velocitygroupId>
         <artifactId>velocity-engine-coreartifactId>
         <version>2.2version>
     dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    去外部库里找到generator依赖的jar包,里面有一个templates文件夹,这就是MybatisPlus所使用的默认模板
    在这里插入图片描述
    选择其中以.vm为后缀的模板文件,取出放置在/resources文件夹下的同名templates下,获取MVC各层的原始模板工作就算完成了,可以开始做定制化处理

    2. 一个自动生成控制器由哪几部分组成

    一个自动生成控制器主要包括:

    • 一处声明:创建代码生成器
    // 1.代码生成器
    AutoGenerator mpg = new AutoGenerator();
    
    • 1
    • 2
    • 六处配置:全局配置、数据源配置、包配置、模板配置、策略配置、自定义配置
    • 一处执行:执行代码生成器
     mpg.execute();
    
    • 1

    六处配置的详细信息可以参看gitee项目中给出的自动生成控制器实现,里面有详细的配置与注释,这里由于篇幅所限,不展开说明,仅在第三部分介绍一些自设案例时,对涉及到的配置进行简要说明

    3. 模板中的变量获取以及函数控制规则

    我们以实体模板entity.java.vm为例,来看看变量获取与函数控制规则相关的内容

    #foreach($field in ${table.fields})
    	#if((${field.propertyName}=="createUser")||(${field.propertyName}=="createTime"))
        /**
        * 自设功能:对createUser,createTime字段增加注解插入时自动填充(需搭配AutoInitField对象使用)
        *         设置LocalDateTime的Dateformat,避免返回"yyyy-MM-dd'T'HH:mm:ss"的默认形式
        */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        @TableField(fill = FieldFill.INSERT)
        #end
        private ${field.propertyType} ${field.propertyName};
    #end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    上面是我对实体类自定义的一段修改,其作用是:

    • 自动为表格所有字段创建对应类型的私有属性
    • 当检测到字段驼峰名为createTimecreateUser时,为该字段对应的属性添加@JsonFormat@TableField注解

    上述代码体现了:

    • 模板中的变量获取方式:${},如字段驼峰名 ${field.propertyName}
    • 函数控制规则:#[函数名]+#end

    4. 我的MybatisPlus自设模板项目

    • 主要任务:填补MybatisPlus初始模板在controller层对CURD操作的缺失
      • 特点1:进行访问的URI设置完全遵循RESTful风格,可以方便地对接前端

      • 特点2:提供了一些常见的controller层功能

        • 单条记录的新增与修改
          • username或name字段(同时存在时仅检测前者)的重复检测(手动开关)
            • 通过uniqueKey=1 or 0控制开关,默认关闭(建议未启用UNIQUE_KEY的数据库开启此功能,而已配置UNIQUE_KEY的则将重复检测交由数据库完成)
        • (批量)删除记录
        • 支持0或多条模糊查询条件的分页查询(只选择模糊查询的原因可以参见我的另一篇博客,当前设定已可覆盖大多数条件查询场景)
          • 自动检测外联表id,并在返回查询结果给前端时,替换id为name
        • (批量)启用或禁用记录
          • 自动检测是否有status字段,仅为有status字段的controller生成该功能
      • 特点3:有完整的异常记录

    • 次要任务:定义了一些默认的接口或处理方法,减少重复造轮子
      • 定义统一的后端->前端交互接口Results
      • 定义自动填充常用字段AutoInitField(在未主动赋值时)
    案例1:未启用UNIQUE_KEY的数据库自动生成重复检测相关代码

    这个案例很有意思,它涉及到模板引擎的一个重要知识点:

    • 如何自定义配置项,来完成自设功能的开或关(或者更复杂的配置)

    在MybatisPlus所提供的代码生成控制器中,有一项InjectionConfig,在其官方文档中,便为我们提供了如何进行自定义配置的方法:

    • 声明自定义配置项,并初始化Map
    InjectionConfig cfg = new InjectionConfig() {
                @Override
                public void initMap() {}
            };
    
    • 1
    • 2
    • 3
    • 4
    • 通过setMap,注入key-value结构的配置
    // 自定义配置参数
            HashMap<String, Object> cfgParamsMap = new HashMap<>();
            cfgParamsMap.put("uniqueKey", 1); // 1代表数据库启用了unique_key或是不需要重复检测;0代表数据库未启用unique_key,代码将自动生成重复检测
            cfg.setMap(cfgParamsMap);
    
    • 1
    • 2
    • 3
    • 4
    • 在模板引擎.vm代码中,通过$cfg.xxx进行调用
    #if($cfg.uniqueKey==0)
    	// 执行重复检测
    #end
    
    • 1
    • 2
    • 3
    案例2:0或多条模糊查询条件的分页查询

    这个案例主要展现变量引用的相关知识
    模板中的定义截图:
    在这里插入图片描述

    controller.java中具体生成的对应代码
    在这里插入图片描述
    模板中,${swagger2}属于自动生成控制器的全局配置,通过下面的代码开启或关闭(其他配置同理,在对应的配置模块通过声明启用相应配置):

    globalController.setSwagger2(true or false);
    
    • 1

    如果觉得有需要,请读者前往gitee仓库获取该项目

  • 相关阅读:
    Harbor 安装部署
    HTTP2指纹识别(一种相对不为人知的网络指纹识别方法)
    实用调试技巧,debug
    7 种提升 Spring Boot 吞吐量神技
    [oeasy]python0020换行字符_feed_line_lf_反斜杠n_B语言_安徒生童话
    3. 查询处理
    React使用forward和useImperativeHandle实现父组件调用子组件
    企业怎么找包收录的媒体做推广,便宜又好用的软文发稿平台推荐
    part-02 C++知识总结(类型转换)
    Docker 相关操作,及其一键安装Docker脚本
  • 原文地址:https://blog.csdn.net/weixin_43008154/article/details/127811257