MyBatis 允許你在映射語句執(zhí)行過程中的某一點進(jìn)行攔截調(diào)用。默認(rèn)情況下,MyBatis 允許使用插件來攔截的方法調(diào)用包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed):從寫SQL
- ParameterHandler (getParameterObject, setParameters):處理參數(shù)
- ResultSetHandler (handleResultSets, handleOutputParameters):處理結(jié)果集
- StatementHandler (prepare, parameterize, batch, update, query):參數(shù)、結(jié)果集温学、sql都可處理
編寫插件的步驟
- 實現(xiàn)Interceptor接口再扭。
- 使用@Intercepts注解完成插件簽名。
- 在全局配置文件中注冊插件崇猫。
插件示例
/**
* 攔截所有更新語句
*/
//注解的意思是:攔截Executor類的update(MappedStatement,Object)方法
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class EditPlugin implements Interceptor {
/**
* 攔截目標(biāo)對象的目標(biāo)方法的執(zhí)行
*
* @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);
//執(zhí)行目標(biāo)方法
return invocation.proceed();
}
/**
* 包裝目標(biāo)對象:為目標(biāo)對象創(chuàng)建一個代理對象
*
* @param target
* @return
*/
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
/**
* 將插件注冊時的properties屬性設(shè)置進(jìn)來
*
* @param properties
*/
@Override
public void setProperties(Properties properties) {
System.out.println("插件配置的信息 = " + properties);
}
}
注冊插件
MXL方式
<plugins>
<plugin interceptor="com.xiaolyuh.mybatis.EditPlugin">
<property name="args1" value="參數(shù)示例"/>
</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) {
// //插件攔截鏈采用了責(zé)任鏈模式,執(zhí)行順序和加入連接鏈的順序有關(guān)
// EditPlugin myPlugin = new EditPlugin();
// configuration.addInterceptor(myPlugin);
// }
// };
// }
// 注冊插件方式2
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> {
//插件攔截鏈采用了責(zé)任鏈模式需忿,執(zhí)行順序和加入連接鏈的順序有關(guān)
EditPlugin myPlugin = new EditPlugin();
configuration.addInterceptor(myPlugin);
};
}
}