1. 程式人生 > >MyBatis原始碼解析(一)——執行流程(轉)

MyBatis原始碼解析(一)——執行流程(轉)

一、MyBatis簡介

  MyBatis框架是一種輕量級的ORM框架,當下十分流行,配合Spring+Spring MVC組成SSM框架,能夠勝任幾乎所有的web專案工程。

  MyBatis不同於Hibernate的最重要的地方就是SQL部分,MyBatis中你可以自己編寫靈活的SQL程式碼,而在Hibernate基本上將SQL程式碼封裝起來的,幾乎不會用到程式設計師去編寫,這是Hibernate的優秀之處(簡化了程式開發),同時也是其病腳(無法靈活開發)。

  MyBatis的輕量級是相對於Hibernate的重量級而言的,它並沒有完全封裝,將SQL的編寫開放給程式設計師,雖然帶來了複雜性,但是同時也帶來了靈活性。而針對我們程式設計師而言,完全可以憑藉技術來忽略這些複雜性,專注於其靈活性。

二、MyBatis的執行流程

  MyBatis的執行流程如下圖:

  

  這張圖是我的個人理解,參考了他人的成果,也帶著自己的想法

  解析:

  Configuration.xml:該配置檔案是MyBatis的全域性配置檔案,在這個檔案中可以配置諸多專案,但是一般專案中,並不會配置太多內容,常用的內容是別名設定,攔截器設定等,至於環境設定與Mapper對映檔案的註冊會轉移到Spring配置檔案中(SSM整合之後),而其餘大部分的配置項都採用預設的配置。

  XMLConfigBuilder:該類是XML配置構建者類,是用來通過XML配置檔案來構建Configuration物件例項,構建的過程就是解析Configuration.xml配置檔案的過程,期間會將從配置檔案中獲取到的指定標籤的值逐個新增到之前建立好的預設Configuration物件例項中。

  Configuration:該類是MyBatis的配置類,建立這個類的目的就是為了使用其物件作為專案全域性配置物件,這樣通過配置檔案配置的資訊可以儲存在這個配置物件中,而這個配置物件在建立好之後是儲存在JVM的Heap記憶體中的,方便隨時讀取。不然每次需要配置資訊的時候都要臨時從磁碟配置檔案中獲取,程式碼複用性差的同時,也不利於開發。

  SqlSessionFactoryBuilder:該類是SqlSessionFactory(會話工廠)的構建者類,之前描述的操作其實全是從這裡面開啟的,首先就是呼叫XMLConfigBuilder類的構造器來建立一個XML配置構建器物件,利用這個構建器物件來呼叫其解析方法parse()來完成Configuration物件的建立,之後以這個配置物件為引數呼叫會話工廠構建者類中的build(Configuration config)方法來完成會話工廠物件的構建。

  SqlsessionFactory:該介面是會話工廠,是用來生產會話的工廠介面,DefaultSqlSessionFactory是其實現類,是真正生產會話的工廠類,這個類的例項的生命週期是全域性的,它只會在首次呼叫時生成一個例項(單例模式),就一直存在直到伺服器關閉。

  openSession():在最後的build(Configuration config)方法中會返回一個DefaultSqlSessionFactory類的例項,這個類是MyBatis提供的預設會話工廠類,而我們使用的也正是這個類中的來openSession()方法來完成SqlSession物件的建立。

  SqlSession:該介面是會話,是專案與資料庫之間的會話,類似於客戶端與伺服器之間的會話(session),這個SqlSession的生命週期是方法級的,因為他是非執行緒安全的,針對每一次資料庫訪問都要建立一個SqlSession,獲取到返回結果之後,這個SqlSession就會被廢棄。這區別於SqlSessionFactory的生命週期。

  Executor:執行器介面,SqlSession會話是面向程式設計師的,而內部真正執行資料庫操作的卻是Executor執行器,可以將Executor看作是面向MyBatis執行環境的,SqlSession就是門面貨,Executor才是實幹家。通過SqlSession產生的資料庫操作,全部是通過呼叫Executor執行器來完成的。

  StatementHandler:該類是Statement處理器,封裝了Statement的各種資料庫操作方法execute(),可見MyBatis其實就是將操作資料庫的JDBC操作封裝起來的一個框架,同時還實現了ORM罷了。

  ResultSetHandler:結果集處理器,如果是查詢操作,必定會有返回結果,針對返回結果的操作,就要使用ResultSetHandler來進行處理,這個是由StatementHandler來進行呼叫的。這個處理器的作用就是對返回結果進行處理。

我的理解:SqlSessionFactoryBuilder是mybatis的核心,所有的功能都是通過SqlSessionFactoryBuilder來完成的。

1.SqlSessionFactoryBuilder呼叫XMLConfigBuilder來解析Configuration.xml中配置的內容

2.解析出配置內容之後生成對應的配置類Configuration

3.通過自身的build方法來生成SqlsessionFactory會話工廠

4.SqlsessionFactory會去建立Sqlsession用於sql語句的執行

5.Sqlsession中真正執行sql的類是Executor的實現類,在SqlsessionFactory建立Sqlsession的時候會建立Executor的實現類,並且將Executor設定進Sqlsession中

6.真正的操作資料的類是StatementHandler的實現類,此類封裝了各種與資料庫互動的方法

7.在StatementHandler執行完sql語句之後,ResultSetHandler用來將結果集進行處理,封裝到model類中

  (未完待續)