核心对象的生命周期
| 核心对象 | 生命周期 | 描述 |
|---|---|---|
| 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方法级别 |
本文深入剖析Mybatis源码,解读其核心对象如SqlSessionFactory、SqlSession、Mapper的生命周期,及工作流程。从配置文件解析到执行查询操作,详述六大核心流程调用链,包括获取SqlSession、执行查询等关键步骤。

被折叠的 条评论
为什么被折叠?



