天天看點

mybatis源碼 解讀 --- 主要流程                                   mybatis的流程概述   第一步:讀取mybatis的配置檔案和注解資訊,建立配置中心                                  configuration,完成初始化工作  第二步:封裝ibatis的程式設計模型,使用mapper的初始化 第三步 :sql的解析/參數映射 sql執行/結果解析等過程

                                   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擷取配置中心的結果映射規則,處理資料結果。

繼續閱讀