mybatis的流程概述
第一步:读取mybatis的配置文件和注解信息,创建配置中心 configuration,完成初始化工作
SqlSessionFacotry = new DefaultSqlSessionFactorybuilder.build(inputstream);
在通过DefaultSqlSessionFactorybuilder实例化DefaultSqlSessionFactory的时候,主要有一下几个流程:
- xmlConfigBuilder通过解析mybatis.cfg.xml的配置文件或者注解信息,解析各个节点,同时把各个节点的配置加载到配置中心去。xmlConfigBuilder主要读取如下节点 :<properties> <settings><plugins><objectfactory><objectWapper><reflectfactory><typeHandler><environment><mappers>等节点。
- 在加载mappers的节点时候,把该任务交给另外一个加载器去操作。根据mybatis.xml配置文件中<mapper>节点中参数设置package url resource class 四种映射关系选择对应的处理方式
- new xmlMapperBuilder(),在实例化xmlMapperBuilder的时候,同事生成一个 MapperBuilderAssistant(助手)。
- xmlMapperBuilder负责解析mappe.xml中的节点<mapper>下面的各个子节点(resultmap sql cache),通过助手把配置加载配置中心;然后把该xml文件读入到配置中心的set中去,最后mapper接口注册到配置中心的mapper注册中心去mapperRegister ;
<mapper>的子节点:
<cache-ref> 二级缓存的关联
<cache> 二级缓存
读取二级缓存的配置 type eviction size flushInterval readonly blocking 等属性配置。
助手负责实例化一个 new cache() -- 建造者模式
助手负责把这个cache二级缓存对象加载到配置中心;
<resultMap>结果集处理
分别读取各个结果集,属性配置包括 id, type(oftype) autoMapper extends
把每一行的配置实例成一个resultmapping, 最终是一个List集合
通过resultMap.builder建造者模式,生成对应的resultmap。
助手负责吧该resultMap加载配置中心
5.xmlMapperBuilder解析<mapper>节点中子节点 insert delete update select 这四个类型的节点试通过xmlStatementBuilder来读取配置,通过助手加载到配置中心去
读取各个配置属性并生成一个mappedstatement对象,加载到配置中心去
第二步:封装ibatis的编程模型,使用mapper的初始化
sqlsession = sqlSessionFactory.openSession();
在opensession的过程中,mybatis从配置总读取evirenomtn配置(策略模式),实例化一个tx事务工厂,创建事务对象。
根据事务对象实例化一个executor对象,该执行器接口有三个实现类bachexecutor ,reuseexecutor,simplexecutor(默认),
如果配置中配置了二级缓存,则通过装饰器模式 new cachingExecutor(),最后p'luginAll
Imapper = sqlsession.getMapper(Imapper.class);
在getMapper的过程中,配置中心有一个mapper的注册中心Map<mapper,MapperProxyFactory>,通过mapper接口获取配置中心加载的mapperProxyFacorty,实例化一个mapperProxy的代理对象
第三步 :sql的解析/参数映射 sql执行/结果解析等过程
User = Imapper.findById(1);
Mapper代理对象在调用方法时候,MapperProxy中有一个缓存Map<method,mapMethod>的缓存,其中mapmethod中绑定了map接口和map.xml文件的绑定关系和类型。
根据mapmethod中sqlcommandType选择增删查改类型。
如果有参数,把参数解析成map类型
通过rowBound生成一个默认的分页
根据返回类型和参数类型选择sqlsession中的方法,
sqlsession从配置文件中的读取mapstatement对象,并交给executor执行。
根据namepace+id/分页/sql语句/参数获取二级缓存的hashcode,有二级缓存则返回该结果,没有则查数据库,把结果放入二级缓存。
baseexecutor根据一级缓存获取hashcode,没有缓存则查询数据库
通过statementhandler 指挥preparestatementhanlder生成preparstatement,获取链接资源,做日志的增强。占位符处理
通过statement查询数据库
通过resulthandler获取配置中心的结果映射规则,处理数据结果。