Mybatis運行原理簡要分析
1.SqlSessionFactory的構建
SqlsessionFactory主要用來創建SqlSession,爲了構建SqlsessionFactory,需要提供配置文件以及相關參數。
構建主要分爲2步:
- 解析配置文件並生成Configuration對象。
- 通過Configuration創建SqlSessionFactory。
1.1構建Configuration
它的作用如下:
- 讀取配置文件,包括基礎配置的XML和映射器的文件。
- 初始化基礎配置信息,如properties全局參數、settings設置、typeAliases別名、typeHandler類型處理器、ObjectFactory對象、plugin插件、environment環境、Mapper引射器、數據庫標識。
- 提供單例,爲後續創建SessionFactory服務並提供配置的參數。
- 執行一些重要的對象方法,初始化配置信息。
1.2映射器的組成
一般由3部分組成。
- MappedStatement,保存映射器的一個節點(select/insert/delete/update)。包括配置的SQL、SQL的id、緩存信息、resultMap、resultType、parameterType、languageDriver等。
- SqlSource,提供BoundSql對象的地方,是上面部分的一個屬性。是一個接口,用來組裝SQL。
- BoundSql,用於建立SQL和參數。
其中BoundSql提供3個主要的屬性:
- parameterMappings:一個List用來描述參數信息,比如屬性、名稱、表達式、javaType、jdbcType、typeHandler等。並與PreparedStatment結合來設置參數。
- paeameterObject:用於傳遞簡單對象、POJO、Map、@Param註解的參數。傳遞簡單對象,如int、String、double,將他們包裝爲對應的對象傳遞;POJO、Map報出不變;傳遞多個參數是,如有@Param註解則變爲Map<String,Object>對象,類似於如下所示,可以使用#{param1}或者#{1}去引用第一個參數。
{"1":p1,"2":p2,...,"param1":p1,"param2":p2,...}
如果使用@Param註解,則會把註解中的字段作爲Map對象中的key。
- sql,即在映射器中編寫的每條SQL。
1.3構建SqlSessionFactory
String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream);
2.SqlSession的運行
2.1映射器的動態代理
Mapper映射過程不僅利用了動態代理模式,還有命令模式。
2.2SqlSession的對象
通過執行以下4個步驟來完成數據庫操作和結果返回。
- Executor執行器,調度以下3種對象來執行對應的SQL。
- StatementHandler使用數據庫的Statement/PreparedStatement執行操作。
- ParameterHandler用於SQL對參數的處理。
- ResultHandler封裝數據集Result並返回。