MyBatis自定义插件开发
插件的原理:
1.每个创建出来的对象都不是直接返回
interceptorChain.pluginAll(parameterHandler);
2.获取到所有的Interceptor(拦截器)(插件需要实现的接口)
调用interceptor.plugin(target);返回target包装后的对象
3.插件机制,我们可以使用插件为目标对象创建一个代理对象,AOP(面向切面)
我们的插件可以为四大对象创建出代理对象
代理对象就可以拦截到四大对象的每一个执行。public Object pluginAll(Object target) {
for (Interceptor interceptor : interceptors) {
target = interceptor.plugin(target);
}
return target;
}
自定义拦截器的步骤:
1.编写拦截器
public class MyFirstPlugin implements Interceptor {
/** * 拦截目标对象方法的执行 * @param invocation * @return * @throws Throwable */
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("MyFirstPlugin...intercept"+invocation.getMethod());
//动态的改变一下sql运行的参数,以前1号学生,实际查询5号学生
Object target = invocation.getTarget();
// System.out.println("当前拦截到的对象"+invocation.getTarget());
//拿到StatementHandler==>ParameterHandler==>parameterObject
//拿到target的元数据
MetaObject metaObject = SystemMetaObject.forObject(target);
Object value = metaObject.getValue("parameterHandler.parameterObject");
// System.out.println("sql语句用的参数是"+value);
//修改完sql语句要执行的参数
metaObject.setValue("parameterHandler.parameterObject",5);
//放行的方法
Object proceed = invocation.proceed();
return proceed;
}
/** * 包装目标对象,将增强的对象和拦截器包装起来并返回 * @param target * @return */
@Override
public Object plugin(Object target) {
System.out.println("MyFirstPlugin..plugin:mybatis将要包装的对象"+target);
//我们可以借助Plugin的wrap方法来使用当前Interceptor包装我们的目标对象
Object wrap = Plugin.wrap(target, this);
//返回当前target创建的动态代理
return wrap;
}
/** * 将插件注册时的property属性 * @param properties */
@Override
public void setProperties(Properties properties) {
// System.out.println("插件配置的信息");
}
}
2.编写 签名注解
/** * 完成插件签名: * 告诉Mybatis当前插件用来拦截哪个对象的哪个方法 */
@Intercepts(
{
@Signature(type = StatementHandler.class,
method = "parameterize",args = java.sql.Statement.class)
})
3.配置
<plugins>
<!-- 分页插件-->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--<!– config params as the following –>-->
<!--<property name="dialect" value="mysql"/>-->
<property name="reasonable" value="true"/>
<!--<property name="dialect" value="mysql"/>-->
</plugin>
<plugin interceptor="com.itt.plugins.MyFirstPlugin">
<property name="username" value="root"/>
<property name="password" value="123456"/>
</plugin>
</plugins>
- 测试
还没有评论,来说两句吧...