成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入詳解Mybatis的架構原理與六大核心流程

開發 架構
MyBatis 是 Java 生態中非常著名的一款 ORM 框架,目前在一線互聯網大廠中應用廣泛,Mybatis已經成為了一個必會框架。

MyBatis 是 Java 生態中非常著名的一款 ORM 框架,目前在一線互聯網大廠中應用廣泛,Mybatis已經成為了一個必會框架。

如果你想要進入一線大廠,能夠熟練使用 MyBatis 開發已經是一項非常基本的技能,同時大廠也更希望自己的開發人員深入了解 MyBatis 框架的原理和核心實現。

從這個角度看,理解 MyBatis 原理,閱讀 MyBatis核心源碼,這樣更有利于提高職場競爭力。

在深入了解Mybatis的源碼之前,我們先了解一下Mybatis的整體架構和工作原理,這樣有助于我們在閱讀源碼過程中了解思路和流程。

Mybatis架構設計

我們把Mybatis的功能架構分為三層:

  • API接口層
  • 數據處理層
  • 基礎支撐層

接口層

接口層:主要就是和數據庫交互,提供給外部使用的接口API,開發人員通過這些本地API來操縱數據庫,接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。

以使用Mapper接口為例,將配置文件中的每一個 節點抽象為一個 Mapper 接口,這個接口中聲明的方法和跟Mapper.xml中的 節點項對應。

id值對應方法名稱,parameterType 值對應方法的入參類型,而resultMap 值則對應返回值類型。

配置好后,MyBatis 會根據接口聲明的方法信息,通過動態代理機制生成一個Mapper 實例,當調用接口方法時,根據這個方法的方法名和參數類型,確定Statement Id,底層還是通過 SqlSession.select/update( “statementId”, parameter) 等來實現對數據庫的操作。

數據處理層

數據處理層:可以說是MyBatis 的核心,負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等,它主要的目的是根據調用的請求完成一次數據庫操作。

從大的方面上講,它要完成兩個功能:

  • 通過傳入參數構建動態SQL語句
  • SQL語句的執行以及封裝查詢結果集

1.通過傳入參數構建動態SQL語句

動態語句生成能夠說是MyBatis框架很是優雅的一個設計,MyBatis 經過傳入的參數值,使用 Ognl 來動態地構造SQL語句,使得MyBatis 有很強的靈活性和擴展性。

參數映射指的是對于java 數據類型和jdbc數據類型之間的轉換,這里有包括兩個過程:

  • 查詢階段
  • 查詢結果集轉換階段

查詢階段要將java類型的數據,轉換成jdbc類型的數據,經過 preparedStatement.setXXX() 來設值;

另外一個就是對resultset查詢結果集的jdbcType 數據轉換成java 數據類型。

2. SQL語句的執行以及封裝查詢結果集

動態SQL語句生成以后,MyBatis 將執行SQL語句,并將可能返回的結果集轉換成List 列表。

MyBatis 在對結果集的處理中,支持結果集關系一對多和多對一的轉換,而且有兩種支持方式,一種為嵌套查詢語句的查詢,還有一種是嵌套結果集的查詢。

基礎支撐層

基礎支撐層是整個MyBatis框架的地基,負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件,為上層的數據處理層提供最基礎的支撐。

1.緩存機制

數據庫是實踐生成中非常核心的存儲,很多業務數據都會落地到數據庫,所以數據庫性能的優劣直接影響了上層業務系統的優劣。

我們很多線上業務都是讀多寫少的場景,在數據庫遇到瓶頸時,緩存是最有效、最常用的手段之一,正確使用緩存可以將一部分數據庫請求攔截在緩存這一層,這就能夠減少一部分數據庫的壓力,提高系統性能。

除了使用 Redis、Memcached 等外置的第三方緩存以外,持久化框架一般也會自帶內置的緩存,例如,MyBatis 就提供了一級緩存和二級緩存,具體實現位于基礎支撐層的緩存模塊中。

2.反射工具

該模塊對 Java 原生的反射進行了良好的封裝,提供了更加簡潔易用的 API ,方便上層使調用,并且對反射操作進行了一系列優化,例如緩存了類的元數據,提高了反射操作的性能。

3.類型轉換

類型轉換模塊提供了兩個主要功能,一個功能是別名機制,MyBatis 為了簡化配置文件提供了別名機制。

另一個功能是實現 JDBC 類型與 Java 類型之間的轉換,該功能在為 SQL 語句綁定實參以及映射查詢結果集時都會涉及。

4.日志

提供詳細的日志輸出信息,并且能夠集成多種日志框架,其日志模塊的一個主要功能就是集成第三方日志框架。

5.資源加載

資源加載模塊主要是對類加載器進行封裝,確定類加載器的使用順序,并提供了加載類文件以及其他資源文件的功能。

6.解析器

解析器模塊主要提供兩個功能,一個功能是對 XPath 進行封裝,為 MyBatis 初始化時解析 mybatis-config.xml 配置文件以及映射配置文件提供支持。

另一個功能是為處理動態 SQL 語句中的占位符提供支持。

7.事務管理

持久層框架一般都會提供一套事務管理機制實現數據庫的事務控制,MyBatis 對數據庫中的事務進行了一層簡單的抽象,提供了簡單易用的事務接口和實現。

