mybatis plus 公共字段自动填充createBy updateBy

一、公共字段自动填充

需求:好多表公共的字段,赋值逻辑也相同,不用每次为其赋值,‘拦截器’统一赋值。

1. 在新增数据时,需要设置创建时间、创建人、修改时间、修改人等字段,在编辑数据时需要设置修改时间、修改人等字段。这些字段属于公共字段,也就是在我们的系统中很多表中都会有这些字段,如下:

在这里插入图片描述
而针对于这些字段,我们的赋值方式为:

A. 在新增数据时, 将createTime、updateTime 设置为当前时间, createUser、updateUser设置为当前登录用户ID。

B. 在更新数据时, 将updateTime 设置为当前时间, updateUser设置为当前登录用户ID。

2. 我们使用Mybatis Plus提供的公共字段自动填充功能。

2.1 实现步骤:
    1. 在实体类的属性上加入@TableField注解,指定自动填充的策略。
    1. 按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口。
2.2 代码实现

1). 实体类的属性上加入@TableField注解,指定自动填充的策略。

抽取公共基础实体类,在公共字段属性上, 加上注解, 指定填充策略 @TableField(fill=insert/update)

@Data
public class BaseEntity implements Serializable {private static final long serialVersionUID = 1L;/*** 搜索值*/@JsonIgnore@TableField(exist = false)private String searchValue;/*** 创建者*/@TableField(fill = FieldFill.INSERT)private String createBy;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private Date createTime;/*** 更新者*/@TableField(fill = FieldFill.INSERT_UPDATE)private String updateBy;/*** 更新时间*/@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;/*** 请求参数*/@JsonInclude(JsonInclude.Include.NON_EMPTY)@TableField(exist = false)private Map<String, Object> params = new HashMap<>();}
FieldFill.INSERT: 插入时填充该属性值FieldFill.INSERT_UPDATE: 插入/更新时填充该属性值

2). 按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口。

