0%

mybatis拦截器

mybatis拦截器

mybatis允许用户自定义拦截器对SQL语句执行过程中的某一个点进行拦截。默认mybatis允许拦截Executor中的方法、ParameterHandler的方法、ResultSetHandler的方法以及StatementHandler中的方法

  • Executor中的update()、query()、flushStatements()、commit()、rollback()、getTransaction()、close()、isClose()方法

  • ParameterHandler中的getParameterObject()、setParameters()方法

  • ResultSetHandler中的handlerResultSets()、handlerOutputParameters()方法

  • StatementHandler中的prepare()、parameterize()、batch()、update()、query()方法

mybatis使用拦截器需要实现Interceptor接口

1
2
3
4
5
6
7
8
9
10
11
12
public interface Interceptor {
// 执行拦截逻辑的方法
Object intercept(Invocation var1) throws Throwable;
// 包装目标对象,为目标对象创建代理对象
default Object plugin(Object target) {
// 使用当前拦截器来包装目标对象
return Plugin.wrap(target, this);
}
// 根据配置初始化Interceptor对象
default void setProperties(Properties properties) {
}
}

用户自定义的拦截器除了继承Interceptor接口,还需要使用@Intercepts和@Signature注解进行标识

@Intercepts注解中指定了一个@Signature注解列表

1
2
3
4
5
6
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Intercepts {
Signature[] value();
}

每个@Signature注解中标识了该插件需要拦截的方法信息

1
2
3
4
5
6
7
8
9
10
11
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface Signature {
//拦截的类型
Class<?> type();
//拦截的方法
String method();
//被拦截方法的参数列表
Class<?>[] args();
}