Mybatis運行原理


  要執行sql語句必須得到一個SqlSession,那么我們是怎么獲得這個對象的呢?我們來慢慢解析這幾句話:

  第一步:通過Resources加載配置好的mybatis.xml配置文件。Resources是ibatis.io包下面的類,也就是一個io流,用於讀寫文件,通過getResourceAsStream把xml文件加載進來,降配置文件解析為一個流。

  第二步:然后看第二句話,這句話是關鍵。我們首先new了一個SqlSessionFactoryBuilder對象,他是SqlSessionFactory的構建者。我們調用了他的build()方法。這個方法長什么樣子呢?看一下他的源碼:

我們發現里面有一個XMLconfigBuilder對象,他是做什么的呢?他是用來解析XML文件的一個構建者,通過他的parse()方法解析xml文件

然后我們發現解析完成后,他返回了一個configuration對象,它是用來存放mybatis核心配置文件解析完成后的結果。這個configuration又返回給誰了呢?繼續看源碼:

他又返回了一個build方法,把剛才的返回值configuration作為參數傳入這個方法中,並返回了一個DefaultSqlSessionFactory對象,這是SqlSessionFactory的實現類,用來生產defaultSqlSession對象。這樣上面的第二句話才算真正的結束了。。。

 這時候會不會有的小伙伴疑惑,為什么既然DefaultSqlSessionFactory是SqlSessionFactory的實現類,為什么我們不直接new一個defaultSqlSessionFactory呢?原因:看源碼知道,如果new defaultSqlSessionFactory的話,我們需要一個configuration對象,而這個對象有事經過層層磨難才得到的,所有我們一般采取構建築模式,直接把xml字節流或字符流給了sqlSessionfactoryBuilder就好了,我們就不用管他是怎么生成的了。

第三步:我們繼續往下走,我們最終的目的是獲取一個SqlSession對象,現在我們有了一個SqlSessionFactory了,就愉快的生成SqlSession吧。從第三句看,調用了openSession()方法,這又是個啥?看源碼:

先看到返回值是sqlSession,再看看里面有些什么:

   Transaction,這很明顯是一個事務,我們都知道sql執行時都要涉及到事務操作的,提交或回滾什么的。而這個transaction產生需要什么參數呢,看源碼知道里面有個environment(xml中配置的),而且是從configuration中獲得的(之前做的總算沒有白費),通過這些參數transactionFactory就幫我們產生了transaction。

 

  executor,這個名字一看就知道是一個執行器,是個接口(一般用simpleExecutor來執行,實現類),他是mybatis的核心執行器,相當於jdbc中的statement,發送sql語句並執行。

  有了這些我們就能得到最后的sqlSession了,就可以該干嘛干嘛了。

 

總結一下:mybatis運行時要先通過resources把核心配置文件也就是mybatis.xml文件加載進來,然后通過xmlConfigBulider來解析,解析完成后把結果放入configuration中,並把它作為參數傳入到build()方法中,並返回一個defaultSQLSessionFactory。我們再調用openSession()方法,來獲取SqlSession,在構建SqlSession的同時還需要transaction和executor用於后續執行操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM