package com.doumee.config.mybatis;
|
|
import com.doumee.core.model.LoginUserInfo;
|
import lombok.extern.slf4j.Slf4j;
|
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.apache.shiro.SecurityUtils;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.ReflectionUtils;
|
|
import java.lang.reflect.Field;
|
import java.util.*;
|
|
/**
|
* MyBatis 拦截器
|
* - INSERT语句默认填充创建人和创建时间字段
|
* - UPDATE语句默认填充更新人和更新时间字段
|
* @author dm
|
* @since 2025/03/31 16:44
|
*/
|
@Slf4j
|
@Component
|
@Intercepts({
|
@Signature(type= Executor.class, method = "update", args={MappedStatement.class, Object.class})
|
})
|
public class MyBatisInterceptor implements Interceptor {
|
|
private static final String CREATE_TIME = "createTime";
|
|
private static final String CREATE_USER = "createUser";
|
|
private static final String UPDATE_TIME = "updateTime";
|
|
private static final String UPDATE_USER = "updateUser";
|
|
@Override
|
public Object intercept(Invocation invocation) throws Throwable {
|
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
|
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
|
Object target = invocation.getArgs()[1];
|
if(target instanceof MapperMethod.ParamMap) {
|
try {
|
target = ((MapperMethod.ParamMap) target).get("param1");
|
} catch (Exception e) {
|
}
|
}
|
if (target == null)
|
return invocation.proceed();
|
// 创建语句
|
if (SqlCommandType.INSERT == sqlCommandType) {
|
this.handleOperaStatement(target, CREATE_TIME, CREATE_USER);
|
}
|
// 更新语句
|
else if (SqlCommandType.UPDATE == sqlCommandType) {
|
this.handleOperaStatement(target, UPDATE_TIME, UPDATE_USER);
|
}
|
return invocation.proceed();
|
}
|
|
@Override
|
public Object plugin(Object o) {
|
return Plugin.wrap(o, this);
|
}
|
|
/**
|
* 处理新增和编辑语句
|
*/
|
private void handleOperaStatement(Object target, String... fieldNames) throws Exception{
|
// 操作时间
|
Field operaTimeField = ReflectionUtils.findField(target.getClass(), fieldNames[0]);
|
if (operaTimeField != null) {
|
Object operaTime = this.getFieldValue(operaTimeField, target);
|
if (operaTime == null) {
|
this.setFieldValue(operaTimeField, target, new Date());
|
}
|
}
|
// 操作人
|
Field operaUserField = ReflectionUtils.findField(target.getClass(), fieldNames[1]);
|
if (operaUserField != null) {
|
Object operaUser = this.getFieldValue(operaUserField, target);
|
LoginUserInfo user = this.getLoginUser();
|
if (operaUser == null && user!=null) {
|
this.setFieldValue(operaUserField, target, user.getId());
|
}
|
}
|
}
|
|
/**
|
* 给属性赋值
|
*/
|
private void setFieldValue(Field field, Object target, Object value) throws Exception {
|
field.setAccessible(true);
|
field.set(target, value);
|
field.setAccessible(false);
|
}
|
|
/**
|
* 获取属性值
|
*/
|
private Object getFieldValue(Field field, Object target) throws Exception {
|
field.setAccessible(true);
|
Object value = field.get(target);
|
field.setAccessible(false);
|
return value;
|
}
|
|
/**
|
* 获取登录用户信息
|
*/
|
private LoginUserInfo getLoginUser () {
|
try {
|
return (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
|
}catch (Exception e){
|
|
}
|
return null;
|
}
|
}
|