在表结构设计中,通常会有一些固定字段,比如create_user、update_user、create_time、update_time等,在有insert和update的的地方都需要给这些字段赋值,这种工作简单繁琐,下面用自定义的Mybatis拦截器来给这些字段自动赋值,以其中一个字段create_user为例。
首先要定义一个注解,这个注解需要加在字段create_user上
下面是自定义的Mybatis拦截器
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class XxxInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
//用户信息需放入线程变量里,然后这里再从线程变量里读取
UserInfo userInfo = UserInfoThreadLocal.get();
if (userInfo == null) return invocation.proceed();
MappedStatement mappedStatement = (MappedStatement)invocation.getArgs()[0];
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
Object parameter = invocation.getArgs()[1];
//获取所有属性,包括父类属性
List<Field> declaredFields = ReflectionUtils.getAllDeclaredFields(parameter.getClass());
if (SqlCommandType.INSERT.equals(sqlCommandType)) {
for (Field field : declaredFields) {
CreateUser createUser = field.getAnnotation(CreateUser.class);
if (createUser != null) {
this.setValue(createUser, field, parameter, userInfo);
break;
}
}
}
return invocation.proceed();
}
private void setValue(CreateUser annotation, Field field, Object parameter, UserInfo userInfo) {
this.set(field, parameter, userInfo.getUserId());
}
private void set(Field field, Object parameter, Object value) {
try {
field.setAccessible(true);
field.set(parameter, value);
field.setAccessible(false);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
其中jdk自带的方法获取不了包含父类的所有属性,如果需要获取可参考:包含父类的所有属性