JAVA面试题 --- MyBatis 篇(二)自定义插件的实现

1.MyBatis 如何实现自定义插件?

实现原理:

MyBatis 自定义插件针对 MyBatis 四大对象(Executor,StatementHandler,ParamentHandler,ResultSetHandler)进行拦截。

  1. Executor  :拦截内部执行器,它负责调用StatementHandler 操作数据库,并把结果集通过 ResultSetHandler 进行自动映射,另外它还处理了二级缓存的操作。
  2. StatementHandler  :拦截 SQL 语法构建的处理,它是MyBatis 直接和数据库执行 SQL脚本的对象,另外它也实现了 MyBatis一级缓存
  3. ParamenterHandler  :拦截参数的处理。
  4. ResultSetHandler  :拦截结果集的处理。

实现关键:

MyBatis 插件要实现 Interceptor 接口,接口包含的方法,如下:

    public interface Interceptor {
	Object intrceptor(Invocation invocation) throws Throwable;
	Object plugin(Object target);
	void setProperties(Properties properties);
}
  • setProperties() 方法是在 MyBatis 进行配置插件的时候可以配置自定义相关属性,即:接口实现对象的参数配置。
  • plugin() 方法是插件用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理,可以决定是否要进行拦截,进而决定要返回一个什么样的目标对象。
  • interceptor()  方法就是要进行拦截的时候要执行的方法。

自定义插件实现示例:

@Intercepts({ @Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
		RowBounds.class, ResultHandler.class }) })
public class TestInterceptor implements Interceptor {

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		Object target = invocation.getTarget();// 被代理方法
		Method method = invocation.getMethod();// 代理方法
		Object[] args = invocation.getArgs();// 方法参数
		// do something......方法拦截前执行代码块
		Object result = invocation.proceed();
		// do something......方法拦截后执行代码块
		return result;
	}

	@Override
	public Object plugin(Object target) {
		// TODO Auto-generated method stub
		return Plugin.wrap(target, this);
	}

	@Override
	public void setProperties(Properties properties) {
		// TODO Auto-generated method stub

	}

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值