引言

很多项目的数据库表都会设置create_time、update_time等公共字段,这些公共字段都是在数据库创建或更新时需要设置值;如果自己设置还需要额外写set代码,一旦这样的表多了之后就很麻烦;所以我们可以想办法让这些字段可以自动填充;而mybatis-plus正好提供了这样的功能;

mysql中可以通过设置字段默认值CURRENT_TIMESTAMP实现每次插入数据添加当前时间,更新可以设置on update CURRENT_TIMESTAMP实现更新操作更新该时间:

但是我并不是特别推荐这种方法,如果让数据库完成这些逻辑操作职责就不太明确,并且不利于他人从代码中理解;

下面演示一下如何使用mybatis-plus实现公共字段自动填充

代码操作

首先需要创建一个填充数据处理器,实现MetaObjectHandler

/*** mybatis-plus提供的属性自动填充功能*/
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {// 插入数据自动填充@Overridepublic void insertFill(MetaObject metaObject) {log.info("新增数据自动填充...");this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());this.strictInsertFill(metaObject, "createTime", Date.class, new Date());}// 更新数据自动填充@Overridepublic void updateFill(MetaObject metaObject) {log.info("更新数据自动填充...");this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());}
}

该处理器需要交给Sping管理,加上@Component注解;

有时会有createUser什么的字段,灵活添加即可:

这一步完成后,接下来只需要在公共填充的字段上加上 @TableField 注解:

@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

主要就是@TableField注解的fill属性

  • INSERT插入时填充
  • UPDATE更新时填充
  • INSERT_UPDATE更新和插入时都填充
  • DEFAULT默认情况,什么都不填充

这样自动填充就设置好了,可以测试一下:

新增数据

更新数据

数据库中create_time和update_time也都有了对应值:

这样整体的自动填充操作即配置就完成了;

踩坑日记:自动填充原理

这次写项目中遇到了一个问题:更新操作update时自动填充没有生效;

经过排查发现前端传来更新的数据时update_time字段已经存在一个时间值(这个值是我从数据库中查出来的);

所以我猜测如果需要自动填充的字段已经存在值的话,那么自动填充机制就不会再给该字段填充值


因为自动填充生效和strictUpdateFill()方法有关系(以更新为例),所以就debug了一下它的源码:

首先不论填充自动是否存在数值都会进入该方法:

然后进入该方法:

然后通过了一番来回调用(可以自己尝试看看,不重要就不展示了),来到了如下方法:

这个方法就可以看出来自动填充的策略了:只有公共填充字段为空时才会自动填充;简单解释一下关键代码:

  • fieldName:公共填充字段名
  • fieldVal:生成的公共填充字段值
if (metaObject.getValue(fieldName) == null) { // 判断公共填充字段的值是否为空,如果为空才自动填充,不为空直接结束Object obj = fieldVal.get(); // 获取自动生成的填充值if (Objects.nonNull(obj)) { // 判断填充值是否为空metaObject.setValue(fieldName, obj); // 将填充值赋给该字段,实现了公共字段自动填充}
}

当然后面还有一些步骤,这里只是把关键一步列了出来;


然后我在前端把update_time字段传给后端之前手动赋了空值,自动填充就生效了;

总结

总的来说,公共字段自动填充还是很好用的,省去很多代码;当然需要牢记一点:一定要保证需要自动填充的字段为空,这样自动填充机制才生效

个人记录,如果有问题欢迎交流!

