mybatis保存实体自动更新创建时间创建人等字段

一、如果是使用jpa

可以使用注解@EntityListener(AuditableListener .class)

import java.util.Date;

import javax.persistence.PostPersist;
import javax.persistence.PostUpdate;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;

import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;

import com.kfwl.entity.BaseEntity;

import lombok.extern.java.Log;

/**
 *
 * 审计监听.
 * <p>
 * 在实体保存时添加审计信息,比如创建人、创建时间、最后修改人,最后修改时间等
 *
 */
@SuppressWarnings({ "unused" })
@Log
public class AuditableListener {

	@PrePersist
	@PreUpdate
	@PostUpdate
	@PostPersist
	public void prePersist(Object object) {
		setAuditableInfo(object);
	}

	private void setAuditableInfo(Object object) {

		if (object == null)
			return;

		if (!(object instanceof BaseEntity))
			return;

		BaseEntity entity = (BaseEntity) object;
		UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext()
			    .getAuthentication()
			    .getPrincipal();
		
		if (entity.getCreateTime() == null) {
			entity.setCreateTime(new Date());
		}
		if (entity.getCreateUser() == null) {
			entity.setCreateUser(userDetails.getUsername());
		}
		entity.setUpdateUser(userDetails.getUsername());
		entity.setUpdateTime(new Date());

	}
}

二、mybatis实现自动填充属性

但是mybatis并不支持jpa的写法,可以通过拦截器来实现自动填充

注意通过@Component注入拦截器默认不会调用setProperties方法,我这边不需要使用,所以我直接用@Component注入了


import com.kfwl.entity.BaseEntity;
package com.hillstonenet.labmgmt.web.interceptor;

import org.apache.ibatis.binding.MapperMethod;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * @Author: ffeng
 * @Description: 拦截保存和更新方法,保存时创建时间,创建人,创建人id,修改时候更新修改时间,修改人,修改人id
 * @Date: 2021-12-02 17:30
 */
@Component
@Intercepts(@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}))
public class MybatisBaseEntityIntercepter implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
        Object parameter = invocation.getArgs()[1];
        //更新操作会拿到一个map。不是一个实体 。,需要转一下
        if (SqlCommandType.UPDATE.equals(sqlCommandType)) {
            HashMap map = (HashMap) invocation.getArgs()[1];
            parameter = map.values().toArray()[0];
        }
        Class<?> clazz = parameter.getClass();
        if (clazz.getSuperclass().equals(BaseEntity.class)) {
            updateFeild(clazz.getSuperclass().getDeclaredFields(), parameter, sqlCommandType);
        }
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {

    }

    private void updateFeild(Field[] declaredFields, Object parameter, SqlCommandType sqlCommandType) throws IllegalAccessException {
        /**
         * TODO:获取当前登入用户用户名,用来更新实体
         */
        Long userId = 1L;
        String userName = "你叉叉";
        for (Field field : declaredFields) {
            field.setAccessible(true);
            if (SqlCommandType.INSERT.equals(sqlCommandType)) {
                switch (field.getName()) {
                    case "createdTime":
                        field.set(parameter, new Date());
                        break;
                    case "creatorId":
                        field.set(parameter, userId + "");
                        break;
                    case "creator":
                        field.set(parameter, userName);
                        break;
                }
            } else if (SqlCommandType.UPDATE.equals(sqlCommandType)) {
                switch (field.getName()) {
                    case "updatedTime":
                        field.set(parameter, new Date());
                        break;
                    case "updatorId":
                        field.set(parameter, userId + "");
                        break;
                    case "updator":
                        field.set(parameter, userName);
                        break;
                }
            }
        }
    }
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值