四个处理:StatementHandler ParameterHandler ResultSetHandler TypeHandler
四大核心对象:StatementHandler ParameterHandler ResultSetHandler Executor
四大核心对象: 1.都涉及到了 拦截器 用于增强 2.四大核心对象都包含了 该增强操作
自定义插件的编写逻辑: 根据MyBatis规则 编写一个 拦截器 ,在拦截器内部加入 自定义增强功能。
下面举例实现一个拦截查询语句,并修改查询参数的拦截器!
实现步骤:
a.编写拦截器
b.编写签名注解(注意这个案例因为要对参数进行修改,所以method =“parameterize”)
package com.yanqun.my.interceptors;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.apache.ibatis.session.ResultHandler;
import java.sql.Statement;
import java.util.Properties;
//query(Statement statement, ResultHandler resultHandler)
@Intercepts({
// @Signature(type = StatementHandler.class , method ="query",args = {Statement.class, ResultHandler.class})
@Signature(type = StatementHandler.class , method ="parameterize",args = {Statement.class})
})
public class MyInterceptor implements Interceptor {
//拦截
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("拦截方法...intercept...");
Object target = invocation.getTarget();//目標方法 : select * from student where stuNo = #{stuNo}
System.out.println("目標對象" +target);
MetaObject metaObject = SystemMetaObject.forObject(target);
// metaObject.getValue("参数..") ;
Object value = metaObject.getValue("parameterHandler.parameterObject");
System.out.println(value+"---------");//参数值
metaObject.setValue("parameterHandler.parameterObject",2);//11->1
Object value2 = metaObject.getValue("parameterHandler.parameterObject");
System.out.println(value2+"---------");
Object proceed = invocation.proceed();//放行
System.out.println(proceed);
return proceed;
}
@Override
public Object plugin(Object target) {//将拦截器中定义的 增强功能 和原来的核心对象 合并起来,称为最终的 核心对象
Object wrap = Plugin.wrap(target, this);
System.out.println("plugin...."+wrap);
return wrap;
}
@Override
public void setProperties(Properties properties) {
// System.out.println("setProperties....");
System.out.println("设置属性:"+properties); //设置属性...
}
}
在MyBatis核心配置文件conf.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.yanqun.my.interceptors.MyInterceptor">
<!--配置一些属性参数!-->
<property name="name" value="zs"/>
<property name="age" value="23"/>
</plugin>
</plugins>
...
</configuration>
拦截器默认执行顺序:setProperties --> plugin --> intercept
如果有多个拦截器(拦截器链),执行顺序则如下图所示: