Mybatis源码分析之插件模块

简介: Mybatis源码分析之插件模块

今天给大家带来的是关于Mybatis的相关知识,文章围绕着Mybatis插件模块展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下

Mybatis插件模块

插件这个东西一般用的比较少,就算用的多的插件也算是PageHelper分页插件;

PageHelper官网:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md

官网上这个也有谈到Mybatis的插件流程分析。

使用示例

插件类

记录SQL执行的时间,

1、在JDK8之前必须实现Interceptor接口中的三个方法,在JDK8之后只需要实现intercept方法即可;

2、加上@Intercepts注解,并且附加上需拦截的类型以及方法@Signature:

type:插入的类,即指定的四个类型;

method:拦截插入类的方法;

args:拦截插入类方法的参数类型,按顺序。

3、实现的plugin方法,必须执行Plugin.wrap(target, this);JDK8之后在接口中写了默认方法。

@Intercepts({
    @Signature(type = StatementHandler.class, method = "query", args = { Statement.class, ResultHandler.class })
})
public class ThresHolderPlugin implements Interceptor {
  
    int threshold = 0;
     
    public Object intercept(Invocation invocation) throws Throwable {
        long start = System.currentTimeMillis();
        Object proceed = invocation.proceed();
        long end = System.currentTimeMillis();
         
        System.out.println("select time: " + (end-start) + "ms");
         
        return proceed;
    }
  
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }
  
    public void setProperties(Properties properties) {
        this.threshold = Integer.valueOf(properties.getProperty("value"));
        System.out.println("threshold :" + threshold);
    }
  
}

配置文件

<plugins>
        <plugin interceptor="com.test.mybatis.MybatisTest.official.plugin.ThresHolderPlugin">
            //数据会传输到插件类的Properties
            <property name="value" value="10"></property>
        </plugin>
    </plugins>

设计模式

责任链模式(Chain of Responsibility Pattern)

为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

责任链模式优点:

降低耦合度。它将请求的发送者和接收者解耦。

简化了对象。使得对象不需要知道链的结构。

增强给对象指派职责的灵活性。通过改变链内 的成员或者调动它们的次序,允许动态地新增 或者删除责任。

增加新的请求处理类很方便。

UML:

图片.png

Handler:定义了一个处理请求的标准接口;

ConcreteHandler:具体的处理者,处理它负 责的部分,根据业务可以结束处理流程,也可 以将请求转发给它的后继者;

client :发送者,发起请求的客户端;

源码分析

在之前谈到Mybatis的核心流程分析中在加载Mybatis的配置文件的时候会把所有的插件加载带Configuration对象中的InterceptorChain变量当中,

图片.png

如果有多个插件类的话,因为InterceptorChain类储存插件类是有序集合,所以执行插件的顺序就是在xml配置插件的顺序;

在Configuration类中:

图片.png

这里有个CacheExecutor执行器,当开启了二级缓存的时候,就是选用缓存执行器,使用是装饰器模式将真正的执行器包装了一层。

我们现在看一下这个pluginAll方法:

图片.png

图片.png

使用动态代理将真正的对象进行增强;

图片.png

在之前那个方法中,必须执行Invocation的proceed()方法,这个方法就是执行method.invoke()方法;

图片.png

如果有多个插件的话,那么就会出现重复代理对象,那么重复代理对象的执行的话,执行过程如下:

图片.png

这就是责任链模式,一层嵌套着一层。

在配置XML文件中配置:

<plugins>
    <plugin interceptor="com.test.mybatis.MybatisTest.official.plugin.ThresHolderPlugin">
        <property name="value" value="10"></property>
    </plugin>
    <plugin interceptor="com.test.mybatis.MybatisTest.official.plugin.ThresHolderPlugin2">
        <property name="value" value="20"></property>
    </plugin>
</plugins>

那么执行的过程就是:

ThresHolderPlugin2{

         ThresHolderPlugin{

               interceptor.intercept(new Invocation(target, method, args))

         }

到此这篇关于Mybatis源码分析之插件模块的文章就介绍到这了,更多相关Mybatis插件模块内容请搜索"java开发全栈"以前的文章或继续浏览下面的相关文章希望大家以后多多支持"java开发全栈"!

相关文章
|
3月前
|
SQL XML Java
8、Mybatis-Plus 分页插件、自定义分页
这篇文章介绍了Mybatis-Plus的分页功能,包括如何配置分页插件、使用Mybatis-Plus提供的Page对象进行分页查询,以及如何在XML中自定义分页SQL。文章通过具体的代码示例和测试结果,展示了分页插件的使用和自定义分页的方法。
8、Mybatis-Plus 分页插件、自定义分页
|
5天前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
70 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
5天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
28天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
48 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
242 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
2月前
|
SQL Java 数据库连接
解决mybatis-plus 拦截器不生效--分页插件不生效
本文介绍了在使用 Mybatis-Plus 进行分页查询时遇到的问题及解决方法。依赖包包括 `mybatis-plus-boot-starter`、`mybatis-plus-extension` 等,并给出了正确的分页配置和代码示例。当分页功能失效时,需将 Mybatis-Plus 版本改为 3.5.5 并正确配置拦截器。
513 6
解决mybatis-plus 拦截器不生效--分页插件不生效
|
1月前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
105 0
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
2月前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
3月前
|
Java 数据库 Spring
MyBatisPlus分页插件在SpringBoot中的使用
这篇文章介绍了如何在Spring Boot项目中配置和使用MyBatis-Plus的分页插件,包括创建配置类以注册分页拦截器,编写测试类来演示如何进行分页查询,并展示了测试结果和数据库表结构。
MyBatisPlus分页插件在SpringBoot中的使用
|
4月前
|
SQL 监控 Java
IDEA插件-Mybatis Log Free日志替换
MyBatis Log Free 是一个免费的用于在 IntelliJ IDEA 中显示 MyBatis 日志的插件。它可以帮助您更方便地查看和分析 MyBatis 的 SQL 执行情况,以及定位潜在的性能问题,提高开发效率。
370 0
IDEA插件-Mybatis Log Free日志替换