首先我們需要了解mybatis初始化大致做了什麼
1. 創建SqlSessionFactory
2. 通過SqlSessionFactory來創建sqlSession
那麼初始化中創建SqlSessionFactory需要什麼,配置文件和mapper文件如何加載,如何調用sql等到底是如何實現的呢,接下來就進入源碼解讀
爲了創建SqlSessionFactory,mybatis需要讀取配置文件並且注入大量屬性值
因爲使用的spring配置的Mybatis,所以使用SqlSessionFactoryBean的buildSqlSessionFactory方法
其中創建了Configuration和XmlConfigBuilder,在初始化過程中起着重要作用
buildSqlSessionFactory方法前部都在將spring中的配置信息設置到Configuration對象中。
例如下圖:向Configuration注入了spring的事務管理
接下來重點來了,當檢測到mapperLocations時,即mapper文件的所在路徑時,開始解析配置文件
重點介紹這個方法xmlMapperBuilder.parse()
parse()方法中有兩個重要方法
- configurationElement
- bindMapperForNamespace
(1)configurationElement方法主要做了:
1. 組裝builderAssistant,用於存儲組裝時需要的參數
2. 繼續給Configuration添加屬性,如緩存、命名空間
3. buildStatementFromContext負責解析sql
buildStatementFromContext方法,該方法的入參是標籤爲“select|insert|update|delete”的節點,分別對應一個XNode,隨後遍歷獲取節點的屬性,傳入builderAssistant.addMappedStatement()方法。這個方法返回MappedStatement,保存着mapper每個標籤下的所有信息。每個MappedStatement組裝完成後都會保存到Configuration中去
(2)bindMapperForNamespace方法主要用於:
將MappedStatement與Namespace綁定在一起,並在MapperRegistry中的knownMappers(一個保存着mapper代理類的map)添加一個代理類
最後,parse結束返回configuration,根據configuration創建SqlSessionFactory
到這裏SqlSessionFactory創建完畢,創建過程中的所有屬性配置全部由一個configuration帶入。