标签:inter UNC nts 默认 变更 强制 statement img tar
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 的实现方法