核心对象的生命周期
核心对象 | 生命周期 | 描述 |
---|---|---|
SqlSessionFactoryBuilder | 方法局部 | 只需要使用一次,用于构建SqlSessionFactory |
SqlSessionFactory | 应用级别 | 全局单例,SqlSession工厂 |
SqlSession | 会话级别 | 每次访问DB都需要使用SqlSession |
Mapper | 方法级别 | 每次从SqlSession获取实例(实际是MapperProxy代理对象) |
工作流程及源码解读
- (1) 解析配置文件,创建全局Configuration(全局只执行一次)
- (1.1) 解析mapper.xml,生成对应的MapperStatement和MapperProxyFactory(每个Mapper.xml都是独立的)
- (2) 创建SqlSessionFactory(全局只执行一次)
- (3) 创建SqlSession(每当操作数据库时创建)
- (3.1) 同时创建Executor(默认Simple),二级缓存通过装饰器CachingExecutor包装Executor,并且interceptorChain创建executor代理。
- (3.1) 同时创建Executor(默认Simple),二级缓存通过装饰器CachingExecutor包装Executor,并且interceptorChain创建executor代理。
- (4)获取Mapper(实际上是MapperProxy代理)
- (4.1) MapperRegistry是全局解析Configuration成员属性,knowMappers为mapper.xml解析得到的namespace即MapperProxyFactory工厂类;Mapper实际是MapperProxy的jdk代理类
- (4.1) MapperRegistry是全局解析Configuration成员属性,knowMappers为mapper.xml解析得到的namespace即MapperProxyFactory工厂类;Mapper实际是MapperProxy的jdk代理类
- (5) 调用Mapper接口方法(操作数据库)
- (5.1) 调用Mapper接口方法实际上执行MapperProxy的代理类invoke方法
- (5.2) 查询Query操作
- (5.2.1) 根据不同的结果类型,执行不同的方法;以returnsMap为例
- (5.2.2) 调用Executor执行器负责核心操作;一级缓存LocalCache:PerpetualCache真面目;CacheKey组成部分;
- (5.2.3) 创建StatementHandlder,并且用interceptorChain创建其代理;默认StatementType为PREPARED
- (5.2.4) StatementHandlder构造方法同时创建parameterHandler,resultSetHandler;
- (5.2.5) StatementHandler预编译动态SQL
- (5.2.6) StatementHandler调用paramterHandler设置参数
- (5.2.7) StatementHandler执行真正的query操作
- (5.2.8) 调用resultHandler处理结果集
- (5.2.7) StatementHandler执行真正的query操作
- (5.2.1) 根据不同的结果类型,执行不同的方法;以returnsMap为例
- (5.1) 调用Mapper接口方法实际上执行MapperProxy的代理类invoke方法
核心流程调用链
1 获取SqlSession会话
- SqlSession持有Configuration,可获取全局配置信息
- 持有Executor,一级缓存就在Executor实现的。
- DefaultSqlSessionFactory,Configuration,MapperRegistry,MapperProxyFactory 都是全局单例,在解析Mybatis配置时创建;
- 每一个Mapper.xml都被解析并创建对应的MapperProxyFactory, 保存在Configuration中;
2 执行查询操作
- 查询操作 ,可被插件代理有6处地方,已在序列图备注;
四大对象生命周期
对象 | 生命周期 |
---|---|
Executor | 会话级别 |
StatementHandler | SqlSession方法级别 |
ParameterHandler | SqlSession方法级别 |
ResultSetHandler | SqlSession方法级别 |