MyBatis 核心組件 —— Configuration

来源:https://www.cnblogs.com/Yee-Q/archive/2023/08/01/17594113.html
-Advertisement-
Play Games

## 概述 Mybatis 的核心組件如下所示: - Configuration:用於描述 MyBatis 的主配置信息,其他組件需要獲取配置信息時,直接通過 Configuration 對象獲取。除此之外,MyBatis 在應用啟動時,將 Mapper 配置信息、類型別名、TypeHandler ...


概述

Mybatis 的核心組件如下所示:

  • Configuration:用於描述 MyBatis 的主配置信息,其他組件需要獲取配置信息時,直接通過 Configuration 對象獲取。除此之外,MyBatis 在應用啟動時,將 Mapper 配置信息、類型別名、TypeHandler 等註冊到 Configuration 組件中,其他組件需要這些信息時,也可以從 Configuration 對象中獲取
  • MappedStatement:用於描述 Mapper 中的 SQL 配置信息,是對 Mapper XML 配置文件中 <select|update|delete|insert> 等標簽或者 @Select/@Update 等註解配置信息的封裝
  • SqlSession:是 MyBatis 提供的面向用戶的 API,表示和資料庫交互時的會話對象,用於完成資料庫的增刪改查功能。SqlSession 是 Executor 組件的外觀,目的是對外提供易於理解和使用的資料庫操作介面
  • Executor:MyBatis 的 SQL 執行器,MyBatis 對資料庫所有的增刪改查操作都是由 Executor 組件完成的
  • StatementHandler:封裝了對 JDBC Statement 對象的操作,比如為 Statement 對象設置參數,調用 Statement 介面提供的方法與資料庫交互等等
  • ParameterHandler:當 MyBatis 框架使用的 Statement 類型為 CallableStatcment 和 PreparedStatement 時,ParamelerHandler 用於為 Statement 對象參數占位符設置值
  • ResultSetHandler:ResultSetHandler 封裝了對 JDBC 的 ResultSet 對象操作,當執行 SQL 類型為 SELECT 語句時,ResultSetHandler 用於將查詢結果轉換成 Java 對象
  • TypeHandler:TypeHandler 是 MyBatis 中的類型處理器,用於處理 Java 類型與 JDBC 類型之間的映射,它的作用主要體現在能夠根據 Java 類型調用 PreparedStatement 或 CallableStatement 對象對應的 set 方法為 Statement 對象設置值,而且能夠根據 Java 類型調用 ResultSet 對象對應的 get 獲取SQL執行結果

在使用 MyBatis 時,我們使用到 SqlSession 組件,它是用戶層面的 API。實際上 SqlSession 是Executor 組件的外觀,目的是為用戶提供更友好的資料庫操作介面,這是設計模式中外觀模式的典型應用。真正執行 SQL 操作的是 Executor 組件,Executor 可以理解為 SQL 執行器,它會使用 StatementHandler 組件對 JDBC 的 Statement 對象進行操作。當 Statement 類型為 CallableStatement 和 PreparedStatement 時,會通過 ParameterHandler 組件為參數占位符賦值。ParameterHandler 組件中會根據 Java 類型找到對應的 TypeHandler 對象,TypeHandler 會通過 Statement 對象提供的set 方法為 Statement 對象中的參數占位符設置值。StatementHandler 組件使用 JDBC 中的 Statement 對象與資料庫完成交互後,當 SQL 語句類型為 SELECT 時,MyBatis 通過 ResultSetHandler 組件從 Statement 對象中獲取 ResultSet 對象,然後將 ResultSet 對象轉換為 Java 對象


Configuration

MyBatis 框架的配置信息有兩種,一種是配置 MyBatis 框架屬性的主配置文件;另一種是配置執行 SQL 語句的 Mapper 配置文件。Configuration 的作用是描述 MyBatis 主配置文件的信息。Configuration 類中定義了一系列的屬性用來控制MyBatis 運行時的行為,這些屬性代碼如下:

