我這裏寫的並非很仔細,主要是在debug的時候並無截圖,有些註釋我本身也比較懶就沒有寫了,但願你們能夠本身debug走一遍,這樣印象會深入一點,我這裏只是寫個大概面試
MyBatis有一個核心的配置文件,configuration.xml,這裏面配置不少核心的信息,可是我並不會每個配置都講,這裏主要是將咱們再編寫 xml文件中編寫sql語句,以及如何執行sql並返回結果,其它的之後有時間再來寫相關的文章。這裏我從MyBatis官網截了張圖 sql
裏面都這麼多配置,這裏咱們先將標籤,也就是映射器。以前面試問到過這麼個問題,咱們編寫好的sql語句是在xml文件中的,那MyBatis是如何找到的。其實就是根據標籤來的。原本覺得這就結束了,面試官又問了有幾種方式,不過還好當初MyBatis官網我是逛了很多遍的,實際上是有4種 看下源碼是如何解析節點的, 這個方法是在 org.apache.ibatis.builder.xml.XMLConfigBuilder類中實現的。這個方法就是解析核心配置文件的各個節點 sql配置文件的大體結構是 圖片也是官網截下來的 跟進解析方法一直進入到org.apache.ibatis.scripting.xmltags.XMLScriptBuilder類中的 parseScriptNode()方法,這個方法就是解析咱們編寫的sql語句的。 這裏滴啊用了一個方法返回了一個List集合,這個方法就是返回解析好咱們編寫好的sql,假如如今咱們編寫的sql語句是這樣的 那麼在解析咱們編寫的sql語句通常是這樣的第一步:解析到 select * from ,發現有標籤存在,就先將這段解析好的封裝成一個SqlNode對象,而後放到List集合中去。在解析到這裏的時候就會去解析相應的節點apache
第二步:解析好相應的節點以後,就能獲得節點配置的值了,這裏就是 test,而後又封裝成一個SqlNode對象,放到List集合中mybatis
第三步:解析到 where 1=1 and id = ${id},又解析到節點了,無論節點,先封裝成SqlNode對象,放到List集合中去app
第四步:就是將解析好的片斷封裝到SqlNode就行ui
咱們能夠看到SqlNode有不少的實現類,這裏就能夠知道什麼樣的節點就會解析成對應的SqlNode spa
解析好Sql語句以後返回的是一個集合List的集合,可是仍是會封裝帶一個SqlSource對象中去,其實就是下面這個樣子,裏面只不過是包含了剛剛解析好的SQL語句而已。 debug
可是解析成SqlSource對象並無結束,由於後面執行SQL語句的時候是沒有說獲取SqlSource對象的,都是獲取一個MapperStatement對象,因此在解析配置文件以後,都會把解析好的信息封裝到這個類中,而後存放到Configuration類中,每解析好一條SQL語句都會將該MapperStatemnt對象放到一個Map中去,key值固然是namespace+id,因此說爲何namespace和id要惟一,這個id就是select|update之類標籤的id,固然這裏面還有一個很重要的信息就是SqlCommandType, 這個信息很重要,在執行sql語句的時候根據這個來執行不一樣的邏輯,也就是對應的增刪改查。解析好以後呢,執行方法mybatis又是怎麼樣找到對應的sql語句的????????代理
根據namespce的值獲得mapper類的類型,而後將對應的namespce與mapper代理類進行綁定,並放到一個Map中去,