1、首先复习MyBatis原理
2、插件原理
- 每个创建出来的对象不是直接返回的,而是intercepterChain.pluginAll(parameterHandler)包装过的
- 获取到所有的Intercepter(拦截器)(插件需要实现的接口),调用interceptor.plugin(target),返回target包装后的对象
- 插件机制,我们可以使用插件为目标对象创建一个代理对象:AOP,我们的插件可以为四大对象创建出代理对象,代理对象可以拦截到四大对象的每一个执行
3、自定义插件
- 编写Interceptor的实现类
- 使用@Intercepts注解完成插件签名
- 将写好的插件注册到全局配置文件中
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import java.util.Properties;
@Intercepts({@Signature(type = StatementHandler.class,method = "parameterize",args = java.sql.Statement.class)})
public class MyFirstPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("intercept>>>>>>>>>>>>>" + invocation.getMethod());
Object target = invocation.getTarget();
MetaObject metaObject = SystemMetaObject.forObject(target);
Object value = metaObject.getValue("parameterHandler.parameterObject");
System.out.println("sql的参数是:" + value);
metaObject.setValue("parameterHandler.parameterObject",11);
Object proceed = invocation.proceed();
return proceed;
}
@Override
public Object plugin(Object o) {
System.out.println("plugin>>>>>>>>>>>>>" + o);
Object wrap = Plugin.wrap(o, this);
return wrap;
}
@Override
public void setProperties(Properties properties) {
System.out.println("插件的配置信息:" + properties);
}
}
<plugins>
<plugin interceptor="com.atguigu.mybatis.dao.MyFirstPlugin">
<property name="username" value="root"/>
<property name="pwd" value="123456"/>
</plugin>
</plugins>