public class Configuration {
	protected boolean safeRowBoundsEnabled;
	protected boolean safeResultHandlerEnabled = true;
	protected boolean mapUnderscoreToCamelCase;
	protected boolean aggressivelazyLoading;
	protected boolean multipleResultSetsEnabled = true;
	protected boolean useGeneratedKeys;
	protected boolean useColumnLabel = true;
	.......
}

這些屬性的值可以在MyBatis主配置文件中通過 <setting> 標簽指定,例如:

<settings>
	<setting name="cacheEnabled" value="true"/>
	<setting name="lazyLoadingEnabled" value="true"/>
</settings>

所有屬性的作用及配置說明參考如下:

  • cacheEnabled:是否開啟 Mapper 緩存,即二級緩存,預設 true
  • lazyLoadingEnabled:延遲載入的全局開關。當開啟時,所有關聯對象都會延遲載入。特定關聯關係中可通過設置 fetchType 屬性來覆蓋該項的開關狀態,預設 false
  • aggressiveLazyLoading:當開啟時,任何方法的調用都會載入該對象的所有屬性。否則,每個屬性會按需載入,預設 false,3.4.1 之前預設為 true
  • multipleResultSetsEnabled:是否允許單一語句返回多結果集,預設 true
  • useColumnLabel:使用列標簽代替列名,不同的驅動在這方面會有不同的表現,預設 true
  • useGeneratedKeys:允許 JDBC 支持自動生成主鍵,需要驅動相容。如果設置為 true,則這個設置強制使用自動生成主鍵,儘管一些驅動不能相容,但仍可正常工作,預設 false
  • autoMappingBehavior:指定 MyBatis 應該如何自動映射列到 Java 實體屬性。NONE 表示取消自動映射,PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。FULL 會自動映射任意複雜的結果集(無論是否嵌套),預設 PARTIAL
  • autoMappingUnknownColumnBehavior:指定發現自動映射目標未知列(或者未知屬性)的行為。NONE:不做任何反應,WARNING:輸出提醒日誌,FAILING:映射失敗,拋出異常,預設 NONE
  • defaultExecutorType:配置預設的 Executor 類型,SIMPLE 就是普通的 Executor;REUSE 會復用 Statement 對象;BATCH 會批量執行所有更新語句,預設 SIMPLE
  • defaultStatementTimeout:設置超時時間,它決定驅動等待資料庫響應的秒數,可以說任意正整數,預設為 null 未設置
  • defaultFetchSize:預設的 FetchSize,用於設置 Statement 對象的 fetchSize 屬性,用於限制從資料庫中獲取數據的最大行數,預設為 null 未設置
  • SafeRowBoundsEnabled:允許在嵌套語句中使用分頁(RowBounds),如果允許使用,則設置為 false,預設 false
  • safeResultHandlerEnabled:允許在嵌套語句中使用分頁(ResultHandler),如果允許使用,則設置為 false,預設 false
  • mapUnderscoreToCamelCase:是否開啟自動駝峰命名規則映射,即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的映射
  • localCacheScope:MyBatis 利用本地緩存機制防止迴圈引用和加速重覆查詢。預設值為 SESSION,這種情況下會緩存個會話中執行的所有查詢。若設置值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共用數據
  • jdbcTypeForNuIl:當沒有為參數指定 JDBC 類型時,指定 JDBC 類型的值為null。一些驅動需要指定 JDBC 類型,多數情況下直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER,預設 OTHER
  • lazyLoadTriggerMethods:指定哪個對象的方法會觸發一次延遲載入,參數是用逗號分割的方法列表
  • defaultScriptingLanguage:指定動態 SQL 生成的預設語言,參數值為一個類型別名或完全限定類名,預設值:org.apache.ibatis.XMLLanguageDriver
  • defaultEnumTypeHandler:指定 Java 枚舉類型使用的預設 TypeHandler,預設值:org.apache.ibatis.type.EnumTypeHandler
  • callSettersOnNulls:指定當結果集中的值為 null 的時候是否調用映射對象的Setter方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。註意基本類型(int、boolean 等)是不能設置成 null 的,預設 false
  • returnInstanceForEmptyRow:當返回行的所有列都是空時,MyBatis 預設返回null。當開啟這個設置時,MyBatis 會返回一個空實例。請註意,也適用於嵌套的結果集(collection、association),預設 false
  • logPrefix:指定 MyBatis 增加到日誌名稱的首碼,預設未設置
  • loglmpl:指定MyBatis 所用日誌的具體實現,未指定時將自動查找,可設置 SLF4J、LOG4J等,預設未設置
  • proxyFactory:指定MyBatis 創建具有延遲載入能力的對象所用到的代理工具,可選值有 JAVASSIST、CGLIB,預設 JAVASSIST
  • vfsImpl:指定 VFS 的實現,參數我 VFS 的實現類的全限定名,以逗號分隔,預設未設置

