1.上个文章总结
上个文章,我们看到了Mybatis是如何通过new SqlSessionFactoryBuild().build(redear);构造一个关键的configuration,其中底层又是分别由XmlConfiguationBuild,XmlMapperBuild,XmlStatementBuild来解析并构造相应的数据,封装进configuration配置类。接下来,让我们探寻下一个关键语句sqlSessionFactory.openSession();如何创建一个session会话的。
2.找一个源码上的demo
我们找到个这个测试类BaseTest(src\test\java\org\apache\ibatis\submitted\global_variables\BaseTest.java)
从sqlSessionFactory.openSession();这个方法一路往下点,选择这个实现类DefaultSqlSessionFactory,找到关键方法openSessionFromDataSource();
然后我们在网上也看了别人写的源码,所以知道,其中Excutor 执行器比较重要,是sql执行器,我们继续点进去看这个方法
关于 ExecutorType 有三种类型:
SIMPLE
REUSE
BATCH
详细解释参考: Mybatis中的ExecutorType
简单总结为:
SimpleExecutor 是一种常规执行器,每次执行都会创建一个statement,用完后关闭。
ReuseExecutor 是可重用执行器,将statement存入map中,操作map中的statement而不会重复创建statement。
BatchExecutor 是批处理型执行器,doUpdate预处理存储过程或批处理操作,doQuery提交并执行过程。
3.翻一下session.getMapper(Mapper.class) 看看
点进去看看,我们会发现,这个是通过 configuration-->MapperRegistry-->MapperProxyFactory,最后创建一个代理类,如下:
3.通过MapperProxyFactory 创建的MapperProxy代理类
恭喜咱们,现在应该是找到核心调用方法了:
(找到具体代理类,就找到具体如何执行的方法)
4. MapperMethod 方法具体执行者
然后我们点进这个execute(sqlSession,arhs)的的具体方法执行进去看看,方法执行的源码就在这里
5. 选择一个Session的执行,进去看看具体如何实现
继续往下点,通过执行器executor.update(ms, wrapCollection(parameter));执行语句,选择BaseExecutor,基本的三种执行器 都是继承此类.,所以继续往下看;
6.底层是用StatementHandler 去处理要执行的语句,我们此时选择的是SimpleExecutor执行器
7.Mybatis 核心组件,总结
cv一下别人的总结,哈哈:
组件名 功能
Configuration Mybatis 所有的配置信息都维持在Configuration 对象之中
SqlSession 作为Mybatis 工作的主要顶层API,表示和数据库交互的会话,完成数据库增删查改功能
Executor Mybatis 执行器,是Mybatis 调度的核心,负责SQL
StatementHandler 封装了JDBC Statement 操作,负责对JDBC statement 的操作,如设置参数,将 Statement 结果集转换为List 集合
ParameterHandler 负责对用户传递的参数转换为JDBC Statement 所需要的参数
ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换为List 类型的集合
MappedStatement MappedStatement 维护了一条<select
MapperProxy,MapperProxyFactory Mapper 代理,使用原生的Proxy 执行mapper 里的方法
8.Mybatis 用到的设计模式
工厂模式::SqlSessionFactory、TransactionFactory、LogFactory
代理模式:MapperProxy、ConnectionLogger
策略模式:Executor(抽象类BaseExecutor的各种sql执行,对应的不同Executor实现的策略)
单例模式:ErrorContext、LogFactory
===================================================================== [手把手看mybatis源码(3.2.x)-1]
回复