前言
本篇博客将介绍如何自定义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
上面是我对实体类自定义的一段修改,其作用是:
- 自动为表格所有字段创建对应类型的私有属性
- 当检测到字段驼峰名为createTime或createUser时,为该字段对应的属性添加
@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的则将重复检测交由数据库完成)
- username或name字段(同时存在时仅检测前者)的重复检测(手动开关)
- (批量)删除记录
- 支持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仓库获取该项目