Configuration 除了提供上面的屬性控制 MyBatis 的行為外,還作為容器存放 TypeHandler(類型處理器)、TypeAlias(類型別名)、Mapper 介面及 MapperSQL 配置信息。這些信息在 MyBatis 框架啟動時註冊到 Configuration 組件中。Configuration 類通過下麵的屬性保存 TypeHandler、TypeAlias 等信息:

protected final MapperRegistry mapperRegistry = new MapperRegistry(this);
protected final InterceptorChain interceptorChain = new InterceptorChain();
protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();
protected final TypeAliasRegistry typeAliasRegistry= new TypeAliasRegistry();
protected final LanguageDriverRegistry languageRegistry = new LanguageDriverRegistry();
protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");
protected final Map<String, Cache> caches = new StrictMap<Cache>("Caches collection");
protected final Map<String, ResultMap> resultMaps = new StrictMap<ResultMap>("Result Maps collection");
protected final Map<String, ParameterMap> parameterMaps = new StrictMap<ParameterMap>("Parameter Maps collection");
protected final Map<String, KeyGenerator> keyGenerators = new StrictMap<KeyGenerator>("Key Generators collection");
protected final Set<String> loadedResources = new HashSet<String>();
protected final Map<String, XNode> sqlFragments = new StrictMap<XNode>("XML fragments parsed from previous mappers");
protected final Collection<XMLStatementBuilder> incompleteStatements = new LinkedList<XMLStatementBuilder>();
protected final Collection<CacheRefResolver> incompletecacheRefs = new LinkedList<CacheRefResolver>()
protected final Collection<ResultMapResolver> incompleteResultMaps = new LinkedList<ResultMapResolver>();
protected final Collection<MethodResolver> incompleteMethods = new LinkedList<MethodResolver>();
protected final Map<String, String> cacheRefMap = new HashMap<String, String>();

這些屬性的含義如下:

  • mapperRegistry:用於註冊 Mapper 介面信息,建立 Mapper 介面的 Class 對象和 MapperProxyFactory 對象之間的關係,其中 MapperProxyFactory 對象用於創建 Mapper 動態代理對象
  • interceptorChain:用於註冊 MyBatis 插件信息,MyBatis 插件實際上就是一個攔截器
  • typeHandlerRegistry:用於註冊所有的 TypeHandler,並建立 Jdbc 類型、JDBC 類型與 TypeHandler 之間的對應關係
  • typeAliasRegistry:用於註冊所有的類型別名
  • languageRegistry:用於註冊 LanguageDriver,LanguageDriver 用於解析 SQL 配置,將配置信息轉換為 SqlSource 對象
  • mappedStatements:MappedStatement 對象描述 <insert|selectlupdateldelete> 等標簽或者通過 @Select|@Delete|@Update|@Insert 等註解配置的 SQL 信息。MyBatis 將所有的 MappedStatement 對象註冊到該屬性中,其中 Key 為 Mapper 的 Id, Value 為 MappedStatement 對象
  • caches:用於註冊 Mapper 中配置的所有緩存信息,其中 Key 為 Cache 的 id,也就是 Mapper 的命名空間,Value 為 Cache 對象
  • resultMaps:用於註冊 Mapper 配置文件中通過 標簽配置的 ResultMap 信息,ResultMap 用於建立 Java 實體屬性與資料庫欄位之間的映射關係,其中 Key 為 ResultMap 的 id,該 id 是由 Mapper 命名空間和 標簽的 id 屬性組成的,Value 為解析 標簽後得到的 ResultMap 對象
  • parameterMaps:用於註冊 Mapper 中通過 標簽註冊的參數映射信息。Key 為 ParameterMap 的 id,由 Mapper 命名空間和 標簽的 id 屬性構成,Value 為解析 標簽後得到的 ParameterMap 對象
  • keyGenerators:用於註冊 KeyGenerator,KeyGenerator 是 MyBatis 的主鍵生成器,MyBatis 提供了三種KeyGenerator,即 Jdbc3KeyGenerator(資料庫自增主鍵)、NoKeyGenerator(無自增主鍵)、SelectKeyGenerator(通過 select 語句查詢自增主鍵,例如 oracle 的 sequence)
  • loadedResources:用於註冊所有 Mapper XML 配置文件路徑
  • sqlFragments:用於註冊 Mapper 中通過 標簽配置的 SQL 片段,Key 為 SQL 片段的 id,Value 為 MyBatis 封裝的表示 XML 節點的 XNode 對象
  • incompleteStatements:用於註冊解析出現異常的 XMLStatementBuilder 對象
  • incompleteCacheRefs:用於註冊解析出現異常的 CacheRefResolver 對象
  • incompleteResultMaps:用於註冊解析出現異常的 ResultMapResolver 對象
  • incompleteMethods:用於註冊解析出現異常的 MethodResolver 對象