数据库公共字段自动填充相关推荐

  1. SpringBoot公共字段自动填充

    大家好,我是小羽,今天做项目的时候遇到一个问题,每次添加数据时都要设置创建时间,创建人,修改时间,修改人等字段,实在是太繁琐了.那我能不能让他们添加这些字段的信息呢? 问题分析 创建时间,创建人,修改 ...

  2. MyBatisPlus-9-公共字段自动填充

    公共字段自动填充 1.1 元数据处理器接口 com.baomidou.mybatisplus.mapper.MetaObjectHandlerinsertFill(MetaObject metaObj ...

  3. 配置公共字段全局填充createTime和updateTime

    配置公共字段全局填充createTime和updateTime 一.创建公共表字段 1. 公共字段实体类 2.User实体类,继承公共实体类 二.未全局配置时操作接口测试 1.新增用户信息接口 2.启 ...

  4. 【MyBatis-Plus】实现字段自动填充功能

    一.前言 在项目中,我们有一些公共的字段需要做修改 如: gmt_create:创建时间 creator_id:创建人 gmt_modified:修改时间 modifier_id:修改人 这时候我们可 ...

  5. mpp新增一个字段_mybatisplus使用@InsertFill和@UpdateFill注解设置自定义sql对字段自动填充...

    自动填充优化功能 原生mybatisplus只能做%s+1和now两种填充,mybatisplus-plus在插入或更新时对指定字段进行自定义复杂sql填充. 需要在实体类字段上用原生注解@Table ...

  6. MyBatisPlus中使用 @TableField完成字段自动填充

    场景 官方文档: 字段注解 @TableField com.baomidou.mybatisplus.annotations.TableField 值 描述 value 字段值(驼峰命名方式,该值可无 ...

  7. MySQL实现字段自动填充功能

    根据阿里巴巴开发手册,有这么一句话:所有的数据库表当中必须有gmt_create.gmt_modified,几乎所有的表都要配置上!而且需要自动化!!! 对于创建时间.修改时间这些字段,我们是希望在添 ...

  8. jquery autocomplete实现solr查询字段自动填充并执行查询

    2019独角兽企业重金招聘Python工程师标准>>> 页面引入三个JS: <script type="text/javascript" src=" ...

  9. NextErp 数据导入 文档字段自动填充上下文代码分析

    目录 业务场景 前端发起开始导入数据时向后端发起请求信息 后端代码解析 系统背景 NextErp系统是一套低代码的开发平台,使使用人员重注重与业务,但在一个现实业务场景中免不了进行定制与开发,做为开发 ...

最新文章

  1. 选择查询 mysql_具体的mysql选择查询
  2. C++对C的加强之C++中所有的变量和函数都必须有类型
  3. 程序员面试100题之八:不要被阶乘吓倒(二进制表示中最低位1的位置 )
  4. ci框架的session类,怎么使用ci的session类
  5. Angular应用bootstrap时的version检测机制
  6. python初学者编程指南_动态编程初学者指南
  7. IO多路转接模型-----epoll
  8. 普中51控制火焰传感器_汽车爆震传感器的工作原理及的检测方法、处理
  9. 如何更改Inactive object的ownership
  10. Android 系统(275)---Mtk Webview基本问题
  11. SaaS应用“正益工作”发布,为大中型企业轻松构建移动门户
  12. 简简单单认识call,apply,bind方法
  13. 【移动端】企业微信移动app测试实战
  14. canal使用过程中的报错
  15. 细数网易云音乐上那些适合开车时听的歌单。
  16. 英语议论文万能模板范文 英语作文范文欣赏
  17. 解决中文名单按拼音排序的问题
  18. 高鸿业微观经济学第7版笔记和课后习题答案
  19. SpringBoot Mybatis注解调用Mysql存储过程并接收多个OUT结果集(多个mode=IN和mode=OUT参数)
  20. cfa三级真题和mock_cfa mock和真题哪个难(cfa mock和真题差别)

热门文章

  1. 抽象类和接口的小程序
  2. 传输线方程与终端加载的无损耗传输线
  3. POJ 3126 Prime Path(BFS + 素数打表)
  4. 【Java基础】Java开发环境搭建并编写第一个入门程序HelloWorld
  5. 微信语音保存到本地服务器,文件格式由amr转mp3
  6. Sublime Text3轻量型跨平台C/C++开发环境(上) 安装使用篇
  7. 十大超极本:联想U系列上榜
  8. 【C语言练习——打印空心上三角及其变形】
  9. 浏览器网页 自动转格式化显示json数据
  10. Altium Designer的PCB无法显示Designator