mybatis源码 解读 --- 主要流程

                                   mybatis的流程概述

   第一步:读取mybatis的配置文件和注解信息,创建配置中心                                  configuration,完成初始化工作

     SqlSessionFacotry  =  new DefaultSqlSessionFactorybuilder.build(inputstream);

       在通过DefaultSqlSessionFactorybuilder实例化DefaultSqlSessionFactory的时候,主要有一下几个流程:

  1.         xmlConfigBuilder通过解析mybatis.cfg.xml的配置文件或者注解信息,解析各个节点,同时把各个节点的配置加载到配置中心去。xmlConfigBuilder主要读取如下节点  :<properties> <settings><plugins><objectfactory><objectWapper><reflectfactory><typeHandler><environment><mappers>等节点。
  2. 在加载mappers的节点时候,把该任务交给另外一个加载器去操作。根据mybatis.xml配置文件中<mapper>节点中参数设置package url resource class 四种映射关系选择对应的处理方式
  3. new xmlMapperBuilder(),在实例化xmlMapperBuilder的时候,同事生成一个 MapperBuilderAssistant(助手)。
  4. 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获取配置中心的结果映射规则,处理数据结果。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值