com.ltkj.framework.handler;
/*** 自定义元数据对象处理器* 用于insert或update sql语句时 自动填充公共字段值*/
@Slf4j
public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {log.info("公共字段自动填充[insert]...param: {}", metaObject);try {if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();Date current = ObjectUtil.isNotNull(baseEntity.getCreateTime())? baseEntity.getCreateTime() : new Date();baseEntity.setCreateTime(current);baseEntity.setUpdateTime(current);String username = StringUtils.isNotBlank(baseEntity.getCreateBy())? baseEntity.getCreateBy() : getLoginUsername();// 当前已登录 且 创建人为空 则填充baseEntity.setCreateBy(username);// 当前已登录 且 更新人为空 则填充baseEntity.setUpdateBy(username);}} catch (Exception e) {throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);}}@Overridepublic void updateFill(MetaObject metaObject) {log.info("公共字段自动填充[update]...param: {}", metaObject);try {if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();Date current = new Date();// 更新时间填充(不管为不为空)baseEntity.setUpdateTime(current);String username = getLoginUsername();// 当前已登录 更新人填充(不管为不为空)if (StringUtils.isNotBlank(username)) {baseEntity.setUpdateBy(username);}}} catch (Exception e) {throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);}}/*** 获取登录用户名*/private String getLoginUsername() {LoginUser loginUser;try {loginUser = LoginHelper.getLoginUser();} catch (Exception e) {log.warn("自动注入警告 => 用户未登录");return null;}return loginUser.getUsername();}}

然后,我们启动项目,在员工管理模块中,测试增加/更新员工信息功能,然后通过debug 或者 直接查询数据库数据变更的形式,看看我们在新增/修改数据时,这些公共字段数据是否能够完成自动填充。

测试可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283534.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见光模块的封装

光模块的封装&#xff0c;保障了光通信的稳定和可靠性。本文介绍几种常见的光模块的封装类型。 19封装–焊接型光模块&#xff0c;一般速度不高于千兆&#xff0c;多采用SC接口。 SFP封装&#xff1a;SFP&#xff08;Small form-factor pluggable&#xff09;意思是小型可拔插式…

2023NEFU实习项目解析 - 中俄贸易供需服务平台

文章目录 项目概述项目初始化搭建项目初始框架配置Tomcat建立项目数据库编写统一返回类及其工具类编写数据库工具类通过Filter解决Response返回中文乱码问题使用Filter解决权限校验问题 项目主干开发用户登录企业管理&#xff08;分页查询原生实现&#xff09;上传VIP申请书模板…

鸿蒙 Ark ui 实战登录界面请求网络实现教程

团队介绍 作者&#xff1a;徐庆 团队&#xff1a;坚果派 公众号&#xff1a;“大前端之旅” 润开鸿生态技术专家&#xff0c;华为HDE&#xff0c;CSDN博客专家&#xff0c;CSDN超级个体&#xff0c;CSDN特邀嘉宾&#xff0c;InfoQ签约作者&#xff0c;OpenHarmony布道师&…

2023/12/15 work

1. tcp 客户端、服务端通讯 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <myhead.h>#define SERVICE_PORT 9994 #define SERVICE_IP "192.168.0.106"int main(int argc, const char *argv[]) {//服务端//1. 创建…

LangChain 28 BabyAGI编写旧金山的天气预报

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

verilog基础语法-计数器

概述&#xff1a; 计数器是FPGA开发中最常用的电路&#xff0c;列如通讯中记录时钟个数&#xff0c;跑马灯中时间记录&#xff0c;存储器中地址的控制等等。本节给出向上计数器&#xff0c;上下计数器以及双向计数器案例。 内容 1. 向上计数器 2.向下计数器 3.向上向下计数…

《数据结构、算法与应用C++语言描述》-机器调度-最长处理时间(LPT)-堆应用

机器调度 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_28LongestProcessingTime 问题描述 一个工厂具有 m台一模一样的机器。我们有n 个任务需要处理。设作业i的处理时间为 t i t_i ti​&#xff0c;这个时间包括把作业放入机器…

【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(上篇)

深入探索Logback日志框架的原理分析和开发实战指南系列 Logback日志框架Logback基本模块logback-corelogback-classiclogback-accessLogback的核心类LoggerAppenderLayoutLayout和Appender filterlogback模块和核心所属关系 Logbackj日志级别日志输出级别日志级别介绍 Logback的…

【数据结构】树状数组总结

知识概览 树状数组有两个作用&#xff1a; 快速求前缀和 时间复杂度O(log(n))修改某一个数 时间复杂度O(log(n)) 例题展示 1. 单点修改&#xff0c;区间查询 题目链接 活动 - AcWing本活动组织刷《算法竞赛进阶指南》&#xff0c;系统学习各种编程算法。主要面向…

如何使用JavaScript 将数据网格绑定到 GraphQL 服务

前言 作为一名前端开发人员&#xff0c;GraphQL对于我们来说是令人难以置信的好用。它可以用来简化数据访问&#xff0c;这让我们的工作变得更加容易。 什么是 GraphQL&#xff1f;它是一个抽象层&#xff0c;位于任意数量的数据源之上&#xff0c;并为您提供一个简单的 API …

为什么选择计算机?大数据时代学习计算机的价值探讨

还记得当初自己为什么选择计算机? 计算机是在90年代兴起的专业,那时候的年轻人有驾照、懂外语、懂计算机是很时髦的事情! 当初你问我为什么选择计算机,我笑着回答:“因为我梦想成为神奇的码农!我想像编织魔法一样编写程序,创造出炫酷的虚拟世界!”谁知道,我刚入门的…

UE5 第三人称游戏模板白屏问题

文章目录 问题背景问题解决解决方法一解决方法二解决方法三解决方法四 问题背景 在虚幻引擎5创建第三人称游戏模板时&#xff0c;打开场景显示白屏&#xff0c;物体可以点击选中&#xff0c;出现类似这种问题&#xff0c;考虑是曝光的原因&#xff0c;在确定引擎没有问题的情况…