1. 程式人生 > >Mybatis原始碼如何閱讀,教你一招!!!

Mybatis原始碼如何閱讀,教你一招!!!

## 前言 - 前一篇文章簡單的介紹了Mybatis的六個重要元件,這六劍客佔據了Mybatis的半壁江山,和六劍客搞了基友,那麼Mybatis就是囊中之物了。對六劍客感興趣的朋友,可以看看這篇文章:[Mybatis原始碼解析篇之六劍客](https://mp.weixin.qq.com/s/lnJx0h_4Kk6fKuhptN1cdg) - 有些初入門的朋友可能很害怕閱讀原始碼,不知道如何閱讀原始碼,與其我一篇文章按照自己的思路寫完Mybatis的原始碼,但是你們又能理解多少呢?不如教會你們思路,讓你們能夠自己知道如何閱讀原始碼。 ## 環境配置 - 本篇文章講的一切內容都是基於`Mybatis3.5`和`SpringBoot-2.3.3.RELEASE`。 ## 從哪入手? - 還是要說一說六劍客的故事,既然是Mybatis的重要元件,當然要從六劍客下手了,沿用上篇文章的一張圖,此圖記錄了六劍客先後執行的順序,如下: ![六劍客執行流程圖](https://gitee.com/chenjiabing666/Blog-file/raw/master/Mybatis-%E5%85%AD%E5%89%91%E5%AE%A2/3.png) - 閱讀原始碼最重要的一點不能忘了,就是開啟`DEBUG`模式,重要方法打上斷點,重要語句打上斷點,先把握整體,再研究細節,基本就不難了。 - 下面就以Myabtis的查詢語句`selectList()`來具體分析下如何閱讀。 ## 總體把握六劍客 - 從六劍客開整,既然是重要元件,原始碼執行流程肯定都是圍繞著六劍客,下面來對六劍客一一分析,如何打斷點。 - 下面只是簡單的教你如何打斷點,對於六劍客是什麼不再介紹,請看上篇文章。 ### SqlSession - 既然是介面,肯定不能在介面方法上打斷點,上文介紹有兩個實現類,分別是`DefaultSqlSession`、`SqlSessionTemplate`。那麼SpringBoot在初始化的時候到底注入的是哪一個呢?這個就要看Mybatis的啟動器的自動配置類了,其中有一段這樣的程式碼,如下: ```java //如果容器中沒有SqlSessionTemplate這個Bean,則注入 @Bean @ConditionalOnMissingBean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { ExecutorType executorType = this.properties.getExecutorType(); if (executorType != null) { return new SqlSessionTemplate(sqlSessionFactory, executorType); } else { return new SqlSessionTemplate(sqlSessionFactory); } } ``` - 從上面的程式碼可以知道,SpringBoot啟動時注入了`SqlSessionTemplate`,此時就肯定從`SqlSessionTemplate`入手了。它的一些方法如下圖: ![SqlSessionTemplate方法](https://gitee.com/chenjiabing666/Blog-file/raw/master/Mybatis-%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB%E6%95%99%E5%AD%A6/1.png) - 從上圖的標記可以知道,首當其衝的就是`構造方法`了;既然是分析`selectList()`的查詢流程,當然全部的`selectList()`方法要打上斷點了;上篇文章也講了Mapper的介面最終是走的動態代理生成的例項,因此此處的`getMapper()`也打上斷點。 - 對於初入門的來說,上面三處打上斷點已經足夠了,但是如果你仔細看一眼`selectList()`方法,如下: ```java @Override