MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed):从写SQL
- ParameterHandler (getParameterObject, setParameters):处理参数
- ResultSetHandler (handleResultSets, handleOutputParameters):处理结果集
- StatementHandler (prepare, parameterize, batch, update, query):参数、结果集、sql都可处理
编写插件的步骤
- 实现Interceptor接口。
- 使用@Intercepts注解完成插件签名。
- 在全局配置文件中注册插件。
插件示例
/**
* 拦截所有更新语句
*/
//注解的意思是:拦截Executor类的update(MappedStatement,Object)方法
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class EditPlugin implements Interceptor {
/**
* 拦截目标对象的目标方法的执行
*
* @param invocation
* @return
* @throws Throwable
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object[] args = invocation.getArgs();
MappedStatement statement = (MappedStatement) args[0];
String sql = statement.getBoundSql(args[1]).getSql();
System.out.println("--------intercept method: " + statement.getId() + "-----sql: " + sql);
//执行目标方法
return invocation.proceed();
}
/**
* 包装目标对象:为目标对象创建一个代理对象
*
* @param target
* @return
*/
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
/**
* 将插件注册时的properties属性设置进来
*
* @param properties
*/
@Override
public void setProperties(Properties properties) {
System.out.println("插件配置的信息 = " + properties);
}
}
注册插件
MXL方式
<plugins>
<plugin interceptor="com.xiaolyuh.mybatis.EditPlugin">
<property name="args1" value="参数示例"/>
</plugin>
</plugins>
Spring Boot 方式
注册插件方式1
@Configuration
public class MybatisConfig {
// 注册插件方式1
@Bean
public EditPlugin myPlugin() {
return new EditPlugin();
}
}
注册插件方式2
@Configuration
public class MybatisConfig {
// // 注册插件方式2
// @Bean
// public ConfigurationCustomizer configurationCustomizer() {
// return new ConfigurationCustomizer() {
// @Override
// public void customize(org.apache.ibatis.session.Configuration configuration) {
// //插件拦截链采用了责任链模式,执行顺序和加入连接链的顺序有关
// EditPlugin myPlugin = new EditPlugin();
// configuration.addInterceptor(myPlugin);
// }
// };
// }
// 注册插件方式2
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> {
//插件拦截链采用了责任链模式,执行顺序和加入连接链的顺序有关
EditPlugin myPlugin = new EditPlugin();
configuration.addInterceptor(myPlugin);
};
}
}