一、作用
根据配置的拦截位置,实现在数据库操作的过程中插入自己的逻辑,方便数据的操作审计、事务管理、日志输出、性能优化、SQL更改等实现
二、拦截类型
Executor
作用
拦截 Executor ,可以在 SQL 执行前后添加逻辑,比如缓存的逻辑,在查询语句执行前后检查和添加缓存。
方法
ParameterHandler
作用
SQL的参数,对参数进行解密、加密,处理特殊格式
方法
StatementHandler
作用
可以在执行SQL前修改原始SQL、设置statement属性
方法
ResultHandler
作用
返回SQL执行的结果集、可以对结果集进行加工处理
方法
三、使用
@Intercepts注解
// 标识当前类为拦截器,value为定义拦截点
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Intercepts {
Signature[] value();
}
@Signature注解
// 指定具体的拦截对象
// type:需要拦截的类型
// method:type指定拦截类的方法名
// args:method指定的方法的参数,如果有重载的方法需注意参数的类型
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface Signature {
Class<?> type();
String method();
Class<?>[] args();
}
实例
实现Interceptor
@Intercepts({
@Signature(
type = StatementHandler.class,
method = "prepare",
args = {Connection.class, Integer.class}
)
})
public class SqlIntercept implements Interceptor {
/**
* 拦截器主体,新增拦截逻辑
* @param invocation
* @return
* @throws Throwable
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
Method method = invocation.getMethod();
Object target = invocation.getTarget();
Object[] args = invocation.getArgs();
return invocation.proceed();
}
/**
* 对当前拦截类型的判断,选择是否拦截
* 当类型与拦截器参数相同时进行拦截
* @param target
* @return
*/
@Override
public Object plugin(Object target) {
if(target instanceof StatementHandler){
return Interceptor.super.plugin(target);
}
return target;
}
/**
* 设置拦截器变量参数,会在启动时加载
* @param properties
*/
@Override
public void setProperties(Properties properties) {
System.out.println("key1=" + properties.getProperty("key1"));
System.out.println("key2=" + properties.getProperty("key2"));
System.out.println("key3=" + properties.getProperty("key3"));
}
}
配置XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<plugin interceptor="com.example.bootdemo.intercept.SqlIntercept">
<property name="key1" value="value1"/>
<property name="key2" value="value2"/>
<property name="key3" value="value3"/>
</plugin>
</plugins>
</configuration>