MyBatis源碼解析(一)——執行流程


原創作品,可以轉載,但是請標注出處地址:http://www.cnblogs.com/V1haoge/p/6603926.html

一、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來進行調用的。這個處理器的作用就是對返回結果進行處理。

  (未完待續)

 


免責聲明!

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



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