MyBatis-Plus-实用的功能自动填充字段

前言:

java项目用到了mybatis-plus,在一些类里面需要在更新时候,统一设置,修改人,修改ID,修改时间。新增时候设置 创建人,创建时间等

基础类:

@Data
public abstract class BaseModel implements Serializable {/*** 逻辑删除*/@TableField(value = "is_delete", fill = FieldFill.INSERT)@TableLogic@ApiModelProperty(hidden = true)protected Integer deleted = 0;@TableField(fill = FieldFill.INSERT)@ApiModelProperty(hidden = true)protected String createId;@TableField(fill = FieldFill.INSERT)@ApiModelProperty(hidden = true)protected String createName;@TableField(fill = FieldFill.INSERT)@ApiModelProperty(hidden = true)protected Date createDate;@TableField(fill = FieldFill.INSERT_UPDATE)@ApiModelProperty(hidden = true)protected String modifiedId;@TableField(fill = FieldFill.INSERT_UPDATE,updateStrategy = FieldStrategy.NOT_NULL)@ApiModelProperty(hidden = true)protected String modifiedName;@TableField(fill = FieldFill.INSERT_UPDATE)@ApiModelProperty(hidden = true)protected Date modifiedDate;}

然后,每个业务类都要继承这个基础类:确保数据库字段也都有这些字段。比如:

@Data
public class ErpSaleOrderTransactionBill extends BaseModel {private static final long serialVersionUID = 561288556671900702L;/*** 主键id*/@TableId(type = IdType.ASSIGN_ID)@NotEmptyprivate String id;/*** 账单号*/  private String orderCode;/*** 单据类别*/  private String confOrderCategory;
}

mybatis-plus框架,我们可以使用:  ,这里我们可以不设置,  modifiedName,modifiedDate等

updateBatchById(calculateRiskLevelListUpdate);

最重要的:mybatis-plus拦截执行

package com.alpha.erp.config;import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.orderplus.core.auth.Audience;
import com.orderplus.core.util.JwtTokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import java.util.Date;@Slf4j
@Component
public class MetaDataObjectHandler implements MetaObjectHandler {@Autowiredprivate HttpServletRequest request;@Autowiredprivate Audience audience;/*** 获取请求参数 - 用户ID*/protected String getUserId() {try {String token = request.getHeader(HttpHeaders.AUTHORIZATION);if (StringUtils.isEmpty(token)) {return "";}return JwtTokenUtil.getUserId(token.substring(7), audience.getBase64Secret());} catch (Exception e) {return "";}}/*** 获取请求参数 - 用户ID*/protected String getUsername() {try {String token = request.getHeader(HttpHeaders.AUTHORIZATION);if (StringUtils.isEmpty(token)) {return "";}return JwtTokenUtil.getUsername(token.substring(7), audience.getBase64Secret());} catch (Exception e) {return "";}}/*** 获取请求参数 - 集团代码*/protected String getEnterpriseNumber() {try {String token = request.getHeader(HttpHeaders.AUTHORIZATION);if (StringUtils.isEmpty(token)) {return "";}return JwtTokenUtil.getEnterpriseNumber(token.substring(7), audience.getBase64Secret());} catch (Exception e) {return "";}}@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill ....");this.strictInsertFill(metaObject, "deleted", Integer.class, 0);
//        this.strictInsertFill(metaObject, "createId", String.class, getUserId());this.strictInsertFill(metaObject, "createDate", Date.class, new Date());
//        this.strictInsertFill(metaObject, "createName", String.class, getUsername());
//        this.strictInsertFill(metaObject, "modifiedId", String.class, getUserId());this.strictInsertFill(metaObject, "modifiedDate", Date.class, new Date());
//        this.strictInsertFill(metaObject, "modifiedName", String.class, getUsername());this.strictInsertFill(metaObject, "groupCode", String.class, getEnterpriseNumber());this.strictInsertFill(metaObject, "brand", String.class, getEnterpriseNumber());this.fillStrategy(metaObject, "createId", getUserId());this.fillStrategy(metaObject, "createName", getUsername());this.fillStrategy(metaObject, "modifiedId", getUserId());this.fillStrategy(metaObject, "modifiedName", getUsername());}@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill ....");
//        metaObject.setValue("modifiedDate",null);
//        metaObject.setValue("modifiedId",null);
//        metaObject.setValue("modifiedName",null);
//        this.strictUpdateFill(metaObject, "modifiedDate", Date.class, new Date());
//        this.strictUpdateFill(metaObject, "modifiedId", String.class, getUserId());
//        this.strictUpdateFill(metaObject, "modifiedName", String.class, getUsername());metaObject.setValue("modifiedDate",null);this.strictUpdateFill(metaObject, "modifiedDate", Date.class, new Date());if(StrUtil.isNotBlank(getUserId())){metaObject.setValue("modifiedId",null);this.strictUpdateFill(metaObject, "modifiedId", String.class, getUserId());}if(StrUtil.isNotBlank(getUsername())){metaObject.setValue("modifiedName",null);this.strictUpdateFill(metaObject, "modifiedName", String.class, getUsername());}}
}

