首先@Intercepts注解 可以看这篇文章https://blog.csdn.net/weixin_43505211/article/details/128050083
建个类 实现 Interceptor接口,重写intercept方法;
//首先获取该xml信息
Method invocationMethod = invocation.getMethod();
//获取名称 用来判断是否是入参
String invocationMethodName = invocationMethod.getName();
if ("setParameters".equals(invocationMethodName)) {
// 获取拦截器拦截的设置参数对象parameterHandler
ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();
// 通过mybatis的反射来获取对应的值,目的是找到方法的基础信息
MetaObject metaResultSetHandler = MetaObject.forObject(parameterHandler, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, REFLECTOR_FACTORY);
MappedStatement mappedStatement = (MappedStatement) metaResultSetHandler.getValue("mappedStatement");
//获取方法
Object parameterObject = metaResultSetHandler.getValue("parameterObject");
// id字段对应执行的SQL的方法的全路径,包含类名和方法名
String id = mappedStatement.getId();
String className = id.substring(0, id.lastIndexOf("."));
String methodName = id.substring(id.lastIndexOf(".") + 1);
// 动态加载类并获取类中的方法
final Class<?> aClass = Class.forName(className);
final Method method = ReflectUtil.getMethodByNameIgnoreCase(aClass, methodName);
if (method.isAnnotationPresent(DorisDtAnnotation.class) || aClass.isAnnotationPresent(DorisDtAnnotation.class)) {
// 获取方法上的注解以及注解对应的参数
Balaba paramAnnotation = Optional.ofNullable(method.getAnnotation(Balaba.class)).orElseGet(() -> aClass.getAnnotation(Balaba.class));
String timeType = paramAnnotation.timeType();
// 反射获取参数对象
MetaObject param = MetaObject.forObject(parameterObject, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, REFLECTOR_FACTORY);
//获取参数,然会做处理
Object timeTypeValue = param.getValue(timeType);
}
}
这样就可以在每条sql的时候做判断,方便做统一处理。