Mybatis插件机制详解

  • 时间:
  • 浏览:2
  • 来源:大发5分6合APP下载_大发5分6合APP官网

}

public Object plugin(Object target) {

拦截结果集的解决

Mybatis的插件是采用对四大接口的对象生成动态代理对象的土办法来实现的。这样 现在我们都我们都 看下Mybatis是为何创建这四大接口对象的。

/**

某些接口只声明了另一两个 多 土办法:

} catch (Exception e) {

查看源码能都都都都可不可否发现, Mybatis框架在创建好这四大接口对象的实例后,后会调用InterceptorChain.pluginAll()土办法。InterceptorChain对象是插件执行链对象,看源码就知道里边维护了Mybatis配置的所有插件(Interceptor)对象。

Mybatis四大接口对象创建土办法

public static Object wrap(Object target, Interceptor interceptor) {

// 获取插件的Intercepts注解

Map, Set> signatureMap = getSignatureMap(interceptor);

Class<?> type = target.getClass();

Class<?>[] interfaces = getAllInterfaces(type, signatureMap);

if (interfaces.length > 0) {

public class TestInterceptor implements Interceptor {

Executor是 Mybatis的结构执行器,它负责调用StatementHandler操作数据库,并把结果集通过 ResultSetHandler进行自动映射,另外,他还解决了二级缓存的操作。从这能都都都都可不可否看出,我们都我们都 也是能都都都都可不可否通过插件来实现自定义的二级缓存的。

Mybatis的插件实现要实现Interceptor接口,我们都我们都 看下某些接口定义的土办法。

总体概括为:



概述

plugin土办法是插件用于封装目标对象的,通过该土办法我们都我们都 能都都都都可不可否返回目标对象一种生活 ,都都都都可不可否都都都都可不可否返回另一两个 多 它的代理,能都都都都可不可否决定否有有要进行拦截进而决定要返回另一两个 多 哪些地方样的目标对象,官方提供了示例:return Plugin.wrap(target, this)。

intercept土办法要是 要进行拦截的事真难执行的土办法。

StatementHandler是Mybatis直接和数据库执行sql脚本的对象。另外它也实现了Mybatis的一级缓存。这里,我们都我们都 能都都都都可不可否使用插件来实现对一级缓存的操作(禁用等等)。

MyBatis 允许你在已映射话语执行过程中的某某些进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的土办法调用包括:

@Log4j

public class PageHelper implements Interceptor {

}

}

}

@Intercepts({@Signature(type = Executor.class, method = "query",

Mybatis四大接口

setProperties土办法是在Mybatis进行配置插件的事先能都都都都可不可否配置自定义相关属性,即:接口实现对象的参数配置。

既然Mybatis是对四大接口进行拦截的,这样 们真难知道Mybatis的四大接口是哪些地方: Executor, StatementHandler, ResultSetHandler, ParameterHandler。

Mybatis插件又称拦截器,本篇文章中经常冒出的拦截器都表示插件。

@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class}),

插件Interceptor

}

return target;

}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

try {

} else {

Mybatis采用责任链模式,通过动态代理组织多个插件(拦截器),通过哪些地方地方插件能都都都都可不可否改变Mybatis的默认行为(诸如SQL重写累似 的),可能性插件会深入到Mybatis的核心,因此 在编写另一方的插件前最好了解下它的原理,以便写出安全高效的插件。

拦截参数的解决

}

}

}

}

public Object plugin(final Object target) {

if (target instanceof Executor) {

Mybatis是通过动态代理的土办法实现拦截的,阅读此篇文章都要先对Java的动态代理机制有所了解。

理解某些接口的定义,真难知道java动态代理机制。plugin接口即返回参数target对象(Executor/ParameterHandler/ResultSetHander/StatementHandler)的代理对象。在调用对应对象的接口的事先,能都都都都可不可否进行拦截并解决。

}

return target;

}

/`js

/ target --> Executor/ParameterHandler/ResultSetHander/StatementHandler

public Object pluginAll(Object target) {

for (Interceptor interceptor : interceptors) {

拦截执行器的土办法

}

ResultSetHandler是Mybatis把ResultSet集合映射成POJO的接口对象。我们都我们都 能都都都都可不可否定义插件对Mybatis的结果集自动映射进行修改。

上图Mybatis框架的整个执行过程。Mybatis插件都都都都可不可否对这四大对象进行拦截,能都都都都可不可否说暗含到了Mybatis一次SQL执行的所有操作。可见Mybatis的的插件很强大。

拦截Sql语法构建的解决

public class TestInterceptor implements Interceptor {

public Object intercept(Invocation invocation) throws Throwable {

ParameterHandler是Mybatis实现Sql入参设置的对象。插件能都都都都可不可否改变我们都我们都 Sql的参数默认设置。