然后你可以看到,执行时候会自动赋值。

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

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

相关文章

java 公共字段填充

公共字段填充 1、mybatis-plus2、mybatis 使用注解加aop2.1 自定义注解2.2 自定义切面类2.3 在mapper上添加上自定义的注解 1、mybatis-plus 通过在类上使用如下的注解 TableField(fill FieldFill.INSERT) 是 MyBatis-Plus 中的注解,用于自动填充字段的值。MyBat…

简单且循序渐进地查找软件中Bug的实用方法

“Bug”这个词常常让许多开发者感到头疼。即使是经验丰富、技术娴熟的开发人员在开发过程中也难以避免遭遇到 Bug。 软件中的故障会让程序员感到挫败。我相信在你的软件开发生涯中,也曾遇到过一些难以排查的问题。软件中的错误可能会导致项目无法按时交付。因此&…

解决 Docker 安装时“无法获取 dpkg 前端锁”错误的有效方法

在安装 Docker 的过程中,不少用户可能会遇到“无法获取 dpkg 前端锁”的错误提示。这是一个较为常见但也令人困扰的问题。下面为您详细介绍几种可能的解决方法: 方法一:检查并终止相关进程 首先,您可以通过以下命令检查是否有正…

Linux进程、线程——保姆级助理解

目录 1、进程(Process) 1.1 进程基本概念: 1.2 进程分类 1.3 进程的特征 1.4 进程和程序的区别 1.5 进程的状态 1.6 进程的创建——Fork()函数 1.6.1 简介 1.6.2 使用 1.7 进程终止 2、线程(Thread) 1.1 线…

Git管理源代码、git简介,工作区、暂存区和仓库区,git远程仓库github,创建远程仓库、配置SSH,克隆项目

学习目标 能够说出git的作用和管理源代码的特点能够如何创建git仓库并添加忽略文件能够使用add、commit、push、pull等命令实现源代码管理能够使用github远程仓库托管源代码能够说出代码冲突原因和解决办法能够说出 git 标签的作用能够使用使用git实现分支创建,合并…

排序 -- 冒泡排序和快速排序

一、 交换排序 1、基本思想 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 2、常见的交换排序 1、冒泡…

TypeError: object of type ‘float‘ has no len()的解决办法

报错代码举例: a20 b200 print(len(a/b)) 原因:a/b的结果是浮点数,而len()函数不支持浮点数 解决办法:把浮点数类型变为字符串 修改后代码 a20 b200 print(len(str(a/b)))

《征服数据结构》SparseArray

摘要: 1,SparseArray的介绍 2,SparseArray的代码实现 1,SparseArray的介绍 前面我们讲过《ArrayMap》,用它来实现哈希表,其中存放key和value的数组长度是存放散列表数组长度的二倍。 在哈希表中如果key值是…

