插件是 MyBatis 提供的一个拓展机制,通过插件机制我们可在 SQL 执行过程中的某些点上做一些自定义操作。

实现一个插件需要比简单,首先需要让插件类实现 Interceptor接口。然后在插件类上添加@Intercepts @Signature 注解,用于指定想要拦截的目标 方法。MyBatis 允许拦截下面接口中的一些方法:

  • Executor: update,query,flushStatements,commit,rollback,getTransaction,close,isClosed
  • ParameterHandler: getParameterObject,setParameters
  • ResultSetHandler: handleResultSets,handleOutputParameters
  • StatementHandler: prepare,parameterize,batch,update,query

比较常见的插件有分页插件、分表插件等

实例:

1
2
3
4
5
<plugins>
<plugin interceptor="xyz.coolblog.mybatis.ExamplePlugin">
<property name="key" value="value"/>
</plugin>
</plugins>

解析过程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void pluginElement(XNode parent) throws Exception {
if (parent != null) {
for (XNode child : parent.getChildren()) {
String interceptor = child.getStringAttribute("interceptor");

// 获取配置信息
Properties properties = child.getChildrenAsProperties();

// 解析拦截器的类型,并创建拦截器
Interceptor interceptorInstance = (Interceptor) resolveClass(interceptor).newInstance();

// 设置属性
interceptorInstance.setProperties(properties);
//调用InterceptorChain.addInterceptor

// 添加拦截器到 Configuration 中
configuration.addInterceptor(interceptorInstance);
}
}
}

解析的过程还是比较简单的。首先是获取配置,然后再解析拦截器类型,并实例化拦截器。最后向拦截器中设置属性,并将拦截器添加到 Configuration 中。