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

}

配置文件中注册插件

<plugins
	<plugin interceptor="com.mybatis_demo.plugin.MySecondPlugin"></plugin>
</plugins>

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

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值