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.mzph.cn/news/230123.shtml

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

相关文章

FL Studio21.2.2963水果音乐软件安装

FL Studio是功能强大的音乐制作解决方案&#xff0c;使用旨在为用户提供一个友好完整的音乐创建环境&#xff0c;让您能够轻松创建、管理、编辑、混合具有专业品质的音乐&#xff0c;一切的一切都集中在一个软件中&#xff0c;只要您想&#xff0c;只要您需要&#xff0c;它总能…

深兰科技入选财联社“2023科创好公司”榜单

12月13日&#xff0c;“2023科创好公司”评选榜单正式公布&#xff0c;深兰科技成功入选&#xff0c;获得该榜单中“新能源汽车及自动驾驶”赛道的“科创好公司”称号。 “科创好公司”榜评选是由财联社及《科创板日报》联合打造的一级市场投后服务体系中的重要活动项目&#x…

Axure 9基本元件,表单及表格元件简介,表单案例

目录 一.基本元件 1.元件基本介绍 2.基本元件的使用 二.表单及表格元件 三.表单案例 四.简单简历绘制 一.基本元件 1.元件基本介绍 概述 - 在Axure RP中&#xff0c;元件是**构建原型图的基础模块**。 将元件从元件库里拖拽到画布中&#xff0c;即可添加元件到你的原型…

什么店生意好?C++采集美团商家信息做数据分析

最近遇到几个朋友&#xff0c;想要一起合伙投资一个实体店&#xff0c;不问类型&#xff0c;就看哪类产品相对比较受欢迎。抛除地址位置&#xff0c;租金的影响&#xff0c;我们之谈产品。因此&#xff0c;我熬了几个通宵&#xff0c;写了这么一段爬取美团商家商品信息的数据并…

如何在 Windows 10/11 上恢复永久删除的文件夹

如果您曾经错误地删除过某个文件夹&#xff0c;您就会知道随之而来的恐慌。您认为当您在某些内容上单击“删除”时&#xff0c;它就会永远消失。但情况并非总是如此。您可以使用几种不同的方法来恢复已删除的文件夹 。 本指南将向您展示如何在 Windows 10/11 上恢复永久删除的…

Axure RP - 交互设计的强大引擎

目录 前言 1. 交互设计&#xff1a;连接用户与产品的纽带 2. 情景设计&#xff1a;预测用户行为的未来 3. 演示和共享&#xff1a;让设计活起来 我的其他博客 前言 在数字化时代&#xff0c;用户体验的重要性日益突显&#xff0c;而交互设计成为塑造产品与用户互动的关键。…

colmap三维重建核心逻辑梳理

colmap三维重建核心逻辑梳理 1. 算法流程束流2. 初始化3. 重建主流程 1. 算法流程束流 重建核心逻辑见 incremental_mapper.cc 中 IncrementMapperController 中 Reconstruct 初始化变量和对象判断是否有初始重建模型&#xff0c;若有&#xff0c;则获取初始重建模型数量&am…

基于Python实现的一个书法字体风格识别器源码,通过输入图片,识别出图片中的书法字体风格,采用Tkinter实现GUI界面

项目描述 本项目是一个书法字体风格识别器&#xff0c;通过输入图片&#xff0c;识别出图片中的书法字体风格。项目包含以下文件&#xff1a; 0_setting.yaml&#xff1a;配置文件&#xff0c;包含书法字体风格列表、图片调整大小的目标尺寸等设置。1_Xy.py&#xff1a;预处理…

SourceTree 免登录跳过初始设置

用于Windows和Mac的免费Git客户端。 Sourcetree简化了如何与Git存储库进行交互&#xff0c;这样您就可以集中精力编写代码。通过Sourcetree的简单Git GUI可视化和管理存储库。 SourceTree 安装之后需要使用账号登陆以授权&#xff0c;以前是可以不登陆的&#xff0c;但是现在是…

neuq-acm预备队训练week 10 P1129 [ZJOI2007] 矩阵游戏

题目描述 小 Q 是一个非常聪明的孩子&#xff0c;除了国际象棋&#xff0c;他还很喜欢玩一个电脑益智游戏――矩阵游戏。矩阵游戏在一个 nn 黑白方阵进行&#xff08;如同国际象棋一般&#xff0c;只是颜色是随意的&#xff09;。每次可以对该矩阵进行两种操作&#xff1a; 行…

