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

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

相关推荐
阿里嘎多学长几秒前
2026-08-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
野生技术架构师3 分钟前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
爱吃火鸡面呀6 分钟前
MySQL 查询与函数详解:从基础条件筛选到高级字符处理
数据库·mysql
其实防守也摸鱼9 分钟前
Codex破局:前端组件秒级生成的技术文章大纲
开发语言·前端·人工智能·学习·安全·web安全
AI人工智能+电脑小能手11 分钟前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
奥莱维13 分钟前
KNX酒店方案_KNX专用线与高端酒店技术逻辑
java·服务器·前端·数据库
Logintern0921 分钟前
装饰器和洋葱模式的区分
开发语言·python·架构
工业一体机老司机22 分钟前
Linux工业一体机自启动服务配置:systemd服务单元编写与开机优化实战
java·linux·服务器
牛大兵22 分钟前
机顶盒获取局域网已经使用IP,开放的端口号,扫描摄像头,NAS,共享主机等开机自启局域网全量扫描工具
数据库·网络协议·tcp/ip
知行产研28 分钟前
中国矿山无人驾驶出海的三重门
数据库·mysql·php