一、如果是使用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;
}
}
}
}
}