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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章