IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MyBatis的插件机制及其用法 -> 正文阅读

[大数据]MyBatis的插件机制及其用法

1.前言

1.1 Mybatis四大对象

org.apache.ibatis.executor.parameter.ParameterHandler:处理SQL的参数对象
org.apache.ibatis.executor.resultset.ResultSetHandler:处理SQL的返回结果集
org.apache.ibatis.executor.statement.StatementHandler:数据库的处理对象,用于执行SQL语句
org.apache.ibatis.executor.Executor:MyBatis的执行器,用于执行增删改查操作

1.2 Mybatis插件

与其称为Mybatis插件,不如叫Mybatis拦截器,更加符合其功能定位,实际上它就是一个拦截器,应用代理模式,在方法级别上进行拦截。
??支持拦截的方法:
??1、参数处理器 ParameterHandler(getParameterObject、setParameters方法);
??2、结果集处理器ResultSetHandler(handleResultSets、handleOutputParameters等方法);
??3、SQL语法构建器StatementHandler(prepare、parameterize、batch、update、query等方法);
??4、执行器Executor(update、query、commit、rollback等方法);

1.3 拦截阶段

        String resource = "SqlMapConfig.xml";
       InputStream inputStream = Resources.getResourceAsStream(resource);
       SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
       SqlSession sqlSession = sqlSessionFactory.openSession();
       try {
           UserDynamicSQL mapper = sqlSession.getMapper(UserDynamicSQL.class);
           sqlSession.commit();
       }finally {
           sqlSession.close();
       }

1、读取mybatis的xml配置文件信息
??2、通过SqlSessionFactoryBuilder创建SqlSessionFactory对象
??3、通过SqlSessionFactory获取SqlSession对象
??4、执行SqlSession对象的selectList方法,查询结果
??5、关闭SqlSession

如下是时序图,在整个时序图中,涉及到mybatis插件部分已标红,基本上就是体现在上文中提到的四个类上,对这些类上的方法进行拦截在这里插入图片描述

2.源码分析

2.1 过程

我们从四大对象的创建为入口,逐步分析整个插件的使用过程。
??以StatementHandler为例,找到它的源码:

在这里插入图片描述
在这里插入图片描述
实现类

在这里插入图片描述
下面的xxxStatementHandler都继承了BaseStatementHandler,所以我们直接看BaseStatementHandler,观察它的构造方法:

在这里插入图片描述
可以看到,在创建BaseStatementHandler时,也顺带创建了ParameterHandler和ResultSetHandler,点进去看这两个对象的创建方法:

在这里插入图片描述
发现这些可拦截的类对应的对象生成都是通过InterceptorChain的pluginAll方法来创建的,进一步观察pluginAll方法,如下:

在这里插入图片描述
遍历所有拦截器,调用拦截器的plugin方法生成代理对象,注意生成代理对象重新赋值给target,所以如果有多个拦截器的话,生成的代理对象会被另一个代理对象代理,从而形成一个代理链条,执行的时候,依次执行所有拦截器的拦截逻辑代码;
??继续看这个plugin方法:

在这里插入图片描述

plugin方法里面根据target类型进行返回,如果是StatementHandler类型的,就执行Plugin.wrap方法,其实这就是一个包装方法,输入两个对象,一个的被代理对象,一个是PaginationInterceptor自身。
??继续看这个wrap方法
在这里插入图片描述
典型的动态代理实现,调用的是Proxy.newProxyInstance方法来生成代理对象。

2.2 小结

由于真正去执行Executor、ParameterHandler、ResultSetHandler和StatementHandler类中的方法的对象是代理对象,所以在执行方法时,首先调用的是Plugin类(实现了InvocationHandler接口)的invoke方法,如下:

在这里插入图片描述
可以关注下Interceptor接口的intercept方法实现,一般需要用户自定义实现逻辑,其中有一个重要参数,即Invocation类,通过改参数我们可以获取执行对象,执行方法,以及执行方法上的参数,从而进行各种业务逻辑实现,一般在该方法的最后一句代码都是invocation.proceed()(内部执行method.invoke方法),否则将无法执行下一个拦截器的intercept方法。

以上逻辑对应的时序图如下,这里我们以执行executor对象的query方法为例,且假设有两个拦截器存在:

在这里插入图片描述

3.使用方法

3.1 注册插件

注册插件的方法有两种:
第一种:单纯使用Mybatis,在Mybatis的配置文件注册:

<plugins>
	<plugin interceptor="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></plugin>
</plugins>

第二种,和Spring整合的Mybatis,在Spring的配置文件中注册:

<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
	<!-- 数据源 -->
	<property name="dataSource" ref="dataSource"></property>
	<property name="configLocation" value="classpath:mybatis-config.xml"></property>
		
	<!-- 插件注册 -->
	<property name="plugins">
		<list>
			<!-- 注册分页插件 -->
			<bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></bean>	
		</list>	
		
	</property>	
</bean>

4.总结

简单的说,mybatis插件就是对ParameterHandler、ResultSetHandler、StatementHandler、Executor这四个接口上的方法进行拦截,利用JDK动态代理机制,为这些接口的实现类创建代理对象,在执行方法时,先去执行代理对象的方法,从而执行自己编写的拦截逻辑,所以真正要用好mybatis插件,主要还是要熟悉这四个接口的方法以及这些方法上的参数的含义;
??
另外,如果配置了多个拦截器的话,会出现层层代理的情况,即代理对象代理了另外一个代理对象,形成一个代理链条,执行的时候,也是层层执行;

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-04 11:06:05  更:2022-02-04 11:08:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:01:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码