我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mybatis-plus 统一管理创建时间、更新时间、创建人与更新人

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mybatis-plus 统一管理创建时间、更新时间、创建人与更新人

mybatis-plus 统一管理创建时间、更新时间、创建人与更新人

前言

在设计数据库模型的时候,我们通常会在表中创建创建人、创建时间、更新人、更新时间等通用的字段来记录每行数据的创建和变动信息。例如:

create table table_demo(    id            bigint auto_increment comment '菜单ID'        primary key,   //.... 其它业务表字段    creator       varchar(64)  default ''                null comment '创建者',    create_time   datetime     default CURRENT_TIMESTAMP not null comment '创建时间',    updater       varchar(64)  default ''                null comment '更新者',    update_time   datetime     default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',    deleted       bit          default b'0'              not null comment '是否删除')    comment 'XXX表' collate = utf8mb4_unicode_ci;

一个系统涉及的模型往往有很多个,每个业务都会有各自对应的逻辑处理,如果在每个表对应的模块都要在各自的业务代码中来维护这些共同的数据,着实浪费!

那么就将这些可以字段抽取出来统一管理!

一、数据库模型设计时抽出所有通用字段

在设计数据库时,定义表的规范,例如:
每个表都要添加以下的字段信息:

create table table_demo(    id            bigint auto_increment comment '菜单ID'        primary key,   //.... 其它业务表字段    creator       varchar(64)  default ''                null comment '创建者',    create_time   datetime     default CURRENT_TIMESTAMP not null comment '创建时间',    updater       varchar(64)  default ''                null comment '更新者',    update_time   datetime     default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',    deleted       bit          default b'0'              not null comment '是否删除')    comment 'XXX表' collate = utf8mb4_unicode_ci;

后期业务迭代添加新表也要遵守以上的表规则

二、JAVA模型抽象为父类

@Datapublic abstract class BaseEntity implements Serializable {        @TableField(fill = FieldFill.INSERT)    private Date createTime;        @TableField(fill = FieldFill.INSERT_UPDATE)    private Date updateTime;        @TableField(fill = FieldFill.INSERT)    private String creator;        @TableField(fill = FieldFill.INSERT_UPDATE)    private String updater;        @TableLogic    private Boolean deleted;}

从上面的基础模型类可以看到以下几个注解:
@TableLogic
框架提供的逻辑删除注解。
配合以下配置一起使用:
mybatis-plus.configuration.global-config.db-config.logic-delete-value=1 ##字段值为1时 表示逻辑删除
mybatis-plus.configuration.global-config.db-config.logic-delete-value=0 ##字段值为0时 表示未删除
当字段添加上@TableLogic后 框架在生成sql模板时 自动在后面添加上逻辑删除字段=0(配置文件中的配置) 的查询条件

@TableField
该注解用于标识非主键的字段。
存在多个属性,各个属性的用法如下:
value :指定映射的数据库字段名
el:映射为原生 #{ … } 逻辑,相当于写在 xml 里的 #{ … } 部分。
exist:是否为数据库表字段,默认为 true。
condition:字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s}。
update:字段 update set 部分注入,例如:update=“%s+1”:表示更新时会 set version=version+1(该属性优先级高于 el 属性)。
fill:字段自动填充策略,默认为 FieldFill.DEFAULT。
… 其他的自己去官网看…

本文主要用到 fill的自动填充策略

填充策略如下,mybatis-plus的源码注释写的很清楚

package com.baomidou.mybatisplus.annotation;public enum FieldFill {        DEFAULT,        INSERT,        UPDATE,        INSERT_UPDATE}

以上我们在基础模型中,设置如下:
创建时间:插入时填充字段(这个其实也可以用mysql的default来管理)
创建人:插入时填充字段
更新时间:插入和更新时填充字段(这个其实也可以用mysql的default + on update 来管理)
更新人:插入和更新时填充字段

三、JAVA所有业务实体继承该基础模型

@TableName(value = "对应的表名称", autoResultMap = true)@Data@EqualsAndHashCode(callSuper = true)@Builder@NoArgsConstructor@AllArgsConstructorpublic class MyTableEntity extends BaseEntity {        @TableId    private Long id;        private String username;        private String password;     // ... 其他对应的字段属性}

四、自定义实现MetaObjectHandler元对象字段填充控制器抽象类,实现公共字段自动写入

public class DefaultDBFieldHandler implements MetaObjectHandler {    @Override    public void insertFill(MetaObject metaObject) {        if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) {            BaseDO baseDO = (BaseDO) metaObject.getOriginalObject();            Date current = new Date();            // 创建时间为空,则以当前时间为插入时间            if (Objects.isNull(baseDO.getCreateTime())) {                baseDO.setCreateTime(current);            }            // 更新时间为空,则以当前时间为更新时间            if (Objects.isNull(baseDO.getUpdateTime())) {                baseDO.setUpdateTime(current);            }                        String userId = ..... 这里自定义实现逻辑,获取当前登录用户                        // 当前登录用户不为空,创建人为空,则当前登录用户为创建人            if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) {                baseDO.setCreator(userId.toString());            }            // 当前登录用户不为空,更新人为空,则当前登录用户为更新人            if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) {                baseDO.setUpdater(userId.toString());            }        }    }    @Override    public void updateFill(MetaObject metaObject) {        // 更新时间为空,则以当前时间为更新时间        Object modifyTime = getFieldValByName("updateTime", metaObject);        if (Objects.isNull(modifyTime)) {            setFieldValByName("updateTime", new Date(), metaObject);        }        // 当前登录用户不为空,更新人为空,则当前登录用户为更新人        Object modifier = getFieldValByName("updater", metaObject);                String userId = ..... 这里自定义实现逻辑,获取当前登录用户                if (Objects.nonNull(userId) && Objects.isNull(modifier)) {            setFieldValByName("updater", userId.toString(), metaObject);        }    }}

结束语

很简单,以上就管理起来了 !

来源地址:https://blog.csdn.net/zhangsuhua0702/article/details/126894217

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mybatis-plus 统一管理创建时间、更新时间、创建人与更新人

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mybatis-plus 自动填充创建时间/更新时间

方式一:数据库级别 创建时间create_time字段设置类型为timestamp,默认值为CURRENT_TIMESTAMP; 更新时间update_time字段设置类型为timestamp,默认值为CURRENT_TIMESTAMP,勾
2023-08-17

java实现mysql自动更新创建时间与更新时间的两种方式

Java实现MySQL自动更新创建时间与更新时间的两种方式:第一种方式:使用注解(@CreationTimestamp和@UpdateTimestamp)使用JPA框架,在实体类字段上添加注解。JPA框架自动更新创建时间和更新时间。第二种方式:使用JDBC在插入或更新语句中手动设置字段。数据库触发器或默认值自动更新时间。比较:依赖:第一种依赖JPA,第二种依赖JDBC。方便性:第一种更方便。性能:第二种稍快。触发器:第一种不需要,第二种需要(如果使用触发器)。兼容性:第一种仅适用于JPA,第二种更广泛兼容
java实现mysql自动更新创建时间与更新时间的两种方式
2024-04-02

MySQL中创建时间和更新时间的自动更新的实现示例

目录一、需求二、方案创建时间(创建日期)、修改时间(修改日期)设置为自动生成创建日期的自动生成更新日期的自动生成一、需求当新增记录的时候,mysql自动将系统的当前时间 set 到创建时间和更新时间这两个字段中。当更新记录的时候,MyS
2022-07-14

MySQL8如何设置自动创建时间和自动更新时间

这篇文章主要介绍“MySQL8如何设置自动创建时间和自动更新时间”,在日常操作中,相信很多人在MySQL8如何设置自动创建时间和自动更新时间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL8如何设置自
2023-07-05

mysql中很多表都设计由记录创建时间和更新时间

mysql中很多表都设计由记录创建时间和更新时间 ALTER TABLE `user`MODIFY COLUMN create_time datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间"; ALTER
mysql中很多表都设计由记录创建时间和更新时间
2015-01-29

MySQL8设置自动创建时间和自动更新时间的实现方法

目录业务场景:功能实现:DDL 脚本语法:1、新增字段create_time语法2、修改字段create_time语法3、新增字段update_time 语法4、修改字段update_time 语法总结业务场景:1、在数据库表中的数据,要
2023-03-09

我是否需要额外往返 firestore 来读取创建和更新的时间戳字段?

在使用Firestore时,你可能会疑惑是否需要额外的往返操作来读取创建和更新的时间戳字段。答案是不需要。Firestore会自动为每个文档提供创建和更新时间戳,你可以通过引用这些字段来获取相应的时间信息。这样,你就不需要额外的操作来读取时
我是否需要额外往返 firestore 来读取创建和更新的时间戳字段?
2024-02-11

编程热搜

目录