一直想知道mybatis是如何解析xml文件的,今天認真看了下源碼,這裏記錄一下
這裏是用mybatis-spring的SqlSessionFactoryBean當作的入口,mybatis-spring其實很簡單,源碼也就幾個看看就懂了,代理了一下而已沒啥東東.
1.解析spring的配置
不過很多參數都是spring中來處理了,所以mybatis-spring沒有先parse而是先加載了配置文件
依次是
- typeAliasesPackage
- typeAliases
- Plugins
- typeHandlersPackage
- typeHandlers
typeAliases
相當於加載了上面的typeAliases,plugins,typeHandlers
然後typeAliases put到TYPE_ALIASES供查詢時調用類型轉換
Plugins
攔截器也private final List<Interceptor> interceptors = new ArrayList<Interceptor>();
這裏用的ArrayList所以是自頂向下按照順序執行的
typeHandlers
Typehandler 也是put到private final Map<Class<?>, Map<JdbcType, TypeHandler>> TYPE_HANDLER_MAP = new
HashMap<Class<?>, Map<JdbcType, TypeHandler>>();到時候使用
2.解析我們自己配置的configLocation.xml
解析的內容,內容和前面已經後面雷同這裏就不多說了
3.生成環境變量,貌似作用不大-因爲都被spring接管了哈
4.解析sql文件!重點來了
依次是命名空間,緩存,parameterMap貌似沒啥用了這個,resultMap重點,複用sql,執行sql
命名空間就不說了
4.1緩存創建
緩存是根據命名空間來做的,每個命名空間new一個緩存
cache中mybatis也比較簡單先用map實現一個PerpetualCache,然後用裝飾器模式,弄一堆緩存,包括LRU,Fifo,Scheduled等帶有附加功能的緩存,其實調用的還是PerpetualCache,默認的是LRU,說一下LRU實現及其簡單,是用的LinkedHashMap訪問排序功能,簡易實現了,然後後面的sql就會調用了,這裏顯示下cacheKey的生成
用了很多條件確保了key的唯一性
4.2resultMap
4.2.1解析一下簡單參數
4.2.1ResultMapping 其實就是我們寫的result的java對象
然後解析xml把值配置到對象中
4.2.4這些參數以及這個list組合成爲一個resultMap
4.3重複的sql
這個簡單直接put到
4.4執行sql
首先是設置一堆屬性
通過一系列的hanlder把動態xml解析
然後拼裝成爲
這個對象是及其重要的,基本上包含了一個sql的所有信息,之後查詢的時候就可以根據這個信息來進行反射set對象了
到這裏mybatis也基本上初始化完成了