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

前言

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

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

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

正文

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

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

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

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

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

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

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

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

<!--hibernate数据库->java对象模板-->
 <dependency>
     <groupId>org.apache.velocity</groupId>
     <artifactId>velocity-engine-core</artifactId>
     <version>2.2</version>
 </dependency>

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

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

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

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

六处配置的详细信息可以参看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

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

  • 自动为表格所有字段创建对应类型的私有属性
  • 当检测到字段驼峰名为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() {}
        };
  • 通过setMap,注入key-value结构的配置
// 自定义配置参数
        HashMap<String, Object> cfgParamsMap = new HashMap<>();
        cfgParamsMap.put("uniqueKey", 1); // 1代表数据库启用了unique_key或是不需要重复检测;0代表数据库未启用unique_key,代码将自动生成重复检测
        cfg.setMap(cfgParamsMap);
  • 在模板引擎.vm代码中,通过$cfg.xxx进行调用
#if($cfg.uniqueKey==0)
	// 执行重复检测
#end
案例2:0或多条模糊查询条件的分页查询

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

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

globalController.setSwagger2(true or false);

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值