Mybatis拦截器给create_user、update_user等固定字段自动赋值

在表结构设计中,通常会有一些固定字段,比如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自带的方法获取不了包含父类的所有属性,如果需要获取可参考:包含父类的所有属性

猜你喜欢

转载自blog.csdn.net/weixin_45497155/article/details/106148891
今日推荐