在进行持久层数据维护(新增或修改)的时候,我们通常需要记录一些非业务字段,比如:create_time、update_time、update_by、create_by等用来维护数据记录的创建时间、修改时间、修改人、创建人等信息。通常情况下我们需要对这些字段进行手动赋值。赋值的过程也比较冗余,都是重复操作。

  • 通常是为create_time赋值为系统的当前时间、update_time赋值为系统修改操作执行时的当前时间。
  • create_by(创建人)、update_by(修改人)赋值为当前的登录用户的用户名
xxxYyyZzz.setUpdateBy("zimug");    //数据记录更新操作人
xxxYyyZzz.setUpdateTime(new Date()); //数据记录更新操作的时间

Mybatis plus 为我们提供了一种一劳永逸的自动化赋值方式。

一、调整数据库表结构

以mysql数据库环境下的xxx_yyy_zzz表为例,在原有的表字段的基础上,添加下面的四个通用数据维护字段。

ALTER TABLE `xxx_yyy_zzz` ADD COLUMN `create_by` VARCHAR(64) NOT NULL COMMENT '本条记录创建人';
ALTER TABLE `xxx_yyy_zzz` ADD COLUMN `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '本条记录创建时间';
ALTER TABLE `xxx_yyy_zzz` ADD COLUMN `update_by` VARCHAR(64) NOT NULL COMMENT '本条记录修改人';
ALTER TABLE `xxx_yyy_zzz` ADD COLUMN `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '本条记录的修改时间';

二、通用维护信息父类-自动赋值的字段

既然我们对某一张表的数据进行新增创建、修改信息的维护,我们的实体类也要做必要的调整。为了避免为每一个实体类都加上这四个成员变量,我们定义一个父类BaseColumns。

@Data
public class BaseColumns { /**
* 本条记录创建人,insert操作的时候自动为该字段赋值
*/
@TableField(fill = FieldFill.INSERT
private String createBy; /**
* 本条记录创建时间,insert操作的时候自动为该字段赋值
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime; /**
* 本条记录更新人,insert或update操作的时候自动为该字段赋值,select = false
*/
@TableField(fill = FieldFill.INSERT_UPDATE,select = false)
private String updateBy; /**
* 本条记录更新时间,insert或update操作的时候自动为该字段赋值,select = false
*/
@TableField(fill = FieldFill.INSERT_UPDATE,select = false)
private LocalDateTime updateTime; }
  • fill = FieldFill.INSERT表示insert操作的时候自动为该字段赋值
  • fill = FieldFill.INSERT_UPDATE表示nsert或update操作的时候自动为该字段赋值
  • select = false表示在使用Mybatis Wrapper条件构造器进行查询的时候,不查询这个属性对应的数据库字段。数据修改时间操作人通常对于运维更有意义,所以通常不需要展示在web页面上,所以通常select查询的时候不包含它。(这个内容与我们本机的字段自动填充没有太直接的联系,但是在实际应用中是有意义的)

三、实体类的实现

下文实体类XxxYyyZzz对应数据库中的xxx_yyy_zzz表,除了以上四个通用字段,xxx_yyy_zzz表还包含其他的业务字段。

@Data
@EqualsAndHashCode(callSuper = true)
public class XxxYyyZzz extends BaseColumns { //其他的属性字段
}

四、自动赋值的规则

@Component
public class MybastisColumnsHandler implements MetaObjectHandler { @Resource
private JwtTokenUtil jwtTokenUtil; //我的工具类,用于从Token令牌中获取登陆人信息 //设置数据新增时候的,字段自动赋值规则
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, "createBy", String.class, jwtTokenUtil.getUsernameFromToken());
this.strictUpdateFill(metaObject, "updateBy", String.class, jwtTokenUtil.getUsernameFromToken());
} //设置数据修改update时候的,字段自动赋值规则
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateBy", String.class, jwtTokenUtil.getUsernameFromToken());
}
}
  • 在数据新增的时候,自动为createTime、updateTime、createBy、updateBy赋值,即数据初始化。
  • 在数据修改的时候,自动为updateTime、updateBy赋值。
  • JwtTokenUtil是我写的一个工具类,从当前的登录用户JWT Token中获取当前登录用户的用户名。(你的系统里面获取当前登录用户名方法和我的不一样,但总之可以获取到)

五、实现效果

比如在进行数据更新的时候,下面的这两行代码就不需要写了,由updateFill(MetaObject metaObject) 自动完成

//xxxYyyZzz.setUpdateBy("zimug");    //数据记录更新操作人
//xxxYyyZzz.setUpdateTime(new Date()); //数据记录更新操作的时间 xxxYyyZzzMapper.updateById(xxxYyyZzz);

同理,在数据insert操作的时候,insertFill(MetaObject metaObject)将被自动执行。

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

