官方文档 :http://www.mybatis.org/mybatis-3/zh/configuration.html#plugins
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
总体概括为:
- 拦截执行器的方法
- 拦截参数的处理
- 拦截结果集的处理
- 拦截Sql语法构建的处理
首先先看可以拦截Executor接口的部分方法,比如update,query,commit,rollback等方法,还有其他接口的一些方法等。
其中比较常用的是update和query,update包括新增、修改、删除等方法,query用于查询。
官方示例给出一个update的拦截器实现
// ExamplePlugin.java
@Intercepts({@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
return invocation.proceed();
}
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties) {
}
}
首先新建一个类实现interceptor
然后在mybatis-config.xml中声明这个拦截器
<!-- mybatis-config.xml -->
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
上面的插件将会拦截在 Executor 实例中所有的 “update” 方法调用, 这里的 Executor 是负责执行低层映射语句的内部对象。
了解完这些开始准备实现自己的目的:用拦截器实现不同语法的批量插入。
0 参数了解
在这里我拦截的是update方法
int update(MappedStatement var1, Object var2) throws SQLException;
其中MappedStatement中我可能会用到的几个参数:
- sqlCommandType:INSERT
- databaseId:oracle
- sqlSource.rootSqlNode:里面的content列表包含了本次要处理的sql;