mybatis初始化分析二之SqlSession

我们知道通过初始化了SqlSessionFactory之后可以实例化出一个默认的DefaultSqlSessionFactory。那么通过这个全局唯一的单利工厂,可以生成我们每次需要使用的sqlsession会话实例

源码分析如下:

1

我们知道sqlSessionFactory接口有以下方法

2

而mybatis默认实现类是DefaultSqlSessionFactory,接下去看一下这个实现类的真面目

3
4

这里简单说一下,mybatis的三种执行器类型

ExecutorType 枚举类

    SIMPLE:简易执行器,不配置就采用这种

    REUSE:一种执行器重用预处理语句

    BATCH:执行器重用语句和批量更新,专门针对批量专用的执行器

mybatis会根据执行器类型去初始化不同的执行器Executor。后面会说明Executor在mybatis执行过程中的作用是什么。

继续往下看

5


6


7


简要分析:

    1:通过从环境中获取到其中的事物工厂,并通过该事物工厂每次都new一个事物。

    2:通过执行器类型初始化不同的执行器

    3:初始化DefaultSqlSession

获取到sqlsession之后,就是调用sqlsession的getMapper方法去获取到映射器的实例。

下面重点分析 sqlSession.getMapper(Class class)

8

再继续向下看,找到Configuration.getMapper(type, sqlsession);

9


10


11


12


13

下面重点分析这个方法:

    1:简单分析一下,通过映射器的Class type去knownMappers这个HashMap中找到对应的MapperProxyFactory实例

    2:通过MapperProxyFactory去获取一个映射器的代理类 mapperProxyFactory.newInstance(sqlsession);

13

该方法分两步:

    1:首先 new 一个MapperProxy实例出来,这个实例是做什么的呢?继续查看MapperProxy的源码

    2:将该MapperProxy实例作为一个handler去调用Proxy的newProxyInstance方法。真正生成该映射器的代理类$Proxy0。

14

原来这个MapperProxy实例就是一个InvocationHandler,通过jdk动态代理会生成一个该映射器的代理类,并在代理类的构造函数中将该handler初始化传入,最终在这个UserMapper映射器的代理类上执行一系列方法时,会最终执行该handler的invoke方法,

推荐阅读更多精彩内容