mybatis插件的运行原理是什么?如何写一个插件?

一、运行原理

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);
	}

}

配置文件中注册插件



mybatis的分页插件PageHelper非常强大,有兴趣可以详细了解一下

你可能感兴趣的:(mybatis)