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