-
1 # Java從入門到架構師
-
2 # Java識堂
介紹
本質還是很簡單的,原來用JDBC實現的時候,你得寫各種類,類裡面寫好各種操作SQL的語句,現在用了XML以後,只不過是把這些資訊儲存到XML中了,執行的時候還是會有類來執行SQL語句的,這個類是怎麼來的呢?是Mybatis框架利用:動態代理和反射機制這2種機制,來幫你把這個類給創建出來,簡單總結一下原理,你可以去看看mybatis的原始碼,類不多,還是比較容易理清楚的,我幫你總結一下大概流程
Mybatis的執行分為兩部分,第一部分是讀取配置檔案快取到Coufiguration物件,用以建立SqlSessionFactory,第二部分是SqlSession的執行過程。
Mybatis實現的基本原理是利用:動態代理和反射機制。動態代理中用到JDK動態代理和CGLIB代理。這兩者的區別是,JDK動態代理是介面的,CGLIB代理是對於類的。Mybatis中這兩種代理都用到過,Mapper中用到的是JDK動態代理,在延遲載入的時候用到CGLIB代理。
(1) 構建SqlSessionFactory過程SqlSessionFactory是Mybatis的核心類,主要功能時提供建立Mybatis的核心介面SqlSession,我們需要建立SqlSessionFactory,為此我們提供配置檔案和相關引數。透過SqlSessionFactoryBuilder去構建。
首先透過org.apache.ibatis.builder.xml.XMLConfigBuilder解析配置的XML檔案,讀取配置引數,並將讀取的資料存入這個org.apache.ibatis.session.Configuration類中。其次使用Configuration物件去建立SqlSessionFactory。
(2) 構建ConfigurationConfiguration的作用;
1) 讀取配置檔案,包括基礎配置的XML檔案和對映器的XML檔案
2) 初始化基礎配置,比如Mybatis的別名等,一些重要的類物件,例如,外掛、對映器、ObjectFactory和typeHandler物件。
3) 提供單例,為後續建立SqlSessionFactory服務並提供配置的引數。
4) 執行一些重要的物件方法,初始化配置資訊。
(3) 對映器的內部組成一般而言對映器有三部分組成,MappedStatement、SqlSource和BoundSql。
MappedStatement:它儲存了一個對映器的節點(select|delete|update)。包括許多我們配置的SQL、SQL的id、快取資訊、resultMap、paramterType、resultType、languageDriver等重要配置資訊。
SqlSource:提供BoundSql的地方,它是MappedStatement的一個屬性。是一個介面,主要作用是根據引數和其它的規則組裝SQL。
BoundSql:建立SQL和引數的地方。常用用用三個引數:SQL,parameterObject、parameterMappings。
(4) 構建SqlSessionFactorysqlsessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
(5)SqlSession執行過程
SqlSession是一個介面,使用它並不複雜。我們構建SqlSessionFactory就可以輕鬆容易地拿到Sqlseesion了。
1) 對映器的動態代理
Mapper對映是透過動態代理來實現的。對映器的xml名稱空間對應的便是這個介面的全路徑,那麼它根據全路徑和方法名便能夠繫結起來,透過動態代理技術,讓這個介面跑起來。
2) SqlSession下的四大物件
Mapper的執行其實就是透過Executor、StatementHandler、ParameterHandler和ResultHandler來完成資料操作和結果的返回。
Executor:執行器,由它來排程StatementHandler、Parameterhandler、ResultHandler等來執行對應的SQL。
StatementHandler:使用資料的Statement執行操作,它是四大物件的核心,起到承上啟下的作用。
ParameterHandler:用於SQL對引數的處理。
ResultHandler:進行最後資料集(ResultSet)的封裝返回處理。
1) 執行器(Executor):它是一個真正執行Java和資料互動的地方。在Mybatis中有三種執行器。SIMPLE(簡單執行器,這是預設的)、REUSE(重用預處理語句)和Batch(執行重用語句和批次更新,它是針對批次專用的執行器)。
2) 資料庫會話器(StatementHandler):專門來處理資料庫會話的。
3) 引數處理器(ParameterHandler):對預編譯語句進行引數處理。
4) 結果處理器(ResultSetHandler):組裝結果集的返回。
(5) 總結SqlSession是透過Executor建立StatementHandler來執行的,而StatementHandler要經過下面的三步。Prepared預編譯SQL、parametersize設定引數和query/update執行SQL。
其中parametersize是呼叫parameterHandler的方法去設定的,而引數是根據型別處理器typeHandler去處理。query/update方法透過resultHandler進行處理結果的封裝,如果是update語句,它就返回整數,否則它就透過typeHandler處理結果型別,然後用ObjectFactory提供的規則組裝物件,返回給呼叫者,這就是SqlSession執行的過程。
回覆列表
應用程式通常需要訪問來自多個數據源的資料:關係資料庫,檔案系統,目錄服務,Web服務和其他提供程式。這些資料儲存中的每一個都有一個不同的API來訪問基礎儲存機制,以及一整套獨特的特性。
資料訪問物件(DAO)模式用於隱藏這些API的獨特實現怪癖。它為應用程式開發人員提供了一個簡單而通用的API,因此資料的使用者可以擺脫資料訪問API的複雜性。
iBATIS資料訪問物件子專案是同名核心J2EE模式的簡單實現。
一個面向物件程式設計的主要原則是封裝 -the 分離的的執行和它的公共介面。DAO模式是另一個工具,可讓您在應用程式中執行此操作。在我們深入探討DAO模式之前,讓我們看一下圖.1,看看它是什麼樣子。
圖.1 簡化的DAO(或者是JDBC?)
如果您認為圖.1看起來更像JDBC,而不是DAO,那麼您就只剩下一半了。這是JDBC,但在JDBC API 的Java是DAO模式的一個很好的例子作用。
為什麼要分離?
透過將資料訪問實現與資料訪問介面分離,我們能夠為異構資料提供一組同質的介面。一個應用程式可以訪問來自資料的多個數據庫,每一個不同的基礎資料訪問機制使用一個一致的資料訪問API。
通常,DAO不會公開任何涉及java.sql或javax.sql包中的物件的介面。這意味著DAO是應用程式中與資料來源進行整合的層,並且訪問它的層不必關心那些底層細節。這也意味著除了能夠更改資料訪問機制(即SqlMap,Hibernate,JDBC等),DAO模式允許您以類似的方式更改資料來源。因為該介面是以與資料來源無關的方式建立的,所以應用程式不需要知道資料是來自Oracle還是PostgreSQL甚至是來自非基於SQL的資料庫。它只需要處理JavaBeans。就應用程式而言,這些bean的來源無關緊要。
這種分離的另一個好處是,測試變得更加容易,因為您沒有使用DAO使用的特定於資料訪問方法的介面,而是使用了諸如List和Map之類的更常見物件,以及您的應用程式專用的bean。