JPA和myBatis自定义填充createdBy、createdTime、updatedBy、updatedTime等字段信息

JPA:

方案一:(不支持主动传值

1.在启动类上添加@EnableJpaAuditing
2.在实体类添加@EntityListeners(AuditingEntityListener.class)
3.在字段上添加@CreatedBy、@CreatedDate、@LastModifiedBy、@LastModifiedDate

方案二:(支持传值,不传则默认当前人、当前时间

1、自定义监听器:

/**
 * 自定义监听类
 * @author gourd
 */
@Component
@Slf4j
public class DataBaseAuditListener {
    /**
     * 被@Prepersist注解的方法 ,完成save之前的操作。
     * @param object
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     */
    @PrePersist
    public void prePersist(Object object)
            throws IllegalArgumentException, IllegalAccessException {
        // 如果填充字段被分装在一个父类中: Class<?> aClass = object.getClass().getSuperclass();
        Class<?> aClass = object.getClass()
        try {
            Field createdBy = aClass.getDeclaredField("createdBy");
            createdBy.setAccessible(true);
            // 获取createdBy值
            Object createdByValue = createdBy.get(object);
            if(createdByValue == null){
                // currentUserId为业务中自己获取当前用户id
                Long currentUserId =1L;
                createdBy.set(object,currentUserId) ;
            }
            Field createdTime = aClass.getDeclaredField("createdTime");
            createdTime.setAccessible(true);
            // 获取createdTime值
            Object createdTimeValue = createdTime.get(object);
            if(createdTimeValue == null){
                createdTime.set(object,new Date()) ;
            }

        } catch (NoSuchFieldException e) {
            log.error("反射获取属性异常:",e);
        }


    }
    /**
     * 被@Preupdate注解的方法 ,完成update之前的操作。
     * @param object
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     */
    @PreUpdate
    public void PreUpdate(Object object)
            throws IllegalArgumentException, IllegalAccessException {
        Class<?> aClass = object.getClass().getSuperclass();
        try {
            Field updatedBy = aClass.getDeclaredField("updatedBy");
            updatedBy.setAccessible(true);
            // 获取updatedBy值
            Object updatedByValue = updatedBy.get(object);
            if(updatedByValue == null){
                // currentUserId为业务中自己获取当前用户id
                Long currentUserId =1L;
                updatedBy.set(object,currentUserId) ;
            }
            Field updatedTime = aClass.getDeclaredField("updatedTime");
            updatedTime.setAccessible(true);
            // 获取updatedTime值
            Object updatedTimeValue = updatedTime.get(object);
            if(updatedTimeValue == null){
                updatedTime.set(object,new Date()) ;
            }

        } catch (NoSuchFieldException e) {
            log.error("反射获取属性异常:",e);
        }
    }


    /**
     * 被@Postpersist注解的方法 ,完成save之后的操作。
     * @param object
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     */
    @PostPersist
    public void postPersist(Object object)
            throws IllegalArgumentException, IllegalAccessException {

    }
    /**
     * 被@Postupdate注解的方法 ,完成update之后的操作。
     * @param object
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     */
    @PostUpdate
    public void postUpdate(Object object)
            throws IllegalArgumentException, IllegalAccessException {
    }
 
}

2、在类上增加:

@EntityListeners(DataBaseAuditListener.class)

myBatis:

 

具体实现类:

import com.baomidou.mybatisplus.mapper.MetaObjectHandler;
import com.gourd.common.rbac.vo.JwtUser;
import com.gourd.common.utils.JwtUtil;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 自定义填充公共字段 ,即没有传的字段自动填充
 *
 * @author gourd
 **/
@Component
public class MyMetaObjectHandler extends MetaObjectHandler  {
    /**
     *  新增填充
     *
     *  @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        // todo 获取当前登录用户
        Long userId = 1L;
        fillCreateMeta(metaObject, userId);
        fillUpdateMeta(metaObject, userId);
        fillCommonMeta(metaObject);
    }

    /**
     * 更新填充
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // todo 获取当前登录用户
        Long userId = 1L;
        fillUpdateMeta(metaObject,userId);
    }

    private void fillCommonMeta(MetaObject metaObject) {
        if (metaObject.hasGetter("version") && metaObject.hasGetter("deleted")) {
            setFieldValByName("version",1L,metaObject);
            setFieldValByName("deleted",false,metaObject);
        }
    }

    private void fillCreateMeta(MetaObject metaObject,Long userId) {
        if (metaObject.hasGetter("createdBy") && metaObject.hasGetter("createdTime")) {
            setFieldValByName("createdBy", userId, metaObject);
            setFieldValByName("createdTime", new Date(), metaObject);
        }
    }
    private void fillUpdateMeta(MetaObject metaObject,Long userId) {
        if (metaObject.hasGetter("updatedBy") && metaObject.hasGetter("updatedTime")) {
            setFieldValByName("updatedBy", userId, metaObject);
            setFieldValByName("updatedTime", new Date(), metaObject);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值