iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mybatis-plus 统一管理创建时间、更新时间、创建人与更新人
  • 611
分享到

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

mybatisjavamysql 2023-09-11 20:09:04 611人浏览 安东尼
摘要

mybatis-plus 统一管理创建时间、更新时间、创建人与更新人 前言一、数据库模型设计时抽出所有通用字段二、JAVA模型抽象为父类三、JAVA所有业务实体继承该基础模型四、自定义实现Me

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

您可能感兴趣的文档:

--结束END--

本文标题: mybatis-plus 统一管理创建时间、更新时间、创建人与更新人

本文链接: https://www.lsjlt.com/news/403698.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • sql中外码怎么设置
    sql 中外码设置步骤:确定父表和子表。在子表中创建外码列,引用父表主键。使用 foreign key 约束将外码列链接到父表主键。指定引用动作,以处理父表数据更改时的子表数据操作。 ...
    99+
    2024-05-15
  • sql中having是什么
    having 子句用于过滤分组结果,应用于分组后的数据集。它与 where 子句类似,但基于分组结果而不是原始数据。用法:1. 过滤分组后的聚合值。2. 根据分组后的...
    99+
    2024-05-15
  • 在sql中空值用什么表示
    在 sql 中,空值表示未知或不存在的值,可使用 null、空字符串或特殊值表示。处理空值的方法包括使用操作符(is null/is not null)、coalesce 函数(返回第一...
    99+
    2024-05-15
    oracle
  • sql中number什么意思
    sql 中的 number 类型用于存储数值数据,包括小数和整数,特别适合货币、度量和科学数据。其精度由 scale(小数点位数)和 precision(整数字段和小数字段总位数)决定。...
    99+
    2024-05-15
  • sql中空值赋值为0怎么写
    可以通过使用 coalesce() 函数将 sql 中的空值替换为指定值(如 0)。coalesce() 的语法为 coalesce(expression, replacement),其...
    99+
    2024-05-15
  • sql中revoke语句的功能
    revoke 语句用于撤销指定用户或角色的权限或角色成员资格。可撤销的权限包括 select、insert、update、delete 等,撤销的对象类型包括表、视图、存储过程...
    99+
    2024-05-15
    敏感数据
  • sql中REVOKE是什么意思
    revoke 是 sql 中用于撤销用户或角色对数据库对象权限的命令。它通过撤销权限类型、对象级别和目标权限来实现:权限类型:撤销 select、insert、update、d...
    99+
    2024-05-15
  • sql中sp是什么意思
    sql中的sp是存储过程的缩写,它是一种预编译的、已命名的sql语句块,存储在数据库中,可以被用户通过简单命令调用。存储过程的特点有:可重用性、模块化、性能优化、安全性、事务支持。存储过...
    99+
    2024-05-15
    敏感数据
  • sql中references是什么意思
    sql 中的 references 关键字用于在外键约束中定义表之间的父-子关系。外键约束确保子表中的行都引用父表中存在的行,从而维护数据完整性。references 语法的格式为:fo...
    99+
    2024-05-15
  • sql中判断字段为空怎么写
    sql 中可通过 4 种方法判断字段是否为空:1)is null 运算符;2)is not null 运算符;3)coalesce() 函数;4)case 语句。例如,查询所有 colu...
    99+
    2024-05-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作