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