ibatis是如何找到dao層的?
介紹
本質還是很簡單的,原來用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下的四大對象
映射器其實就是一個動態代理對象,進入到了MapperMethod的execute方法。它經過簡單的判斷就進入了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) https://www.b5b6.com/shujuku/會話器(StatementHandler):專門來處理https://www.b5b6.com/shujuku/會話的。
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執行的過程。