MyBatisPlus插入更新数据时通用字段自动赋值

1、创建时间和更新时间在数据库表层面就可以解决

`create_time` datetime DEFAULT NULL CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

2、创建人和更新人赋值操作

MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。
使用场景:公共字段填充等,如updateTime、createTime、createUser、updateUser等公共字段多的填充。

@Data
public class Employee implements Serializable {

private static final long serialVersionUID = 1L;

private Long id;

private String username;

@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;

@TableField(fill = FieldFill.INSERT)
private Long createUser;

@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;

}

2、自定义元对象处理器类,实现metaObjecthandler接口,重写insertFill、updateFill方法;
1)在每次执行插入和修改操作时,会执行insertFill,updateFill方法;
2)setValue(String name,Object value) : 设置公共字段填充值,第一个参数值name与实体字段要相同

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.chinaunicom.common.core.domain.BaseEntity;
import com.chinaunicom.common.exception.ServiceException;
import com.chinaunicom.common.utils.SecurityUtils;
import org.apache.ibatis.reflection.MetaObject;

import java.util.Date;

/**
 * MyBatis Plus 元对象处理器配置(插入或修改时自动填充)
 *
 * @author Charles7c
 * @since 2022/12/22 19:52
 */
public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler {

    /** 创建人 */
    private static final String CREATE_USER = "createBy";
    /** 创建时间 */
    private static final String CREATE_TIME = "createTime";
    /** 修改人 */
    private static final String UPDATE_USER = "updateBy";
    /** 修改时间 */
    private static final String UPDATE_TIME = "updateTime";

    /**
     * 插入数据时填充
     *
     * @param metaObject
     *            元对象
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        try {
            if (null == metaObject) {
                return;
            }

            String createUser = SecurityUtils.getUsername();
            Date createTime = new Date();
            if (metaObject.getOriginalObject() instanceof BaseEntity) {
                // 继承了 BaseDO 的类,填充创建信息
                BaseEntity baseDO = (BaseEntity)metaObject.getOriginalObject();
                baseDO.setCreateBy(ObjectUtil.defaultIfNull(baseDO.getCreateBy(), createUser));
                baseDO.setCreateTime(ObjectUtil.defaultIfNull(baseDO.getCreateTime(), createTime));
            } else {
                // 未继承 BaseDO 的类,如存在创建信息则进行填充
                this.fillFieldValue(metaObject, CREATE_USER, createUser, false);
                this.fillFieldValue(metaObject, CREATE_TIME, createTime, false);
            }
        } catch (Exception e) {
            throw new ServiceException("插入数据时自动填充异常:" + e.getMessage());
        }
    }

    /**
     * 修改数据时填充
     *
     * @param metaObject
     *            元对象
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        try {
            if (null == metaObject) {
                return;
            }

            String updateUser = SecurityUtils.getLoginUser().getUsername();
            Date updateTime = new Date();
            if (metaObject.getOriginalObject() instanceof BaseEntity) {
                // 继承了 BaseDO 的类,填充修改信息
                BaseEntity baseDO = (BaseEntity)metaObject.getOriginalObject();
                baseDO.setUpdateBy(updateUser);
                baseDO.setUpdateTime(updateTime);
            } else {
                // 未继承 BaseDO 的类,根据类中拥有的修改信息进行填充,不存在修改信息不进行填充
                this.fillFieldValue(metaObject, UPDATE_USER, updateUser, true);
                this.fillFieldValue(metaObject, UPDATE_TIME, updateTime, true);
            }
        } catch (Exception e) {
            throw new ServiceException("修改数据时自动填充异常:" + e.getMessage());
        }
    }

    /**
     * 填充字段值
     *
     * @param metaObject
     *            元数据对象
     * @param fieldName
     *            要填充的字段名
     * @param fillFieldValue
     *            要填充的字段值
     * @param isOverride
     *            如果字段值不为空,是否覆盖(true 覆盖、false 不覆盖)
     */
    private void fillFieldValue(MetaObject metaObject, String fieldName, Object fillFieldValue, boolean isOverride) {
        if (metaObject.hasSetter(fieldName)) {
            Object fieldValue = metaObject.getValue(fieldName);
            setFieldValByName(fieldName, null != fieldValue && !isOverride ? fieldValue : fillFieldValue, metaObject);
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值