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

news2024/11/28 6:45:51

前言:

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)
    @NotEmpty
    private 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 {

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private 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 "";
        }
    }

    @Override
    public 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());
    }

    @Override
    public 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.coloradmin.cn/o/1903066.html

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

相关文章

昇思25天学习打卡营第18天 | K近邻算法实现红酒聚类

1、实验目的 了解KNN的基本概念;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍 K近邻算法(K-Nearest-Neighbor, KNN)是一种用于分类和回归的非参数统计方法,最初由 Cover和Hart于1968年提出(Cover等人,1967)&#…

身体(body)的觉醒

佛,是一个梵文的汉语音译词,指觉醒者。 何谓觉醒?什么的觉醒?其实很简单,就是身体的觉醒。 佛的另一个名字,叫菩提,佛就是菩提,菩提老祖,就是佛祖。 body,即…

如何优化 PostgreSQL 中对于复杂数学计算的查询?

文章目录 一、理解复杂数学计算的特点二、优化原则(一)索引优化(二)查询重写(三)数据库配置调整(四)使用数据库内置函数的优势 三、具体的优化方案和示例(一)…

数据结构算法-排序(一)-冒泡排序

什么是冒泡排序 冒泡排序:在原数组中通过相邻两项元素的比较,交换而完成的排序算法。 算法核心 数组中相邻两项比较、交换。 算法复杂度 时间复杂度 实现一次排序找到最大值需要遍历 n-1次(n为数组长度) 需要这样的排序 n-1次。 需要 (n-1) * (n-1) —…

基于springboot+vue+uniapp的高校宿舍信息管理系统小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

几款电脑端能够运行的AI大模型聊天客户端

Ollama Ollama 是一个用于在本地运行和管理大型语言模型的工具。它支持多种流行模型的下载和本地运行,包括 LLaMA-2、CodeLLaMA、Falcon 和 Mistral 。Ollama 提供了一个简单、轻量级和可扩展的解决方案,使得用户可以以最简单快速的方式在本地运行大模型…

LabVIEW透视变换

透视变换概述源程序在www.bjcyck.com下载 透视变换是一种几何变换,用于对图像进行扭曲,使其看起来从不同角度拍摄。这在计算机视觉和图像处理领域非常重要,例如在投影校正和图像配准中。LabVIEW提供了强大的图像处理工具,利用其V…

阿里通义音频生成大模型 FunAudioLLM 开源!

01 导读 人类对自身的研究和模仿由来已久,在我国2000多年前的《列子汤问》里就描述了有能工巧匠制作出会说话会舞动的类人机器人的故事。声音包含丰富的个体特征及情感情绪信息,对话作为人类最常使用亲切自然的交互模式,是连接人与智能世界…

gcc的编译C语言的过程

gcc的简介 GCC(GNU Compiler Collection)是由GNU项目开发和维护的一套开源编程语言编译器集合。它支持多种编程语言,包括但不限于C、C、Objective-C、Fortran、Ada等。GCC被广泛应用于编译和优化各种程序,是许多开发者和组织的首选…

【Unity数据交互】如何Unity中读取Ecxel中的数据

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 专栏交流🧧&…

picgo+gitee图床配置

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

ida动态调试-cnblog

ida动态调试 传递启动ida服务 android_server在ida\dbgsrv目录中 adb push android_server /data/local/tmp/chmod 755 /data/local/tmp/android_server /data/local/tmp/android_serveradb forward tcp:23946 tcp:23946ida报错:大多是手机端口被占用 报错提示: …

GD32 MCU ADC采样率如何计算?

大家在使用ADC采样的时候是否计算过ADC的采样率,这个问题非常关键! 以下为GD32F303系列MCU中有关ADC的参数,其中ADC时钟最大值为40MHz,12位分辨率下最大采样率为2.86MSPS.如果ADC时钟超频的话,可能会造成ADC采样异常&…

ARTS Week 36

unsetunsetAlgorithmunsetunset 本周的算法题为 1528. 重新排列字符串 给你一个字符串 s 和一个 长度相同 的整数数组 indices 。 请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置。 返回重新排列后的字符串。 img 示例 1:输入&…

Google RichHF-18K 文本到图像生成中的丰富人类反馈

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

使用python编程的视频文件列表应用程序

简介: 在本篇博客中,我们将介绍一个基于 wxPython 的视频文件列表应用程序。该应用程序允许用户选择一个文件夹,并显示该文件夹中的视频文件列表。用户可以选择文件并查看其详细信息,导出文件列表为文本文件,以及播放…

Python酷库之旅-第三方库Pandas(008)

目录 一、用法精讲 16、pandas.DataFrame.to_json函数 16-1、语法 16-2、参数 16-3、功能 16-4、返回值 16-5、说明 16-6、用法 16-6-1、数据准备 16-6-2、代码示例 16-6-3、结果输出 17、pandas.read_html函数 17-1、语法 17-2、参数 17-3、功能 17-4、返回值…

68.WEB渗透测试-信息收集- WAF、框架组件识别(8)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:67.WEB渗透测试-信息收集- WAF、框架组件识别(7) 右边这些是waf的…

C++ | Leetcode C++题解之第217题存在重复元素

题目&#xff1a; 题解&#xff1a; class Solution { public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> s;for (int x: nums) {if (s.find(x) ! s.end()) {return true;}s.insert(x);}return false;} };

R语言fastshap包进行支持向量机shap可视化分析

1995年VAPINK 等人在统计学习理论的基础上提出了一种模式识别的新方法—支持向量机 。它根据有限的样本信息在模型的复杂性和学习能力之间寻求一种最佳折衷。 以期获得最好的泛化能力.支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部极小值,从而也保证了它对未知…