- 插件开发首先要实现Interceptor接口
public interface Interceptor {
Object intercept(Invocation invocation) throws Throwable;
Object plugin(Object target);
void setProperties(Properties properties);
}
拦截器拦截mybatis的四大对象,四大对象:excetor,StatementHandler,ParamterHandler,ResultSetHandler。
- 实现Interceptor接口
- 重写接口的三个方法
- 在配置文件中配置拦截器
//签名:告诉拦截器拦截哪个对象的哪个方法
@Intercepts(value = {
@Signature(
args = java.sql.Statement.class,
method = "parameterize",
type = StatementHandler.class)
})
public class MyIntercepter implements Interceptor {
/**
* 拦截目标对象的目标方法的执行
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 执行目标方法
Object target = invocation.proceed();// proceed();处理
return target;// 执行后的返回值
}
@Override
public Object plugin(Object target) {
// Plugin包装目标对象--创建一个代理对象
Object wrap = Plugin.wrap(target, this);
return wrap;// 返回target创建的动态代理
}
/**
* 将插件注册时的属性设置进来
*/
@Override
public void setProperties(Properties properties) {
System.out.println("配置信息" + properties);
}
<plugin interceptor="com.nuc.zjy.blog.utils.MyIntercepter">
<property name="username" value="zhao" />
</plugin>
下面我们来实现一个简单的拦截器动态的修改sql的运行参数。
// 签名:告诉拦截器拦截哪个对象的哪个方法
@Intercepts(value = {
@Signature(args = java.sql.Statement.class, method = "parameterize", type = StatementHandler.class) })
public class MyIntercepter implements Interceptor {
/**
* 拦截目标对象的目标方法的执行
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 动态的修改sql的参数,1.拿到StatementHandler==》的paramterHandler==》的paramtObject的值
Object object = invocation.getTarget();
MetaObject forObject = SystemMetaObject.forObject(object);// 拿到Target的元数据
Object value = forObject.getValue("parameterHandler.parameterObject");// 获取属性值
System.out.println("原先的值" + value);
forObject.setValue("parameterHandler.parameterObject", 2);
System.out.println("修改后的值" + value);
// 执行目标方法
Object target = invocation.proceed();// proceed();处理
return target;// 执行后的返回值
}
@Override
public Object plugin(Object target) {
// Plugin包装目标对象--创建一个代理对象
Object wrap = Plugin.wrap(target, this);
return wrap;// 返回target创建的动态代理
}
/**
* 将插件注册时的属性设置进来
*/
@Override
public void setProperties(Properties properties) {
System.out.println("配置信息" + properties);
}
}