从源码的角度查看mybatis的执行流程。

A. 大概的执行流程图

开门见山 这里给一个大致的流程。下面会详细的一步一步的查看源码。

在这里插入图片描述

1. 配置文件的解析

那第一步肯定是读取配置文件,构建所需要的对象。

1.1 配置文件

那么基本的配置如下

在这里插入图片描述

1.2 SqlSessionFactory的创建

SqlSessionFacotry 就是根据我们的配置文件进行创建的。

在这里插入图片描述

1.3 创建流程

在这里插入图片描述

1.4 主配置文件的解析。

上面主要说了一个宏观的流程,具体的细节,没有点进去查看。

扫描二维码关注公众号,回复: 12656721 查看本文章

下面来查看一下,其配置文件时如何进行解析的。

在这里插入图片描述

1.5 Mapper 文件的解析

上面的主配置文件解析完了,那么没见到 Mapper 文件的解析在哪啊?

其实,在解析主配置文件中的<mapper> 标签的时候就已经对那些mapper.xml 文件进行了解析,并且保存到了mybatisConfiguration对象中。

请看下图:

在这里插入图片描述

具体怎么解析的,怎么保存的,就需要点进去方法,查看详情

在这里插入图片描述

1.6 Configuration 对象内容展示

我上面说了。 其所有的配置信息,都保存到了一个 为Configuration 类型的变量中。

我们在完成了上面的流程之后,此对象中的内容也基本就初始化完成了。

那么来瞅瞅他里面怎么保存的吧 (利用 Debug 方式查看)

在这里插入图片描述

2. SqlSession 的获取

首先看一下代码。这句,就可以让 SqlSessionFactory 生产一个 SqlSession 对象。

在这里插入图片描述

那么是如何获取的呢?点进去查看一下(具体Executor 的创建,就不详细看了。)

在这里插入图片描述

3. Mapper 对象的获取

经过上面的流程,我们已经想配置文件解析完成,并且创建了对应的Session(内含Executor)

那么下面就应该获得mapper了,不过我们上面已经证明出了, Mapper 对象的存储,是存储到 configuration对象中的某个map中的。其中的

  • key 为接口的class 对象
  • value 为 生成此接口代理对象的 工厂对象。 类型为MapperProxyFactory

那么获取mapper 应该是 根据你传的 接口的 class 之后去 configuration 的对应的map中,根据key 去取出MapperProxyFactory 类型的value ,然后调用此工厂对象,获得 Mapper 接口的实现代理对象

那么就给我们返回此对象,之后,我们拿着这个代理对象,就可以执行我们的业务逻辑了。那么我们猜测的是否正确呢?

在这里插入图片描述

可以发现,他的确是根据我们传过去的 指定接口的class 生成了一个代理对象返回了。我们调用的是代理对象的方法。其实我这也是废话,大家都直到的事儿。

4. mapper 对象方法的执行。

我们给mybatis 接口 和 配置信息; mybatis 可以自动实现其实现类(代理类) ,然后返回给我们。我们调用的是mybatis 给我们生成的代理类。那么这个代理类的执行流程是什么呢?


那么应该从哪里看起呢?很明显,jdk的动态代理,基本的逻辑都是从 InvocationHandlerinvoke 方法开始的,所以应该找到此类。那么此类在哪呢?我们上面也说了。


首先我们找到 调用jdk 的Proxy 的方法的位置就可以找到 InvocationHandler 了。 其实上面我们也进行了阐述,也已经找到了 位置如下:

在这里插入图片描述


下面就来查看一下其方法(version 3.4.5)

在这里插入图片描述

下面就是执行的例子了,我们以条件查询为例:

在这里插入图片描述

下面就轮到 sqlSession 对其进行执行了。

在这里插入图片描述

5. 总结

总体来说,写的不咋地,这也就留给自己看看吧…

可能有很多不对的地方,欢迎大佬指正…

猜你喜欢

转载自blog.csdn.net/weixin_42041788/article/details/107978483