【Python】已解决:(Python xml库 import xml.dom.minidom导包报错)‘No module named dom’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:(Python xml库 import xml.dom.minidom导包报错)‘No module named dom’ 一、分析问题背景 在使用Python处理XML文件时,xml…

【linux/shell】awk获取除某列之外的其他数据

介绍 在使用 awk 时,如果你想要获取除了某一列之外的所有其他数据,可以通过设置字段分隔符(Field Separator,FS)和输出字段分隔符(Output Field Separator,OFS),然后打印…

中科曙光:新智生产力引擎,是一台精密的AI发动机

每一个时代的新生产力释放,都需要新的发动机来释放新动能。比如蒸汽机之于畜力、燃油机之于蒸汽机,发动机的每一次进化,都为新兴工业体系奠定了更强大的生产力底座。 如今,AI作为新质生产力的关键引擎,带来了史无前例的…

240706_昇思学习打卡-Day18-基于MindSpore的GPT2文本摘要

240706_昇思学习打卡-Day18-基于MindSpore的GPT2文本摘要 今天做一个根据一段文章提取摘要的提取器,基于nlpcc2017摘要数据,内容为新闻正文及其摘要,就是训练集及标签。 首先我们来预装以下MindSpore环境 %%capture captured_output # 实验…

LabVIEW干涉仪测向系统

开发了一套基于LabVIEW的软件系统,结合硬件设备,构建一个干涉仪测向实验教学平台。该平台应用于信号处理课程,帮助学生将理论知识与实际应用相结合,深化对信号处理核心概念的理解和应用。 项目背景: 当前信号处理教学…

Golang 单元测试+包管理+命令行工具

单元测试 传统测试方法 在 main 函数中,调用需要测试的函数,看看实际结果与预期是否相同,如果相同,则正确,否则不正确缺点: 不方便,我们需要在 main 函数中调用,如果项目正在运行&…

昇思25天学习打卡营第十四天|Pix2Pix实现图像转换

训练营进入第十四天,今天学的内容是Pix2Pix图像转换,记录一下学习内容: Pix2Pix概述 Pix2Pix是基于条件生成对抗网络(cGAN, Condition Generative Adversarial Networks )实现的一种深度学习图像转换模型&#xff0c…

为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}(保姆级包括安装QT)超详细记录版

为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}【保姆级包括安装QT】超详细记录版 Chapter1 为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}(保姆级包括安装QT)超详细记录版一. 安装QT程…

picgo+gitee图床配置

node.js安装 刚开始顺着picgo操作,直接跳转到了node.js官网 下载的时候直接 Next,然后可以自定义安装路径,我的安装路径是C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Node.js 然后再在安装路径的根目录下新建两个文件夹,nodecache 和 nodeglobal, 如图所示:…

纤程和协程理解

进程是系统分配资源的最小单位,一个进程包含多个线程,那么纤程和协程又是啥呢? 纤程 多线程编程时,如果线程数过多,就会导致频繁的上下文切换,这对性能是一种额外的损耗。 纤程是由操作系统(特…

802.11漫游流程简单解析与笔记_Part2_04_wpa首次关联的过程中p2p信息部分打印原因——不是AP信息而是网卡信息

最近在进行和802.11漫游有关的工作,需要对wpa_supplicant认证流程和漫游过程有更多的了解,所以通过阅读论文等方式,记录整理漫游相关知识。Part1将记录802.11漫游的基本流程、802.11R的基本流程、与认证和漫游都有关的三层秘钥基础。Part1将包…

C++(Qt)-GIS开发-简易瓦片地图下载器

Qt-GIS开发-简易瓦片地图下载器 文章目录 Qt-GIS开发-简易瓦片地图下载器1、概述2、安装openssl3、实现效果4、主要代码4.1 算法函数4.2 瓦片地图下载url拼接4.3 多线程下载 5、源码地址6、参考 更多精彩内容👉个人内容分类汇总 👈👉GIS开发 …