一、运行原理
1.mybatis可以编写针对Executor、StatementHandler、ParameterHandler、ResultSetHandler四个接口的插件,mybatis使用JDK的动态代理为需要拦截的接口生成代理对象,然后实现接口的拦截方法,所以当执行需要拦截的接口方法时,会进入拦截方法(AOP面向切面编程的思想)
二、写一个插件,分三步完成
1.编写Intercepror接口的实现类
2.设置插件的签名,告诉mybatis拦截哪个对象的哪个方法
3.最后将插件注册到全局配置文件中
例子如下:
//插件签名,告诉mybatis当前插件拦截哪个对象的哪个方法
//type表示要拦截的目标对象,method表示要拦截的方法,args表示要拦截方法的参数
@Intercepts({
@Signature(type=StatementHandler.class,method="parameterize",args=java.sql.Statement.class)
})
public class MySecondPlugin implements Interceptor {
//拦截目标对象的目标方法执行
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("MySecondPlugin拦截目标对象:"+invocation.getTarget()+"的目标方法:"+invocation.getMethod());
/*
* 插件的主要功能:在执行目标方法之前,可以对sql进行修改已完成特定的功能
* 例如增加分页功能,实际就是给sql语句添加limit;还有其他等等操作都可以
* */
//执行目标方法
Object proceed = invocation.proceed();
//返回执行后的返回值
return proceed;
}
//包装目标对象:为目标对象创建代理对象
@Override
public Object plugin(Object target) {
System.out.println("MySecondPlugin为目标对象"+target+"创建代理对象");
//this表示当前拦截器,target表示目标对象,wrap方法利用mybatis封装的方法为目标对象创建代理对象(没有拦截的对象会直接返回,不会创建代理对象)
Object wrap = Plugin.wrap(target, this);
return wrap;
}
//设置插件在配置文件中配置的参数值
@Override
public void setProperties(Properties properties) {
System.out.println("MySecondPlugin配置的参数:"+properties);
}
}
配置文件中注册插件
<plugins
<plugin interceptor="com.mybatis_demo.plugin.MySecondPlugin"></plugin>
</plugins>