import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.Configuration;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Optional;
import java.util.TimeZone;
@Component
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
@Slf4j
public class SetBasicFieldIntercepor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
try {
// 获取参数
Object[] args = invocation.getArgs();
MappedStatement mappedStatement = (MappedStatement) args[0];
Object parameter = args[1];
if (parameter == null || parameter instanceof Number || parameter instanceof String) {
return invocation.proceed();
}
// 使用 MetaObject 包装参数对象
MetaObject metaObject = new Configuration().newMetaObject(parameter);
// 获取 SQL 类型
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
String username = Optional.ofNullable(SecurityContextHolder.getContext())
.map(SecurityContext::getAuthentication)
.map(Authentication::getName)
.orElse(null);
if (SqlCommandType.INSERT.equals(sqlCommandType)) {
// 执行新增
setInsertProperty(metaObject, username);
setUpdateProperty(metaObject, username);
}
if (SqlCommandType.UPDATE.equals(sqlCommandType)) {
// 执行更新
setUpdateProperty(metaObject, username);
}
} catch (Exception e) {
log.warn("字段填充拦截器出现问题,请排查 msg:{} warn info", e.getMessage(), e);
}
// 继续执行原来的操作
return invocation.proceed();
}
private void setInsertProperty(MetaObject metaObject, String username) {
String createTimeField = "createTime";
String creatorField = "creator";
String createTimeZoneField = "createTimeZone";
String deletedFlagField = "deletedFlag";
if (metaObject.hasGetter(createTimeField) && metaObject.getValue(createTimeField) == null && metaObject.hasSetter(createTimeField)) {
metaObject.setValue(createTimeField, new Date());
}
if (metaObject.hasGetter(createTimeZoneField) && metaObject.getValue(createTimeZoneField) == null && metaObject.hasSetter(createTimeZoneField)) {
metaObject.setValue(createTimeZoneField, TimeZone.getDefault().getID());
}
if (metaObject.hasGetter(deletedFlagField) && metaObject.getValue(deletedFlagField) == null && metaObject.hasSetter(deletedFlagField)) {
Class<?> setterType = metaObject.getSetterType(deletedFlagField);
if (setterType.equals(Integer.class)) {
metaObject.setValue(deletedFlagField, 0);
} else if (setterType.equals(Boolean.class)) {
metaObject.setValue(deletedFlagField, false);
}
}
if (username != null) {
if (metaObject.hasGetter(creatorField) && metaObject.getValue(creatorField) == null && metaObject.hasSetter(creatorField)) {
metaObject.setValue(creatorField, username);
}
}
}
private void setUpdateProperty(MetaObject metaObject, String username) {
String lastModifyTimeField = "lastModifyTime";
String lastModifyByField = "lastModifyBy";
String lastModifyTimeZoneField = "lastModifyTimeZone";
if (metaObject.hasGetter(lastModifyTimeField) && metaObject.getValue(lastModifyTimeField) == null && metaObject.hasSetter(lastModifyTimeField)) {
metaObject.setValue(lastModifyTimeField, new Date());
}
if (metaObject.hasGetter(lastModifyTimeZoneField) && metaObject.getValue(lastModifyTimeZoneField) == null && metaObject.hasSetter(lastModifyTimeZoneField)) {
metaObject.setValue(lastModifyTimeZoneField, TimeZone.getDefault().getID());
}
if (username != null) {
if (metaObject.hasGetter(lastModifyByField) && metaObject.getValue(lastModifyByField) == null && metaObject.hasSetter(lastModifyByField)) {
metaObject.setValue(lastModifyByField, username);
}
}
}
}
mybatis 自定义字段填充拦截器
最新推荐文章于 2024-05-20 14:54:19 发布