从源码的角度查看mybatis的执行流程。
文章目录
A. 大概的执行流程图
开门见山 这里给一个大致的流程。下面会详细的一步一步的查看源码。
1. 配置文件的解析
那第一步肯定是读取配置文件,构建所需要的对象。
1.1 配置文件
那么基本的配置如下
1.2 SqlSessionFactory的创建
SqlSessionFacotry 就是根据我们的配置文件进行创建的。
1.3 创建流程
1.4 主配置文件的解析。
上面主要说了一个宏观的流程,具体的细节,没有点进去查看。
下面来查看一下,其配置文件时如何进行解析的。
1.5 Mapper 文件的解析
上面的主配置文件解析完了,那么没见到 Mapper 文件的解析在哪啊?
其实,在解析主配置文件中的
<mapper>
标签的时候就已经对那些mapper.xml 文件进行了解析,并且保存到了mybatis
的Configuration
对象中。
请看下图:
具体怎么解析的,怎么保存的,就需要点进去方法,查看详情
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的动态代理,基本的逻辑都是从
InvocationHandler
的invoke
方法开始的,所以应该找到此类。那么此类在哪呢?我们上面也说了。
首先我们找到 调用jdk 的Proxy 的方法的位置就可以找到
InvocationHandler
了。 其实上面我们也进行了阐述,也已经找到了 位置如下:
下面就来查看一下其方法(version 3.4.5)
下面就是执行的例子了,我们以条件查询为例:
下面就轮到 sqlSession 对其进行执行了。
5. 总结
总体来说,写的不咋地,这也就留给自己看看吧…
可能有很多不对的地方,欢迎大佬指正…