Mybatis運行原理
先是簡要的文字說明,后面放上圖,如有敘述錯誤,感謝指正哈,
一、根據組態檔創建SQLSessionFactory
首先將組態檔轉化為流,創建SqlSessionFactoryBuilder物件,通過SqlSessionFactoryBuilder的build() 方法對流進行創建SQLSessionFactory的實體,
build() 的簡易程序為:創建決議器parser對流進行組態檔中的每個標簽進行決議,將決議后的結果保存在Configration中,最后通過build()回傳一個DefaultSqlSession物件,即SQLSessionFactory的實體,
二、回傳SqlSession的實作類DefaultSqlSession物件
在第一步獲取到包含了Configration的DefaultSqlSession物件后,呼叫它的openSession() 方法,實際上是呼叫openSessionFromDataSource() 方法,在這個方法中獲取環境資訊,創建事務并使用newExecutor()獲得executor物件,最后創建出包含Configration和executor的DefaultSqlSession物件,
newExecutor()的簡易程序:首先根據全域配置創建出SimpleExecutor/ReuseExecutor/BatchExecutor中的一種(對executor進行包裝),然后如果開啟了二級快取則創建CachingExecutor(對executor進行包裝),最后使用每一種攔截器對executor進行包裝并回傳,
三、getMapper()回傳介面的代理物件
SqlSession.getMapper()--->Configuration.getMapper()--->mapperRegistry.getMapper(),然后根據介面型別獲得MapperProxyFactory,再通過mapperProxyFactory.newInstance(sqlSession)創建MapperProxy,而MapperProxy是實作了InvocationHandler介面,所以MapperProxy是一個代理物件,最后層層回傳得到代理物件,
四、通過代理物件呼叫增刪改查方法
這一步比較麻煩,簡易說明一下:代理物件通過invoke()方法判斷用戶是用增刪改查的哪個方法,然后再呼叫sqlSession的增刪改查方法,
在呼叫sqlSession的增刪改查方法中會呼叫executor對應的增刪改查方法獲取到BoundSql,BoundSql里包含了sql陳述句的詳細資訊,executor再創建StatementHandler,在創建StatementHandler的同時也創建了ParameterHandler與ResultSetHandler,StatementHandler通過ParameterHandler設定引數、通過ResultSetHandler處理結果,而ParameterHandler和ResultSetHandler都依賴于TypeHandler進行資料庫型別和JavaBean型別的映射,TypeHandler的底層使用的是JDBC,
一、根據組態檔創建SQLSessionFactory

二、回傳SqlSession的實作類DefaultSqlSession物件

三、getMapper()回傳介面的代理物件

四、通過代理物件呼叫增刪改查方法

以上圖片轉載自尚硅谷
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/431969.html
標籤:其他
上一篇:新年首發:Spring Cloud 2021.0.1,快上車,來不及解釋了。。
下一篇:手寫個注冊中心
