Mybatis是一个非常流行的Java ORM框架,它为开发者提供了一种简单的方式来操作关系型数据库。Mybatis插件是Mybatis的一个重要扩展功能,它允许开发者通过自定义插件来增强Mybatis的功能。在这篇文章中,我们将介绍如何使用Mybatis插件来实现自动填充字段的功能。

为什么不用mybatis-plus

相信大家在增删改查的时候都会有一个自动填充字段的需求,一翻网上的”攻略“,大部分文章都会告诉你用mybatis-plus。但是如果我们想要对mybatis有一个较深的了解,那么应该多用mybatis而不是mybatis-plus,一来因为面试的时候面试官可不会问你mybatis-plus那么几个简单的CRUD操作,二来强迫自己使用mybatis的话能够让自己学习到更多底层的原理和知识,对自己的发展是非常有益的。
那么,文归正题。

这个自定义插件主要用来做什么?

我们今天主要是要写一个mybatis插件,这个插件的任务就是能够让我们在进行insert和update操作的时候自动地对某些自定义的字段进行自定义的填充。
网上有很多的教程也是教你如何使用mybatis拦截器来实现字段的自动填充,但是,很多都是将自动填充的逻辑写死在拦截方法中,没办法做到自定义。
比如说,我有一个实体,我要在插入或者更新的时候自动填充它的createTime和updateTime。那么好,我吭哧吭哧写了一个拦截器,里面告诉mybatis说我要填充createTime和updateTime。但是第二天,主管告诉我,createId和updateId也要能够自动填充,行,再往逻辑里加。
这样一来,问题就出现了,当有新的自动填充的需求的时候,我都需要去修改代码逻辑,而且还要兼顾原有的实体类。这样到了后期,代码会非常难维护和修改。

让自填字段配置化

在经历了以上的问题后,我们肯定会想,能不能够用配置文件来定义这些自填充字段,并且不会影响到没有这些字段的实体的插入和更新?
答案是肯定的。

话不多说,先上代码

@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
public class MybatisInsertAutoFillPlugin implements Interceptor {private String[] fields;private String[] values;private String[] expressions;@Overridepublic Object plugin(Object target) {return Interceptor.super.plugin(target);}@Overridepublic void setProperties(Properties properties) {this.fields = properties.stringPropertyNames().toArray(new String[0]);expressions = new String[fields.length];values = new String[fields.length];for (int i = 0; i < expressions.length; i++) {expressions[i] = properties.getProperty(fields[i]);values[i] = "?";}}@Overridepublic Object intercept(Invocation invocation) throws Throwable {MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];SqlCommandType commandType = mappedStatement.getSqlCommandType();if (commandType == SqlCommandType.INSERT) {Object p = invocation.getArgs()[1];SpelExpressionParser parser = new SpelExpressionParser();for (int i = 0; i < this.fields.length; i++) {ReflectUtil.setFieldValue(p, this.fields[i], parser.parseExpression(this.expressions[i]).getValue());}}return invocation.proceed();}
}

使用的时候,只需要在安装mybatis插件的时候定义我们要自填充的字段就可以了。
如下配置文件所示,我们在plugins标签中引入我们的自填充插件MybatisInsertAutoFillPlugin,然后在它下面的property中填写要填充的字段名和要填充的值。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--开启驼峰命名--><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><plugins><plugin interceptor="com.yahaha.cloud.core.plugin.MybatisPagePlugin"><property name="dialect" value="mysql"/></plugin><plugin interceptor="com.yahaha.cloud.core.plugin.MybatisInsertAutoFillPlugin"><property name="createTime" value="T(java.time.LocalDateTime).now()"/><property name="updateTime" value="T(java.time.LocalDateTime).now()"/></plugin><plugin interceptor="com.yahaha.cloud.core.plugin.MybatisUpdateAutoFillPlugin"><property name="updateTime" value="T(java.time.LocalDateTime).now()"/></plugin></plugins>
</configuration>

代码不长,也很容易懂。

1、读取自定义填充字段

首先就是 setProperties方法,这个方法就是用来读取配置文件中plugin下的property的,我们在这个方法里将填充字段名和它们的值表达式进行了存储,分别存到了fields数组和expressions数组中,至于values,是没有用的(懒得删了)。

2、解析表达式

重点就是intercept方法了,首先我们拿到mappedStatement对象,你可以把它认为是对mapper.xml文件中定义的sql语句的描述对象。
然后通过mappedStatement获取commandType,这个commandType就是表示你这条sql语句是什么类型的,如select、update、insert、delete。接下来我们用
if (commandType == SqlCommandType.INSERT)来判断这条sql是不是插入sql。
如果是,就创建一个SpelExpressionParser对象,这个对象是用来做什么的呢?看回xml配置文件,里面我们对createTime的值的定义并不是一个固定值,而是一个表达式,因为我们需要即时地计算当前的时间,而这个SpelExpressionParser对象就是用来解析这条表达式的。
此时我们的createTime就可以获得LocalDateTime.now()的返回值了。

3、填充字段值

