利用mybatis拦截器注解处理sql

8 篇文章 0 订阅
文章介绍了如何在MyBatis中创建一个拦截器,通过实现Interceptor接口并重写intercept方法,来拦截特定的方法调用,如setParameters。在拦截过程中,获取MappedStatement和方法信息,通过动态加载类和反射获取方法上的自定义注解(如DorisDtAnnotation),从而实现对参数的处理和SQL执行的控制。
摘要由CSDN通过智能技术生成

首先@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的时候做判断,方便做统一处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值