MyBatis?核心組件Configuration實例詳解
概述
Mybatis 的核心組件如下所示:
- Configuration:用于描述 MyBatis 的主配置信息,其他組件需要獲取配置信息時,直接通過 Configuration 對象獲取。除此之外,MyBatis 在應用啟動時,將 Mapper 配置信息、類型別名、TypeHandler 等注冊到 Configuration 組件中,其他組件需要這些信息時,也可以從 Configuration 對象中獲取
- MappedStatement:用于描述 Mapper 中的 SQL 配置信息,是對 Mapper XML 配置文件中
<select|update|delete|insert>
等標簽或者@Select/@Update
等注解配置信息的封裝 - SqlSession:是 MyBatis 提供的面向用戶的 API,表示和數(shù)據(jù)庫交互時的會話對象,用于完成數(shù)據(jù)庫的增刪改查功能。SqlSession 是 Executor 組件的外觀,目的是對外提供易于理解和使用的數(shù)據(jù)庫操作接口
- Executor:MyBatis 的 SQL 執(zhí)行器,MyBatis 對數(shù)據(jù)庫所有的增刪改查操作都是由 Executor 組件完成的
- StatementHandler:封裝了對 JDBC Statement 對象的操作,比如為 Statement 對象設置參數(shù),調用 Statement 接口提供的方法與數(shù)據(jù)庫交互等等
- ParameterHandler:當 MyBatis 框架使用的 Statement 類型為 CallableStatcment 和 PreparedStatement 時,ParamelerHandler 用于為 Statement 對象參數(shù)占位符設置值
- ResultSetHandler:ResultSetHandler 封裝了對 JDBC 的 ResultSet 對象操作,當執(zhí)行 SQL 類型為 SELECT 語句時,ResultSetHandler 用于將查詢結果轉換成 Java 對象
- TypeHandler:TypeHandler 是 MyBatis 中的類型處理器,用于處理 Java 類型與 JDBC 類型之間的映射,它的作用主要體現(xiàn)在能夠根據(jù) Java 類型調用 PreparedStatement 或 CallableStatement 對象對應的 set 方法為 Statement 對象設置值,而且能夠根據(jù) Java 類型調用 ResultSet 對象對應的 get 獲取SQL執(zhí)行結果
在使用 MyBatis 時,我們使用到 SqlSession 組件,它是用戶層面的 API。實際上 SqlSession 是Executor 組件的外觀,目的是為用戶提供更友好的數(shù)據(jù)庫操作接口,這是設計模式中外觀模式的典型應用。真正執(zhí)行 SQL 操作的是 Executor 組件,Executor 可以理解為 SQL 執(zhí)行器,它會使用 StatementHandler 組件對 JDBC 的 Statement 對象進行操作。當 Statement 類型為 CallableStatement 和 PreparedStatement 時,會通過 ParameterHandler 組件為參數(shù)占位符賦值。ParameterHandler 組件中會根據(jù) Java 類型找到對應的 TypeHandler 對象,TypeHandler 會通過 Statement 對象提供的set 方法為 Statement 對象中的參數(shù)占位符設置值。StatementHandler 組件使用 JDBC 中的 Statement 對象與數(shù)據(jù)庫完成交互后,當 SQL 語句類型為 SELECT 時,MyBatis 通過 ResultSetHandler 組件從 Statement 對象中獲取 ResultSet 對象,然后將 ResultSet 對象轉換為 Java 對象
Configuration
MyBatis 框架的配置信息有兩種,一種是配置 MyBatis 框架屬性的主配置文件;另一種是配置執(zhí)行 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:延遲加載的全局開關。當開啟時,所有關聯(lián)對象都會延遲加載。特定關聯(lián)關系中可通過設置 fetchType 屬性來覆蓋該項的開關狀態(tài),默認 false
- aggressiveLazyLoading:當開啟時,任何方法的調用都會加載該對象的所有屬性。否則,每個屬性會按需加載,默認 false,3.4.1 之前默認為 true
- multipleResultSetsEnabled:是否允許單一語句返回多結果集,默認 true
- useColumnLabel:使用列標簽代替列名,不同的驅動在這方面會有不同的表現(xiàn),默認 true
- useGeneratedKeys:允許 JDBC 支持自動生成主鍵,需要驅動兼容。如果設置為 true,則這個設置強制使用自動生成主鍵,盡管一些驅動不能兼容,但仍可正常工作,默認 false
- autoMappingBehavior:指定 MyBatis 應該如何自動映射列到 Java 實體屬性。NONE 表示取消自動映射,PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。FULL 會自動映射任意復雜的結果集(無論是否嵌套),默認 PARTIAL
- autoMappingUnknownColumnBehavior:指定發(fā)現(xiàn)自動映射目標未知列(或者未知屬性)的行為。NONE:不做任何反應,WARNING:輸出提醒日志,F(xiàn)AILING:映射失敗,拋出異常,默認 NONE
- defaultExecutorType:配置默認的 Executor 類型,SIMPLE 就是普通的 Executor;REUSE 會復用 Statement 對象;BATCH 會批量執(zhí)行所有更新語句,默認 SIMPLE
- defaultStatementTimeout:設置超時時間,它決定驅動等待數(shù)據(jù)庫響應的秒數(shù),可以說任意正整數(shù),默認為 null 未設置
- defaultFetchSize:默認的 FetchSize,用于設置 Statement 對象的 fetchSize 屬性,用于限制從數(shù)據(jù)庫中獲取數(shù)據(jù)的最大行數(shù),默認為 null 未設置
- SafeRowBoundsEnabled:允許在嵌套語句中使用分頁(RowBounds),如果允許使用,則設置為 false,默認 false
- safeResultHandlerEnabled:允許在嵌套語句中使用分頁(ResultHandler),如果允許使用,則設置為 false,默認 false
- mapUnderscoreToCamelCase:是否開啟自動駝峰命名規(guī)則映射,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN 到經(jīng)典 Java 屬性名 aColumn 的映射
- localCacheScope:MyBatis 利用本地緩存機制防止循環(huán)引用和加速重復查詢。默認值為 SESSION,這種情況下會緩存?zhèn)€會話中執(zhí)行的所有查詢。若設置值為 STATEMENT,本地會話僅用在語句執(zhí)行上,對相同 SqlSession 的不同調用將不會共享數(shù)據(jù)
- jdbcTypeForNuIl:當沒有為參數(shù)指定 JDBC 類型時,指定 JDBC 類型的值為null。一些驅動需要指定 JDBC 類型,多數(shù)情況下直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER,默認 OTHER
- lazyLoadTriggerMethods:指定哪個對象的方法會觸發(fā)一次延遲加載,參數(shù)是用逗號分割的方法列表
- defaultScriptingLanguage:指定動態(tài) SQL 生成的默認語言,參數(shù)值為一個類型別名或完全限定類名,默認值: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 所用日志的具體實現(xiàn),未指定時將自動查找,可設置 SLF4J、LOG4J等,默認未設置
- proxyFactory:指定MyBatis 創(chuàng)建具有延遲加載能力的對象所用到的代理工具,可選值有 JAVASSIST、CGLIB,默認 JAVASSIST
- vfsImpl:指定 VFS 的實現(xiàn),參數(shù)我 VFS 的實現(xiàn)類的全限定名,以逗號分隔,默認未設置
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 對象用于創(chuàng)建 Mapper 動態(tài)代理對象
- 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 實體屬性與數(shù)據(jù)庫字段之間的映射關系,其中 Key 為 ResultMap 的 id,該 id 是由 Mapper 命名空間和 標簽的 id 屬性組成的,Value 為解析 標簽后得到的 ResultMap 對象
- parameterMaps:用于注冊 Mapper 中通過 標簽注冊的參數(shù)映射信息。Key 為 ParameterMap 的 id,由 Mapper 命名空間和 標簽的 id 屬性構成,Value 為解析 標簽后得到的 ParameterMap 對象
- keyGenerators:用于注冊 KeyGenerator,KeyGenerator 是 MyBatis 的主鍵生成器,MyBatis 提供了三種KeyGenerator,即 Jdbc3KeyGenerator(數(shù)據(jù)庫自增主鍵)、NoKeyGenerator(無自增主鍵)、SelectKeyGenerator(通過 select 語句查詢自增主鍵,例如 oracle 的 sequence)
- loadedResources:用于注冊所有 Mapper XML 配置文件路徑
- sqlFragments:用于注冊 Mapper 中通過 標簽配置的 SQL 片段,Key 為 SQL 片段的 id,Value 為 MyBatis 封裝的表示 XML 節(jié)點的 XNode 對象
- incompleteStatements:用于注冊解析出現(xiàn)異常的 XMLStatementBuilder 對象
- incompleteCacheRefs:用于注冊解析出現(xiàn)異常的 CacheRefResolver 對象
- incompleteResultMaps:用于注冊解析出現(xiàn)異常的 ResultMapResolver 對象
- incompleteMethods:用于注冊解析出現(xiàn)異常的 MethodResolver 對象
MyBatis 框架啟動時,會對所有的配置信息進行解析,然后將解析后的內容注冊到 Configuration 對象的這些屬性中。除此之外,Configuration 組件還作為 Executor、StatementHandler、ResultSetHandler、ParameterHandler 組件的工廠類,用于創(chuàng)建這些組件的實例。
到此這篇關于MyBatis 核心組件Configuration的文章就介紹到這了,更多相關MyBatis組件Configuration內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring MVC配置雙數(shù)據(jù)源實現(xiàn)一個java項目同時連接兩個數(shù)據(jù)庫的方法
這篇文章主要給大家介紹了關于Spring MVC如何配置雙數(shù)據(jù)源實現(xiàn)一個java項目同時連接兩個數(shù)據(jù)庫的相關資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-05-05使用Java實現(xiàn)在Excel中創(chuàng)建下拉列表
下拉列表(下拉框)可以確保用戶僅從預先給定的選項中進行選擇,這樣不僅能減少數(shù)據(jù)輸入錯誤,還能節(jié)省時間提高效率,下面我們就來看看如何在java中利用免費庫實現(xiàn)創(chuàng)建下拉列表吧2024-03-03SpringBoot集成?JWT實現(xiàn)用戶登錄認證的項目實踐
當今前后端分離時代,基于Token的會話保持機制比傳統(tǒng)的Session/Cookie機制更加方便,本文主要介紹了SpringBoot集成?JWT實現(xiàn)用戶登錄認證的項目實踐,感興趣的可以了解一下2023-08-08