mybatis入門-框架原理

  • mybatis是什麼

    在說mybatis原理之前,我們有必要知道,mybatis到底是個什麼東西。mybatis是一個持久層的框架。是一個不完全的ORM框架。因爲它需要由程序員自己去寫sql語句。但是它也可以將對象和數據庫表進行輸入和輸出映射。

    相對於hibernate框架來說,mybatis學習起來更加的簡單,學習成本也相對較低。可以讓程序員將自己的精力放在sql語句上,由於在mybatis中sql語句單獨存放在xml文件中。對於sql語句的修改和優化也比較方便,適用於需求變化較多的項目。基於國內程序員對於hibernate掌握程度參差不齊的現狀,所以互聯網電商項目多使用mybatis作爲持久層框架。以便於提高數據庫訪問的速度。

  • mybatis的框架原理

    mybatis 框架整體的話,先上一張圖吧。然後通過這張圖對於mybatis的框架原理進行一下展開。

    

    我們知道,持久層的工作就是和數據庫打交道,將我們的數據從系統中存入數據庫,或者是將數據庫中的內容取出。這也是持久層框架乾的事情。在mybatis中,mapped statement(底層封裝對象)和Executor(執行器),對用戶是透明不可見的。也就是說,我們用戶不需要知道我們傳入的各種參數是如何被mapped statement 進行封裝成爲一個可以被數據庫是別的sql語句的參數的。也不用知道Executor是如何在sqlSession內部通過一系列的執行去操作數據庫的。

    我們需要做的是,創建一個sqlSession(鏈接數據庫的會話)的對象,通過這個sqlSession接口提供給程序員的一些方法,傳入相應的映射文件(這個文件包含有我們要執行的sql語句)及對應的參數。然後在mybatis內部,將傳入的映射文件的內容和傳入參數進行解析,然後通過執行器去發送sql語句。再將得到的結果通過底層封裝對象進行封裝。返回給sqlSession方法的調用方。

    這裏需要注意一個地方:sqlSession默認情況下是不會自動提交事務的,所以,在我們跟數據庫鏈接的時候,如果需要提交事務,需要手動的進行提交。而且我們在手動提交sql語句的時候,是需要和數據庫建立連接的。那麼問題來了,我們的sqlSession這個會話是怎麼來的呢?它又是在什麼時候和數據庫建立了鏈接呢?

    在我們的mybatis中,有一個會話工廠,它是一個全局只需要一個的工廠。它的作用就是創建sqlsession。和數據庫鏈接的數據源對象就是通過sqlSessionFactory這個工廠進行的創建時,賦值給了sqlSession這個會話對象的。所以一般sqlSessionFactory一般都是配置爲單例的。而我們的整個mybatais的所有配置,並不是由sqlSessionFactory去進行讀取的,根據單一職責原則,在mybatis中,是由SqlSessionFactoryBuilder去進行讀取的,當然,它讀取的配置信息是有很多的,將mybatis的運行環境信息讀取完成之後,然後創建一個SqlSessionFactory。由於這些讀取環境不是mybatis的核心,我們的圖上就沒有體現。

    那麼,這些配置文件寫在哪了呢?我們一般寫在SqlMapConfig.xml這個文件中。(是mybatis的全局配置文件,名稱不固定的)配置了數據源、事務等mybatis運行環境。

     那麼,mybatis在運行的時候是怎麼執行的呢呢?

    mybatis的執行流程

    首先呢,我們配置mybatis的配置文件,sqlmapConfig.xml這個文件(雖然名稱不固定,但是這是約定成俗的寫法)。

    然後,通過配置文件,加載mybatis的運行環境,創建SqlSessionFactory的會話工廠(按照單例方式創建,多例也可以,不過浪費資源嚴重)。

    接下來,通過會話工廠(SqlSessionFactory)去創建會話(SqlSession)。這個接口是線程不安全的,所以建議應用在方法體內。

    剩下的就是,調用sqlSession的方法去操作數據庫了。操作完成後,進行下事務的commit()的方法。然後釋放資源關閉sqlSession。


轉載於:http://www.cnblogs.com/liyasong/p/mybatis.html