Mybatis plus通用字段自动填充的最佳实践总结的更多相关文章

  1. SpringBoot-Mybatis_Plus学习记录之公共字段自动填充

    一.应用场景 平时在建对象表的时候都会有最后修改时间,最后修改人这两个字段,对于这些大部分表都有的字段,每次在新增和修改的时候都要考虑到这几个字段有没有传进去,很麻烦.mybatisPlus有一个很好 ...

  2. mybatis plus 增删改自动填充字段值

    说明 本文实现以下需求效果 创建数据时自动填充 createUserId 和 createTime 更新数据时自动填充 updateUserId 和 updateTime(每次修改都自动填充新的 up ...

  3. 【mybatis-plus】主键id生成、字段自动填充

    一.主键id的生成 数据库表里通常都会有一个主键id,来作为这条数据的唯一标识. 常见的方式 数据库自动增长 这种很常见了,可以做到全库唯一.因为id是天然排序的,对于涉及到排序的操作会很方便. UU ...

  4. mybatis-plus时间字段自动填充

    时间代码自动填充的2种方式 数据库方式 将数据库字段create_time和update_time设置CURRENT_TIMESTAMP,create_time字段后面不需要勾选更新,update_t ...

  5. 【MyBatis深入剖析】应用分析与最佳实践(下)

    MyBatis编程式开发 MyBatis编程式开发步骤 MyBatis和MySQL Jar包依赖 全局配置文件mybatis-config.xml 映射器Mapper.xml Mapper接口 编程式 ...

  6. winform中的 datagriview 字段自动填充长度

    在winfrom 的 datagridview 中 绑定字段 经常回在最后面空出一部分来,显得不美观, 现在教大家如何让它自适应宽度 public static void Autogrid(DataG ...

  7. [Kubernetes]Pod字段自动填充

    PodPreset(Pod预设置)在Kubernetes v1.11以后出现,开发人员只需要提交一个基本的Pod YAML,Kubernetes就可以自动给对应的Pod对象加上运维人员设定好的其他必要 ...

  8. MybatisPlus字段自动填充配置

    实体类 @ApiModelProperty(value = "创建时间") @TableField(fill = FieldFill.INSERT) private Date gm ...

  9. 【MyBatis深入剖析】应用分析与最佳实践

    ##### 文章目标1. 了解ORM框架的发展历史,了解MyBatis特性2. 掌握MyBatis编程式开发方法和核心对象3. 掌握MyBatis核心配置含义4. 掌握MyBatis的高级用法与扩展方 ...

随机推荐

  1. "Date has wrong format. Use one of these formats instead: %, Y, -, %, m, -, %, d." DateField使用input_formats参数

    错误写法 : publish_date = serializers.DateField(format="%Y-%m-%d", input_formats="%Y-%m-% ...

  2. python绘制美丽花朵

    from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from matplotlib.ticker import Line ...

  3. IDEA控制台打印程序内汉字乱码及txt文本乱码

    控制台打印汉字乱码 解决IntelliJ IDEA控制台输出中文乱码问题 txt文本乱码 解决IDEA读取txt文本中显示的中文乱码问题

  4. 【C++】C++之类型转换

    作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14209848.html 目录 一.前言 二.static_cast 2.1 使用场景 2.2 实例 三.dyna ...

  5. 【kinetic】操作系统探索总结(八)键盘控制

    如果尝试过前面的例子,有没有感觉每次让机器人移动还要在终端里输入指令,这也太麻烦了,有没有办法通过键盘来控制机器人的移动呢?答案室当然的了.我研究了其他几个机器人键盘控制的代码,还是有所收获的,最后移 ...

  6. 在搜索引擎中输入汉字就可以解析到对应的域名,请问如何用LoadRunner进行测试。

    建立测试计划,确定测试标准和测试范围 设计典型场景的测试用例,覆盖常用业务流程和不常用的业务流程等 根据测试用例,开发自动测试脚本和场景: 录制测试脚本:新建一个脚本(Web/HTML协议):点 ...

  7. APACHE如何里一个站点绑定多个域名?用ServerAlias 转

    APACHE2如何里一个站点绑定多个域名?用ServerAlias以前很笨,要使多个域名指向同一站点总是这样写:<VirtualHost *:80>ServerAdmin i@kuigg. ...

  8. DB2在渗透中的应用(转载)

    原文地址:http://drops.wooyun.org/tips/16673 0x00 DB2简介 DB2是IBM公司推出关系型数据库管理系统. 现今DB2主要包含以下三个系列: DB2 for L ...

  9. MySQL中in('5,6,7')只取第一个id为5对应的数据的思考

    通过阅读本文你可以更好的理解两个知识点: 1.#{}与${}在实际项目中的使用,避免在项目中使用不当造成不可预知的Bug; 2.MySQL中in里面如果是字符串的话,为什么只取第一个对应的数据,eg: ...

  10. “500 oops socket” Debian 9 running via Linux Deploy上成功部署vsftpd的解决方案(201901原创)【成功完美简单极致】

    "500 oops socket" Debian 9 running via Linux Deploy上成功部署vsftpd的解决方案(201901原创)[成功完美简单极致] #自 ...