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

news/2024/10/6 4:23:52/文章来源:https://www.cnblogs.com/liran123/p/18285911

前言:

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.hqwc.cn/news/738789.html

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

相关文章

BOSHIDA DC/AC电源模块在不同的电源类型之间进行转换

BOSHIDA DC/AC电源模块在不同的电源类型之间进行转换 电力转换是现代社会不可或缺的一部分,它使我们能够在不同的电源类型之间进行转换,从而满足各种设备和应用的需求。DC/AC电源模块是一种用于将直流电转换为交流电的设备,它在电子设备、太阳能系统、电池充电等领域发挥着重…

面试必会之SpringBootSpringCloud

01- 讲一讲SpringBoot自动装配的原理 1.在SpringBoot项目的启动引导类上都有一个注解@SpringBootApplication @SpringBootApplication @MapperScan("com.hxx.admin.dao") public class AdminApplication {public static void main(String[] args) {SpringApplication…

在Docker中搭建rabbit MQ集群 (Mac + OrbStack)

我以为用docker搭建一个rabbitMq集群会非常简单,但是结果却出乎意料,我花了差不多两个半天才搞定。这还是依赖了AI的协助,否则难度不敢想象。我的环境是Mac上的OrbStack。用了Kimi + 文心一言 + ChatGPT + Claude,还是Kimi价值最大。back and forth 的过程就不讲了,这里直…

信息安全驱动汽车行业快速向数字化转型

经纬恒润针对ISO/SAE 21434、WP.29 R155等法规进行了深入研究,结合多年功能安全、信息安全经验,可以为客户提供信息安全全流程解决方案。 开发一款安全性良好的软件是困难的,它需要专业知识的积累以及对常见编程缺陷和规则的了解,例如检查输入范围、管理内存分配和回…

Java进阶:HashMap底层原理(通俗易懂篇)

1.底层结构 Java 7及之前版本 在Java 7及之前的版本中,HashMap的底层数据结构主要是数组加链表。具体实现如下:数组:HashMap的核心是一个Entry数组(Entry<K,V>[] table),这个数组的大小总是2的幂。每个数组元素是一个单一的Entry节点,或者是一个链表的头节点。链表…

各类问题p~np

可以简单用下图来表示 p类问题指的是可以在多项式时间求解的问题,例如n个数的排序问题,复杂度最多为O^2 np类问题指的是可以在多项式时间验证答案的问题,例如求n个点的图是否有哈密顿路,最坏情况需要(n-1)!,但是验证是否为哈密顿路是多项式时间 nph类问题是任意np类问题在…

面试必会之Redis篇

01- 你们项目中哪里用到了Redis ? 在我们的项目中很多地方都用到了Redis , Redis在我们的项目中主要有三个作用 :使用Redis做热点数据缓存/接口数据缓存 使用Redis存储一些业务数据 , 例如 : 验证码 , 用户信息 , 用户行为数据 , 数据计算结果 , 排行榜数据等 使用Redis实现分…

linux部署cassandra

Cassandra数据库是一个高度可扩展、分布式的NoSQL数据库系统,最初由Facebook开发,用于处理大规模数据集并提供高可用性和高性能。随着其开源和广泛应用,Cassandra已经成为Apache软件基金会的一个顶级项目。以下是关于Cassandra数据库的详细介绍: 一、基本概述类型:Cassand…

【设计模式(五)】创建型模式--建造者模式

创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。概述:建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造创建出一个复杂的对象。 建造者(Builder)模式包…

结合RNN与Transformer双重优点,深度解析大语言模型RWKV

RWKV在多语言处理、小说写作、长期记忆保持等方面表现出色,可以主要应用于自然语言处理任务,例如文本分类、命名实体识别、情感分析等。本文分享自华为云社区《【云驻共创】昇思MindSpore技术公开课 RWKV 模型架构深度解析》,作者:Freedom123。 一、前言 Transformer模型作…

VMware vSphere Tanzu部署_16_TKC集群节点VM密码获取

SupervisorControlPlaneVM密码获取 通过SSH方式登录vcentervcenter开启SSH服务通过SSH工具登录vcenter执行获取密码脚本在vcenter shell模式下执行/usr/lib/vmware-wcp/decryptK8Pwd.py命令WARNING! The remote SSH server rejected X11 forwarding request. Connected to serv…