MyBatis插件开发基础
发布日期:2021-05-07 13:38:28 浏览次数:19 分类:精选文章

本文共 2471 字,大约阅读时间需要 8 分钟。

四个处理: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中配置:

...
...

拦截器默认执行顺序:setProperties --> plugin --> intercept

如果有多个拦截器(拦截器链),执行顺序则如下图所示:
在这里插入图片描述

上一篇:MyBatis批量操作DML
下一篇:MyBatis中不同数据库的差异

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年03月23日 02时08分57秒