我们拦截的是Executor的update方法,这个方法有两个传参,第一个就是mappedStatement,就是我们要执行的当前sql的描述对象,第二个就是这条sql语句的动态参数。
我们用Object p = invocation.getArgs()[1]来获取这个动态参数对象,然后用反射的方法填充其中字段的值,ReflectUtil是我自己写的一个反射工具类,如果有需要的话,可以通过这个链接去下载。
Java反射工具类
当然,使用一些第三方的反射工具类也是可以的。
最后调用proceed方法,完成我们的拦截任务。

【Mybatis系列】之插件—自动填充字段插件,再也不需要手动填写或者耦合业务了!相关推荐

  1. jquery插件---自动补全类插件

    jquery插件---自动补全类插件 (1)AutoComplete-JQuery jQuery插件易于集成到现在的表单中(Form). (2)Facebook like Autocomplete 基 ...

  2. MyBatis-Plus自动填充字段(创建时间、修改时间、uuid等)

    字段填充器 配置需要自动填充的字段,字段名采用驼峰命名规则 @Component public class MpMetaObjectHandler implements MetaObjectHandl ...

  3. vscode自动填充地址插件_VSCode插件制作:HTML代码自动填充

    Visual Studio Code不但跨平台,还有良好的扩展性.我们可以在Visual Studio Marketplace上找到各种各样的插件.这里分享下怎样制作一个简单的用于代码填充的插件. 自 ...

  4. vscode自动填充地址插件_制作VSCODE代码自动补全插件

    首先写在前面,我是看了VSCode插件制作:HTML代码自动填充这篇文章后,才基本了解这类vscode插件的编写和配置方法的,所以在文章开头特地声明一下. 首先在本地测试一下补全的信息 第一步,你需要 ...

  5. 谷歌浏览器信用卡自动填充字段

    记录一下谷歌信用卡自动填充: 谷歌浏览器 在https 的情况下 有信用卡的地方有存的话会有如下图示: 这情况要字段名字跟谷歌内置的对应,才能填充的上对应的字段内容: 文档地址: https://de ...

  6. 【mybatis系列】自定义实现拦截器插件Interceptor

    目录 类型 规则 介绍 intercept(Invocation invocation) plugin(Object target) setProperties(Properties properti ...

  7. 【keepass】利用keepassxc-browser浏览器扩展和keepassnatmsg插件实现密码自动填充(KeePassHttp-Connector/KeePassHttp)

    一.keepass密码管理工作流涉及的不同软件.插件.浏览器扩展 1.1 keepass的三个版本 keepass:只兼容win.插件生态更加完善. keepassX:更新缓慢,社区后来另行搞了一个k ...

  8. 设置字段默认值Java_小书MybatisPlus第9篇-常用字段默认值自动填充

    本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下: 一.填充字段处理 需求案例:在插入数据的时候自动填充createTime和updateTime为当前插入数据的时间,在数据更新的时 ...

  9. cad展点插件lisp使用_CAD自动画杆路插件Autolisp该怎么使用?

    本经验教你怎样使用CAD插件自动画杆路插件使用指南 Autolisp插件:点击下载 1.解压Autolisp插件至电脑D盘根目录下即可 2.打开AotoCAD,如下图: 3.输入命令:APPLOAD, ...

最新文章

  1. 360浏览器使用评价
  2. python处理windows弹窗_Python窗口IDE的基本处理,pythonwindowide
  3. 【学习笔记】第二章——进程的定义、组成、组织方式、特征、状态 转换
  4. 堂妹问的一道暑假作业题,难住985的家长
  5. matlab抓取股票数据,Matlab通过sina web接口获取个数即时股票数据函数实现代码
  6. SharePoint 2013创建WCF REST Service
  7. Python开发之用户密码存储
  8. 视频消除人声,适用于配音比赛等场合
  9. 前端花瓣飘落特效代码
  10. redis存储新闻列表_聊聊Redis使用场景
  11. 如果你学不好架构设计,那你一定没遇到沈剑!
  12. 报错:Parameter ‘XXX‘ implicitly has an ‘any‘ type.解决方法
  13. 开源社区Github在2022年06月09日公测了三个新的成就徽章
  14. OCR(光学字符识别)
  15. Freemarker导出复杂Excel图文教程
  16. org.mapstruct.Mapper
  17. 关于word的标题编号的修改(定义新的多级列表)
  18. YTU.2532: 投简历
  19. python脚本自动化盲注_python dvwa布尔盲注自动化脚本(level=low)
  20. Linux screen 常用命令(超好用)

热门文章

  1. 007 矩阵的秩定义、秩求法、秩的性质
  2. 步进电机的特点、选型方法以及型号参数说明
  3. 数字雨C++代码(转)
  4. Windows 词典软件
  5. QPainter::begin: Painter already active
  6. java和美利达公路车,可能是最详细的美利达公路车购买指南
  7. 去掉cajview阅读器右上角的图标方法
  8. 生产质量管理系统有哪些功能?
  9. 抖音实战~首页视频~下拉刷新
  10. 新的开始,持之以恒。