一般情況下,Java 項目都會集成 Spring,并由 Spring 框架管理事務。

8.Binding

在調用 SqlSession 相應方法執行數據庫操作時,需要指定映射文件中定義的 SQL 節點,如果出現拼寫錯誤,我們只能在運行時才能發現相應的異常。

為了盡早發現這種錯誤,MyBatis 通過 Binding 模塊將用戶自定義的 Mapper 接口與映射配置文件關聯起來,系統可以通過調用自定義 Mapper 接口中的方法執行相應的SQL 語句完成數據庫操作,從而避免上述問題。

需要注意的是,無須編寫自定義 Mapper 接口的實現,具體的Mapper接口實現MyBatis 會自動為其創建動態代理對象。

9.數據源

對于 ORM 框架而言,數據源的組織是一個非常重要的一部分,這直接影響到框架的性能問題。

數據庫連接是一項有限的昂貴資源,一個數據庫連接對象均對應一個物理數據庫連接,每次操作都打開一個物理連接,使用完都關閉連接,這樣造成系統的性能低下。

數據庫連接池的解決方案是在應用程序啟動時建立足夠的數據庫連接,并將這些連接組成一個連接池,由應用程序動態地對池中的連接進行申請、使用和釋放。

打開Mybatis源碼找到datasource包下就可以看到連接池的實現,如下圖所示:

Mybatis核心執行流程

mybatis的總體執行流程,總體如下六大步驟:

1.MyBatis配置文件

config.xml:配置了全局配置文件,配置了MyBatis的運行環境等信息。

mapper,xml:sql的映射文件,配置了操作數據庫的sql語句,此文件需在config.xml中加載。

2.SqlSessionFactory

通過MyBatis環境等配置信息構造SqlSessionFactory(會話工廠)。

3.SqlSession

通過會話工廠創建SqlSession(會話),對數據庫進行增刪改查操作。

4.Exector執行器

MyBatis底層自定義了Exector執行器接口來具體操作數據庫,Exector接口有兩個實現,一個基本執行器(默認),一個是緩存執行器,SqlSession底層是通過Exector接口操作數據庫。

5.MappedStatement

MyBatis的一個底層封裝對象,它包裝了MyBatis配置信息與sql映射信息等。mapper.xml中的insert/select/update/delete標簽對應一個MappedStatement對象。標簽的id就是MappedStatement的id。

MappedStatement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo、Executor通過MappedStatement在執行sql前將輸入的Java對象映射至sql中,輸入參數映射就是JDBC編程對preparedStatement設置參數。

MappedStatement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過MappedStatement在執行sql后將輸出結果映射至Java對象中,輸出結果映射就是JDBC編程對結果的解析處理過程。

到此我就把Mybatis的架構從全局上做了一個拆解,后續我將重點分析其核心源碼,這樣先全局再局部,這樣更有利于掌握其核心原理實現,希望這個框架系列能對你有所用。


責任編輯:武曉燕 來源: mikechen的互聯網架構
相關推薦

2022-05-15 23:32:00

元宇宙虛擬世界科技

2025-03-24 00:25:00

Go語言并發編程

2025-03-27 00:25:55

微服務架構技術

2025-06-30 03:25:00

2022-02-25 20:44:28

框架深度學習架構

2018-08-06 09:40:22

2010-03-30 11:29:08

BMCCMDBIT運維

2015-09-09 16:23:58

蘋果核心產品

2009-09-15 16:53:50

2017-01-19 09:45:53

紅帽

2009-07-20 17:42:04

iBATIS入門

2024-05-30 07:41:22

2013-12-12 13:02:01

2024-10-22 14:42:14

2019-01-07 08:00:00

2010-09-03 14:18:45

CSS選擇符CSS

2010-09-25 10:56:32

WebLogicJVM

2013-08-23 10:42:03

Hadoop

2022-01-23 10:44:39

零信任網絡安全網絡攻擊

2023-08-31 22:12:51

低代碼隱患技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩av手机在线观看 | 国产精品久久久久久久久久久久 | 国产一二三区免费视频 | 欧美精品中文字幕久久二区 | 亚洲第一女人av | 人人爽日日躁夜夜躁尤物 | 免费看黄视频网站 | 久久国产精品无码网站 | 精品91久久| www.久久| 欧美日韩国产一区二区三区 | 国产综合久久久久久鬼色 | 激情综合五月 | 97伦理影院| 日韩欧美在线视频一区 | 97国产精品视频人人做人人爱 | 91社区视频| 久久成人免费观看 | 成人在线一区二区 | 国产网站在线免费观看 | 国产在线精品一区二区 | 亚洲高清一区二区三区 | 国产丝袜人妖cd露出 | 成人国产精品免费观看视频 | 欧美在线视频免费 | 亚洲在线一区二区 | av大片 | 欧美日韩久久 | 国产91精品久久久久久久网曝门 | 国产精品成人在线 | 欧美日韩一区二区在线播放 | 狠狠av| 亚洲一区二区三区免费观看 | 欧美老少妇一级特黄一片 | 欧美一级在线观看 | 国产一二三视频在线观看 | 欧美一级一 | 噜久寡妇噜噜久久寡妇 | 国产成人免费视频网站高清观看视频 | 国产一区二区三区久久久久久久久 | 欧美一区成人 |