Mybatis插件

文章目录

  • 1. 如何自定义插件
    • 1.1 创建接口Interceptor的实现类
    • 1.2 配置拦截器
    • 1.3 运行程序
  • 2. 插件原理

1. 如何自定义插件

1.1 创建接口Interceptor的实现类

/**
 * @author Clinton Begin
 */
public interface Interceptor {

  // 执行拦截逻辑的方法
  Object intercept(Invocation invocation) throws Throwable;

  // 决定是否触发 intercept()方法
  default Object plugin(Object target) {
    return Plugin.wrap(target, this);
  }

  // 根据配置 初始化 Intercept 对象
  default void setProperties(Properties properties) {
    // NOP
  }

}

mybatis运行拦截的内容包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

定义一个实现类。


/**
 * MyBatis中的自定义的拦截器
 *
 * @Signature 表示一个方法签名,唯一确定一个方法
 */
@Intercepts(
        {@Signature(
                type = Executor.class, // 拦截类型
                method = "query", // 拦截方法
                // args 中指定 被拦截方法的 参数列表
                args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
                @Signature(
                        type = Executor.class,
                        method = "close",
                        args = {boolean.class})
        })
public class MyInterceptor implements Interceptor {

    private String interceptorName;

    public String getInterceptorName() {
        return interceptorName;
    }

    /**
     * 执行拦截的方法
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("------MyInterceptor  before---------");
        Object proceed = invocation.proceed();
        System.out.println("------MyInterceptor  after---------");
        return proceed;
    }

    @Override
    public Object plugin(Object target) {
        return Interceptor.super.plugin(target);
    }

    @Override
    public void setProperties(Properties properties) {
        System.out.println("setProperties : " + properties.getProperty("interceptorName"));
        this.interceptorName = properties.getProperty("interceptorName");
    }
}

1.2 配置拦截器

 <plugins>
        <plugin interceptor="com.boge.interceptor.MyInterceptor">
            <property name="interceptorName" value="myInterceptor"/>
        plugin>
 plugins>

1.3 运行程序

    @Test
    public void test2() throws Exception{
        // 1.获取配置文件
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        // 2.加载解析配置文件并获取SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        // 3.根据SqlSessionFactory对象获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        // 4.通过SqlSession中提供的 API方法来操作数据库
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Integer param = 1;
        User user = mapper.selectUserById(param);
        System.out.println(user);
}

拦截的query方法和close方法的源码位置在如下:
Mybatis插件_第1张图片
Mybatis插件_第2张图片
Mybatis插件_第3张图片

2. 插件原理

你可能感兴趣的:(#,MyBatis,mybatis,java)