数据库公共字段自动填充
引言
很多项目的数据库表都会设置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字段传给后端之前手动赋了空值,自动填充就生效了;
总结
总的来说,公共字段自动填充还是很好用的,省去很多代码;当然需要牢记一点:一定要保证需要自动填充的字段为空,这样自动填充机制才生效
个人记录,如果有问题欢迎交流!
数据库公共字段自动填充相关推荐
- SpringBoot公共字段自动填充
大家好,我是小羽,今天做项目的时候遇到一个问题,每次添加数据时都要设置创建时间,创建人,修改时间,修改人等字段,实在是太繁琐了.那我能不能让他们添加这些字段的信息呢? 问题分析 创建时间,创建人,修改 ...
- MyBatisPlus-9-公共字段自动填充
公共字段自动填充 1.1 元数据处理器接口 com.baomidou.mybatisplus.mapper.MetaObjectHandlerinsertFill(MetaObject metaObj ...
- 配置公共字段全局填充createTime和updateTime
配置公共字段全局填充createTime和updateTime 一.创建公共表字段 1. 公共字段实体类 2.User实体类,继承公共实体类 二.未全局配置时操作接口测试 1.新增用户信息接口 2.启 ...
- 【MyBatis-Plus】实现字段自动填充功能
一.前言 在项目中,我们有一些公共的字段需要做修改 如: gmt_create:创建时间 creator_id:创建人 gmt_modified:修改时间 modifier_id:修改人 这时候我们可 ...
- mpp新增一个字段_mybatisplus使用@InsertFill和@UpdateFill注解设置自定义sql对字段自动填充...
自动填充优化功能 原生mybatisplus只能做%s+1和now两种填充,mybatisplus-plus在插入或更新时对指定字段进行自定义复杂sql填充. 需要在实体类字段上用原生注解@Table ...
- MyBatisPlus中使用 @TableField完成字段自动填充
场景 官方文档: 字段注解 @TableField com.baomidou.mybatisplus.annotations.TableField 值 描述 value 字段值(驼峰命名方式,该值可无 ...
- MySQL实现字段自动填充功能
根据阿里巴巴开发手册,有这么一句话:所有的数据库表当中必须有gmt_create.gmt_modified,几乎所有的表都要配置上!而且需要自动化!!! 对于创建时间.修改时间这些字段,我们是希望在添 ...
- jquery autocomplete实现solr查询字段自动填充并执行查询
2019独角兽企业重金招聘Python工程师标准>>> 页面引入三个JS: <script type="text/javascript" src=" ...
- NextErp 数据导入 文档字段自动填充上下文代码分析
目录 业务场景 前端发起开始导入数据时向后端发起请求信息 后端代码解析 系统背景 NextErp系统是一套低代码的开发平台,使使用人员重注重与业务,但在一个现实业务场景中免不了进行定制与开发,做为开发 ...
最新文章
- 选择查询 mysql_具体的mysql选择查询
- C++对C的加强之C++中所有的变量和函数都必须有类型
- 程序员面试100题之八:不要被阶乘吓倒(二进制表示中最低位1的位置 )
- ci框架的session类,怎么使用ci的session类
- Angular应用bootstrap时的version检测机制
- python初学者编程指南_动态编程初学者指南
- IO多路转接模型-----epoll
- 普中51控制火焰传感器_汽车爆震传感器的工作原理及的检测方法、处理
- 如何更改Inactive object的ownership
- Android 系统(275)---Mtk Webview基本问题
- SaaS应用“正益工作”发布,为大中型企业轻松构建移动门户
- 简简单单认识call,apply,bind方法
- 【移动端】企业微信移动app测试实战
- canal使用过程中的报错
- 细数网易云音乐上那些适合开车时听的歌单。
- 英语议论文万能模板范文 英语作文范文欣赏
- 解决中文名单按拼音排序的问题
- 高鸿业微观经济学第7版笔记和课后习题答案
- SpringBoot Mybatis注解调用Mysql存储过程并接收多个OUT结果集(多个mode=IN和mode=OUT参数)
- cfa三级真题和mock_cfa mock和真题哪个难(cfa mock和真题差别)