MyBatis 框架啟動時,會對所有的配置信息進行解析,然後將解析後的內容註冊到 Configuration 對象的這些屬性中。除此之外,Configuration 組件還作為 Executor、StatementHandler、ResultSetHandler、ParameterHandler 組件的工廠類,用於創建這些組件的實例。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # JavaWeb 概述 **網站發佈和部署一定要依托技術語言嗎:** 不一定,一個網站可以直接發佈和部署,因為因為瀏覽器能夠識別網頁只需要兩樣東西,網路和靜態頁面,還有一個裝在他們的容器,比如 nginx。 **靜態頁面面臨的問題:** - 1:靜態網頁是固定的,是不可變的。如果一個網站比如騰訊首 ...
  • 0x01 如下RPC通信場景:業務線向交易中台發起交易。當交易完成後,zhongtai-trans要將交易結果通知給業務線。 那麼,在程式實現上,zhongtai-trans如何通知業務線呢? 0x02 這個問題暫且不表。我們先來看跨企業通信的業務回調通知。這裡,我們以商戶對接微信支付來舉例。用戶在 ...
  • 通過配置網關白名單列表的方式,在過濾器中對白名單直接放行,可用於對外開放介面,內部系統的登錄後的攔截校驗等場景 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • ## 簡介 藉助 `github.com/hpcloud/tail` ,可以實時追蹤文件變更,達到類似shell命令`tail -f`的效果。 ## 示例代碼 以下示例代碼用於實時讀取nginx的`access.log`日誌文件,讀取到後輸出到控制台。如果nginx日誌做了json格式化,還可以解析 ...
  • ## 嵌入式伺服器 Spring Boot 的嵌入式伺服器功能是一項方便而強大的功能,它允許你在應用程式中直接運行 Web 伺服器,無需將其部署到單獨的獨立 Web 伺服器中。這使得開發、測試和部署 Web 應用程式變得容易,而且它還是輕量級的、易於啟動和停止的,易於配置。 ## Hibernate ...
  • **原文鏈接:** [使用 Go 語言實現二叉搜索樹](https://mp.weixin.qq.com/s/2wYRmG_AiiHYjLDEXg94Ag) 二叉樹是一種常見並且非常重要的數據結構,在很多項目中都能看到二叉樹的身影。 它有很多變種,比如紅黑樹,常被用作 `std::map` 和 `s ...
  • ### 你可以按照以下步驟製作自己的Python模塊: 1.創建一個新的.py文件,並定義你自己的函數或類。 2.編寫文檔字元串docstring,說明該函數或類的作用、參數和返回值說明等。 3.給你的函數或類添加恰當的註釋。 4.將該.py文件放在工程目錄的一個新文件夾中,這個文件夾就是你的模塊。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...