接上一节,在获取完SqlSessionFactory之后,我们希望通过SqlSessionFactory得到SqlSession
1. 获取SqlSession
1. 获取一个SqlSession2. 进入DefaultSqlSessionFactory#openSessionFromDataSource
2. 进入openSessionFromDataSource3. 详细解答该方法
3. 核心方法3.1. 获取一个Environment实例
这个实例是我们在mybatis-config.xml中进行定义的
3.1.1 在mybatis-config.xml中定义了environment 3.1.2 Environment的实例3.2 获取一个事务管理器工厂
这个事物管理器工厂来源于configuration实例中的environtment
3.2.1 获取事物管理器工厂3.3 获取一个事物管理器
事物管理器有两种:一种是jdbc事务管理器,一种是manage事务管理器。前者使用了jdbc的提交和回滚设置,依赖于数据源得到的连接来管理事务的范围。后者则是从来不回滚和提交事务,他将控制权转交给容器来完成事务。默认情况下他会关闭连接,因此部分容器不希望关闭连接的话,需要设置closeConnection的属性值为false。如果我们使用的是spring容器,那么我们不需要配置mybatis中的事务管理器,因此spring自带的事务管理器会覆盖掉mybatis的配置。
3..3.1 从工厂中获取一个事物管理器 3.3.2 创建了一个jdbc事物管理器3.4 创建一个Executor执行器
默认采用的executor的实例是
3.4.1 创建了一个executor执行器的实例如果设置了开启一级缓存的话,那么我们程序会继续创建一个缓存执行器,然后将之前创建的执行器作为缓存执行器的一个代理执行器。那么当我们需要查找数据的时候,如果可以利用缓存的话,那么就先到缓存执行器中寻找数据,如果没有找到数据,才会交给代理执行器去数据库中查找数据。
3.4.2 创建了一个缓存执行器然后将执行器丢到拦截器链中,是拦截器有机会拦截该对象
3.4.3 将执行器放入拦截器链中由此,完成了一个执行器的实例操作。
3.5 打开SqlSession
3.5 实例化一个SqlSession由此,我们完成了整个获取SqlSession的操作。
网友评论