1. 概述
在前面,我们已经详细解析了 MyBatis 执行器 Executor 相关的内容,但是显然,Executor 是不适合直接暴露给用户使用的,而是需要通过 SqlSession 。
流程如下图:

示例代码如下:
而本文解析的类,都在 session 包下,整体类图如下:
老艿艿:省略了一部分前面已经解析过的类。

- 核心是 SqlSession 。
- SqlSessionFactory ,负责创建 SqlSession 对象的工厂。
- SqlSessionFactoryBuilder ,是 SqlSessionFactory 的构建器。
下面,我们按照 SqlSessionFactoryBuilder => SqlSessionFactory => SqlSession 来详细解析。
2. SqlSessionFactoryBuilder
org.apache.ibatis.session.SqlSessionFactoryBuilder ,SqlSessionFactory 构造器。代码如下:
- 提供了各种 build 的重载方法,核心的套路都是解析出 Configuration 配置对象,从而创建出 DefaultSqlSessionFactory 对象。
3. SqlSessionFactory
org.apache.ibatis.session.SqlSessionFactory ,SqlSession 工厂接口。代码如下:
- 定义了
#openSession(...) 和 #getConfiguration() 两类方法。
3.1 DefaultSqlSessionFactory
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory ,实现 SqlSessionFactory 接口,默认的 SqlSessionFactory 实现类。
3.1.1 构造方法
3.1.2 openSession
-
调用 #openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) 方法,获得 SqlSession 对象。代码如下:
- DefaultSqlSession 的创建,需要
configuration、executor、autoCommit 三个参数。
-
#openSessionFromConnection(ExecutorType execType, Connection connection) 方法,获得 SqlSession 对象。代码如下:
3.1.3 getTransactionFactoryFromEnvironment
3.1.4 closeTransaction
4. SqlSession
org.apache.ibatis.session.SqlSession ,SQL Session 接口。代码如下:
4.1 DefaultSqlSession
org.apache.ibatis.session.defaults.DefaultSqlSession ,实现 SqlSession 接口,默认的 SqlSession 实现类。
4.1.1 构造方法
4.1.2 selectList
4.1.3 selectOne
- 内部调用
#selectList(String statement, Object parameter) 方法,进行实现。
4.1.4 selectMap
#selectMap(...) 方法,查询结果,并基于 Map 聚合结果。代码如下:
4.1.5 selectCursor
4.1.6 select
#select(..., ResultHandler handler) 方法,执行查询,使用传入的 handler 方法参数,对结果进行处理。代码如下:
4.1.7 wrapCollection
在上述的查询方法中,我们都可以看到一个 #wrapCollection(final Object object) 方法,若参数 object 是 Collection、Array、Map 参数类型的情况下,包装成 Map 返回。代码如下:
4.1.8 update
<1> 处,标记 dirty ,表示执行过写操作。该参数,会在事务的提交和回滚,产生其用途。
<2> 处,获得 MappedStatement 对象。
<3> 处,调用 Executor#update(MappedStatement ms, Object parameter) 方法,执行更新操作。
4.1.9 insert
4.1.10 delete
4.1.11 flushStatements
#flushStatements() 方法,提交批处理。代码如下:
4.1.12 commit
4.1.13 rollback
4.1.14 close
#close() 方法,关闭会话。代码如下:
4.1.15 getConfiguration
4.1.16 getMapper
4.1.17 getConnection
4.1.18 clearCache
5. SqlSessionManager
org.apache.ibatis.session.SqlSessionManager ,实现 SqlSessionFactory、SqlSession 接口,SqlSession 管理器。所以,从这里已经可以看出,SqlSessionManager 是 SqlSessionFactory 和 SqlSession 的职能相加。
5.1 构造方法
- 比较有意思的有两点,我们逐条来看。
<1> 处,localSqlSession 属性,线程变量,记录当前线程的 SqlSession 对象。
<2> 处,创建 SqlSession 的代理对象,而方法的拦截器是 SqlSessionInterceptor 类。详细解析,见 「5.6 SqlSessionInterceptor」 。
5.2 newInstance
#newInstance(...) 静态方法,创建 SqlSessionManager 对象。代码如下:
5.3 startManagedSession
#startManagedSession(...) 方法,发起一个可被管理的 SqlSession 。代码如下:
- 可能胖友很难理解“可被管理”的 SqlSession 的意思?继续往下看。
5.4 对 SqlSessionFactory 的实现方法
- 直接调用
sqlSessionFactory 对应的方法即可。
5.5 对 SqlSession 的实现方法