mybatisPlus中MetaObjectHandler使用

1、扩展MetaObjectHandler接口,可容易去实现数据插入或者修改时,一些公共默认字段的赋值

package com.sfpay.merchant.tmn.interceptor;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.sfpay.merchant.common.model.BuiOperDTO;
import com.sfpay.merchant.common.model.UrmOperDTO;
import com.sfpay.merchant.tmn.dal.entity.BaseSysConfigDO;
import com.sfpay.merchant.tmn.service.baseSysConfig.BaseSysConfigService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Base64;
import java.util.Date;
import java.util.Map;
import java.util.Optional;

/**
 * <p> MyBatisPlus自定义字段自动填充处理类 - 实体类中使用 @TableField注解 </p>
 *
 * @description: 注意前端传值时要为null
 * @date: 2022/10/20
 */
@Component
@Slf4j
public class TmnMetaObjectHandler implements MetaObjectHandler {

    @Resource
    private RedisTemplate<String, Map<String, Object>> redisTemplate;

    private BaseSysConfigService baseSysConfigService;

    @Autowired
    @Lazy
    public TmnMetaObjectHandler(BaseSysConfigService baseSysConfigService) {
        this.baseSysConfigService = baseSysConfigService;
    }


    /**
     * 创建时间
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        Date date = new Date();
        try {
            //创建时填充商户表状态变更时间
            this.fillStrategy(metaObject, "stsUpdTm", date);
            //公共字段填充
            this.fillStrategy(metaObject, "createTime", date);
            this.fillStrategy(metaObject, "updateTime", date);
            //从session中获取操作员
            String operatorNo = getOperatorNoFromSession();
            this.fillStrategy(metaObject, "createId", operatorNo);
            this.fillStrategy(metaObject, "updateId", operatorNo);
            this.fillStrategy(metaObject, "operater", operatorNo);
            metaObject.setValue("reportAdmin", getTmnAdminByBaseConfig());
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }

    private String getTmnAdminByBaseConfig() {
        BaseSysConfigDO baseSysConfigDO = baseSysConfigService.queryBaseConfigInfoByParamCodeAndParamType("REPORT_ADMIN_TO_TMN","S");
        if (baseSysConfigDO != null){
            return baseSysConfigDO.getParamValStr();
        }
        return "";
    }

    /**
     * 数据修改时间
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        try {
            //公共字段填充
            this.fillStrategy(metaObject, "updateTime", new Date());
            this.fillStrategy(metaObject, "updateId", getOperatorNoFromSession());
//            this.fillStrategy(metaObject, "remark", getTmnAdminByBaseConfig());
            metaObject.setValue("reportAdmin", getTmnAdminByBaseConfig());
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }

    /**
     * 从session中获取操作员
     * do请求没有走DispatcherServlet,所有RequestContextHolder只存了servlet容器中的facade类型的request,
     * 没有SessionRepositoryRequestWrapper类型的request
     *
     * @return
     */
    public String getOperatorNoFromSession() {
        String sessionId = Optional.ofNullable(RequestContextHolder.getRequestAttributes())
                .map(requestAttributes -> ((ServletRequestAttributes) requestAttributes).getRequest())
                .map(HttpServletRequest::getRequestedSessionId).orElse("");
        log.debug("从session中获取操作员,sessionId {}", sessionId);
        //从redis中获取session信息
        String operatorNo = "system";
        if (StringUtils.isNotBlank(sessionId)) {
            String sessionKey = "spring:session:sessions:" + base64Decode(sessionId);
            log.debug("从session中获取操作员,sessionKey {}", sessionKey);
            Object object = redisTemplate.opsForHash().get(sessionKey, "sessionAttr:" + "oper_inf");
            log.debug("从session中获取操作员,user {}" , object);
            if (object != null) {
                if (object instanceof BuiOperDTO) {
                    BuiOperDTO operator = (BuiOperDTO) object;
                    operatorNo = operator.getOperNo();
                } else if (object instanceof UrmOperDTO) {
                    UrmOperDTO operator = (UrmOperDTO) object;
                    operatorNo = String.valueOf(operator.getUsrOprNo() == null ? "system" : operator.getUsrOprNo());
                }
            }
        }
        log.info("从session中获取操作员,operatorNo {}", operatorNo);
        return operatorNo;
    }

    /**
     * Decode the value using Base64.
     *
     * @param base64Value the Base64 String to decode
     * @return the Base64 decoded value
     * @since 1.2.2
     */
    private String base64Decode(String base64Value) {
        try {
            byte[] decodedCookieBytes = Base64.getDecoder().decode(base64Value);
            return new String(decodedCookieBytes);
        } catch (Exception e) {
            return null;
        }
    }
}

2、定义表中的公共字段

package com.sfpay.merchant.common.util;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.sfpay.merchant.common.util.annotation.DateTime2String;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * <p>
 * 公共字段
 * </p>
 *
 * @author 
 * @since 2021-06-18
 */
@Data
public class CommonDO implements Serializable {

    /**
     * 创建操作员
     */
    @TableField(value = "CREATE_ID", fill = FieldFill.INSERT)
    private String createId;

    /**
     * 创建时间
     */
    @DateTime2String
    @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 创建时间
     */
    @TableField(exist = false)
    private String createTimeDesc;

    /**
     * 更新操作员
     */
    @TableField(value = "UPDATE_ID", fill = FieldFill.INSERT_UPDATE)
    private String updateId;

    /**
     * 更新时间
     */
    @DateTime2String
    @TableField(value = "UPDATE_TIME", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 更新时间
     */
    @TableField(exist = false)
    private String updateTimeDesc;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值