-
架構分層
我們將MyBatis架構分為三層,分別為介面層、資料處理層和框架支撐層
-
介面層:提供外部介面呼叫的API,使用端通過這些API來運算元據庫,介面層收到請求後會呼叫資料處理層完成具體的資料處理
使用端可以通過兩種方式呼叫介面層:MyBatis提供的API、Mapper動態代理
-
資料處理層:負責具體的SQL查詢、解析、執行與執行結果對映處理,主要負責根據具體的請求完成資料庫操作
-
框架支撐層:負責基礎的功能支撐,主要功能有連線管理、事務管理、配置載入和快取管理
-
-
主要元件及關係
元件 功能描述 Configuration 接收使用端配置的MyBatis XML核心配置檔案 MappedStatement 接收使用端配置的XxMapper.xml檔案 SqlSession 負責與資料庫互動的會話,主要封裝了代理物件、增刪改查、獲取資料庫連線 Executor 執行器,MyBatis的核心排程器,主要負責動態語句的生成、事務管理及快取操作 StatementHandler 封裝了諸多類,排程引數對映、SQL執行與結果集對映,主要負責 操作JDBC Statement物件執行SQL, ParameterHandler 負責將使用端傳遞的引數轉換成JDBC Statement所需要的引數 ResultSetHandler 負責將JDBC返回的ResultSet結果集物件轉換成List型別的集合 TypeHandler 主要負責JDBC物件與Java物件之間進行相互轉換 BoundSql 處理SQL中的#{} ${},進行替換處理,轉換為資料庫可執行的SQL RowBounds MyBatis提供的邏輯分頁類,從結果集中進行過濾分頁資料 -
執行流程
1、讀取Mybatis主配置檔案資訊
2、獲取SqlSessionFactory
a、使用XMLMappperBuilder解析Mybatis配置檔案,封裝成Environment物件,再把Environment物件設定給Configuration物件;
b.、呼叫ConfigurationElement函式,最終執行addMappedStatement方法,將mapper配置檔案中的每一條SQL語句封裝成mappedStatement物件,作為value儲存在HashMap集合中;
c.、進入addLoaderResource方法,使用HashSet集合存放mybatis的mapper.xml 對映檔案路徑地址;
d.、進入bindMapperForNamespace()方法,通過namespace使用Java反射機制找到mapper介面,再呼叫addMapper()方法,判斷是否是介面型別,是否註冊過(註冊過則丟擲異常)其中mapperRegistry通過HashMap儲存mapper介面,【key:介面;value:MapperProxyFactory】
3、獲取SqlSession物件
a、進入openSession()方法,執行newExecutor()方法建立執行器;
b、先建立 SimpleExecutor簡單執行器,再判斷是否開啟了二級快取,預設是開啟的(使用時需要配置條件),就會去建立CacheExecutor快取執行器
c、執行interceptorChain.pluginAll()方法,責任鏈設計模式,底層使用動態代理技術,使開發者可以自定義外掛開發,只需要實現Interceptor介面,並指定想要攔截的方法簽名即可,最後返回執行器;
4、操作mapper介面
a、呼叫getMapper()方法,最終執行mapperProxyFactory.newInstance(sqlSession)方法建立代理類MapperProxy;
b、當我們呼叫mapper,getUser()方法的時候,就會去執行MapperProxy代理類的invoke()方法;
c、判斷mapper介面是否有實現類,顯然我們沒有實現類,則呼叫cacheMapperMethod()方法去快取中獲取要代理的方法method;
d、進入cacheMapperMethod()方法先去查詢快取中有沒有,沒有的話將mapper配置檔案中配置的SQL語句和對應的mapper介面方法進行關聯並放入map快取中,後期直接走快取了,最後執行execute()方法;
e、執行execute()方法,最終呼叫selectOne()方法;
f、進入selectOne()方法,底層還是查詢所有的,但是取第一個,查詢多個的話會丟擲異常;
g、進入selectList()方法,呼叫getMapperStatement()方法獲取對應的SQL語句;
h、執行query()方法進行查詢,判斷如果開啟了二級快取並且配置了二級快取儲存介質(Redis,EhCache..)則先走二級快取中查詢資料,第一次查詢是沒有快取資料的,則重新整理快取配置,清除快取。
i、二級快取(sessionFactory)中沒有查詢到資料,就回去執行BaseExecutor去查詢 HashMap一級快取中(sqlSession)是否有快取資料,一級快取(PerpetualCache)存放在記憶體中的,同理也是沒有的,最後查詢資料庫DB
j、將從資料庫查詢出來的資料快取到一級快取中,再把一級快取中的資料同步到二級快取,新增到二級快取之前先新增到getTransactionalCache的entritiesToAddOnCommit的map集合中臨時快取起來;
k、呼叫executor.close()方法迴圈迭代TransactionCache,最後將臨時map快取資料提交到二級快取中,如果事務回滾,則會將快取資料清除掉
l、再次查詢的話,就有快取了,會直接查詢到快取資料返回,不會去查詢資料庫DB
[執行流程]: "https://www.douban.com/note/749318390/"
MyBatis(十一):MyBatis架構流程淺析
相關文章
- 淺析MyBatis(一):由一個快速案例剖析MyBatis的整體架構與執行流程MyBatis架構
- 淺析mybatis中${}和#{}取值區別MyBatis
- 淺析MyBatis的動態代理原理MyBatis
- 淺析MyBatis(二):手寫一個自己的MyBatis簡單框架MyBatis框架
- MyBatis——MyBatis開發流程MyBatis
- 深入詳解Mybatis的架構原理與6大核心流程MyBatis架構
- MyBatis原始碼窺探(一):MyBatis整體架構解析MyBatis原始碼架構
- 電商架構淺析架構
- Spring Boot構造流程淺析Spring Boot
- Mybatis原始碼分析(一)Mybatis的架構設計簡介MyBatis原始碼架構
- 淺析MyBatis(三):聊一聊MyBatis的實用外掛與自定義外掛MyBatis
- MyBatis-05-MyBatis使用流程簡讀MyBatis
- 深入淺出MyBatis:MyBatis的所有配置MyBatis
- 淺析Kubernetes架構之workqueue架構
- Linux系統——架構淺析Linux架構
- 深入瞭解Mybatis架構設計MyBatis架構
- MyBatis 基礎搭建及架構概述MyBatis架構
- springmvc+mybatis +Jeesz 分散式架構SpringMVCMyBatis分散式架構
- springmvc + mybatis + ehcache + redis 分散式架構SpringMVCMyBatisRedis分散式架構
- MyBatis執行流程MyBatis
- 深入淺出MyBatis:JDBC和MyBatis介紹MyBatisJDBC
- iOS MVC、MVVM、MVP架構模式淺淺析iOSMVCMVVMMVP架構模式
- 深入淺出MyBatis:MyBatis解析和執行原理MyBatis
- 淺析HDFS架構和設計架構
- 微服務架構專案淺析微服務架構
- Mybatis執行流程學習之手寫mybatis雛形MyBatis
- 深入淺出Mybatis原始碼系列(一)---Mybatis入門MyBatis原始碼
- 『網際網路架構』軟體架構-mybatis體系結構(14)架構MyBatis
- 【Mybatis原始碼解析】- 整體架構及原理MyBatis原始碼架構
- 精盡 MyBatis 原始碼分析 - 整體架構MyBatis原始碼架構
- springmvc+mybatis+restful+webservice Jeesz分散式架構SpringMVCMyBatisRESTWeb分散式架構
- 深入淺出MyBatis:MyBatis外掛及開發過程MyBatis
- 從底層原始碼淺析Mybatis的SqlSessionFactory初始化過程原始碼MyBatisSQLSession
- 深入淺出MyBatis:MyBatis與Spring整合及實用場景MyBatisSpring
- 淺析Nordic nRF5 SDK例程架構架構
- SpringBoot整合Mybatis超詳細流程Spring BootMyBatis
- 深入Mybatis原始碼——執行流程MyBatis原始碼
- Mybatis執行流程原始碼分析MyBatis原始碼