为什么在Android中需要Context?

介绍 在Android开发中&#xff0c;Context是一个非常重要的概念&#xff0c;但是很多开发者可能并不清楚它的真正含义以及为什么需要使用它。本文将详细介绍Context的概念&#xff0c;并解释为什么在Android应用中需要使用它。 Context的来源 Context的概念来源于Android框架…

Win32程序与MFC程序构建顺序梳理

Windows程序的生成顺序 Windows窗口的生命周期 初始化操作 从WinMain函数开始&#xff0c;注册窗口&#xff1b;创建窗口&#xff1b; 调用CreateWindow,为程序建立了一个窗口&#xff0c;作为程序的屏幕 舞台。CreateWindow产生窗口之后会送出WM_CREATE消息给窗口函数&…

新手运行若依项目|若依项目各部分介绍|并修改自己需要的页面

新手运行若依项目|若依项目各部分介绍|并修改自己需要的页面 文章目录 新手运行若依项目|若依项目各部分介绍|并修改自己需要的页面前言IEDA如何运行若依项目若依项目目录简介ruo-yi common工具类ruoyi-framework 框架核心其他部分ruo一admin后台服务通用配置 application.yml数…

关于“Python”的核心知识点整理大全26

目录 10.3.9 决定报告哪些错误 10.4 存储数据 10.4.1 使用 json.dump()和 json.load() number_writer.py number_reader.py 10.4.2 保存和读取用户生成的数据 对于用户生成的数据&#xff0c;使用json保存它们大有裨益&#xff0c;因为如果不以某种方式进行存储&#xf…

小红书kop营销策略有哪些,达人投放总结!

从kol到koc&#xff0c;当今时代产品种草模式&#xff0c;层出不穷。品牌想要跟上市场更新迭代的洪流&#xff0c;就需要时刻了解新型的营销方式。那么对于新型的kop模式你了解多少呢?我们今天就将详细分享小红书kop营销策略有哪些&#xff0c;达人投放总结&#xff01; 一、什…

低代码工作流,在业务场景下启动流程节点绑定的具体步骤与注意事项

在业务管理的场景下&#xff0c;存在先做了对应的数据管理&#xff0c;后续增加管理的规范度&#xff0c;“在业务数据变化时发起流程”的需求&#xff0c;那么这种情况下就需要在业务管理&#xff08;列表页、表单&#xff09;中发起流程&#xff0c;让业务模型使用流程配置&a…

运维开发实践 - 服务网关 - apisix部署

1. Apache Apisix Apache Apisix 是一个动态&#xff0c;实时&#xff0c;高性能的云原生API网关&#xff0c;提供负载均衡&#xff0c;动态上游&#xff0c;灰度发布&#xff0c;服务熔断&#xff0c;身份认证&#xff0c;可观测性等丰富的流量管理功能&#xff1b; 2. 如…

windows10-tdengine的安装及使用

win10-tdengine的安装及使用 一、下载及安装配置1.1 下载安装1.2 配置1.3 关闭防火墙和开放端口1.3.1 关闭防火墙1.3.2 开放6030端口 二、启动及关闭服务2.1 启动tdengine服务2.2 关闭tdengine服务2.2 开机自启动配置 四、可视化工具五、TDengine 命令行&#xff08;CLI&#x…

VUE中的8种常规通信方式

文章目录 1.props传递数据(父向子)2.$emit触发自定义事件&#xff08;子向父&#xff09;3.ref&#xff08;父子&#xff09;4.EventBus&#xff08;兄弟组件&#xff09;5.parent或root&#xff08;兄弟组件&#xff0c;有共同祖辈&#xff09;6.attrs和listeners&#xff08;…

Chrome2023新版收藏栏UI改回旧版

版本 120.0.6099.109&#xff08;正式版本&#xff09;Chrome浏览器菜单新版、旧版的差异 想要将书签、功能内容改回旧版的朋友可以网址栏输入&#xff1a;「chrome://flags」&#xff0c;接着搜寻「Chrome Refresh 2023」。 最后将 Chrome Refresh 2023、Chrome Refresh 2023…