MyBatis 全局配置文件詳解
1 MyBatis 全局配置文件
MyBatais 全局配置文件所有配置項如下所示,配置項只能按照如下順序進行設(shè)置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--配置--> <properties/> <!--屬性--> <settings/> <!--全局配置參數(shù)--> <typeAliases/> <!--類型別名--> <typeHandlers/> <!--類型處理器--> <objectFactory/><!--對象工廠--> <plugins/><!--創(chuàng)建--> <environments default=""><!--環(huán)境配置--> <environment id=""><!--環(huán)境變量--> <transactionManager type=""/><!--事務(wù)管理器--> <dataSource type=""/><!--數(shù)據(jù)源--> </environment> </environments> <databaseIdProvider type=""/><!--數(shù)據(jù)庫廠商標識--> <mappers/><!--映射器--> </configuration>
2 properties 元素
mysql.properties 配置文件
url=jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC name=root password=123456 driver=com.mysql.cj.jdbc.Driver
通過 properties 元素導入 mysql.properties 配置文件,會在當前配置文件所在目錄下查找 mysql.properties 配置文件
<properties resource="mysql.properties" />
此外,也可以用 properties 元素的 url 屬性來指定屬性文件的 URL
<!-- 指定一個網(wǎng)絡(luò)上的屬性文件 --> <properties url="http://example.com/jdbc.properties" /> <!-- 指定一個位于本地文件系統(tǒng)中的屬性文件 --> <properties url="file:///path/to/config.properties" />
如果屬性在不只一個地方進行了配置,那么 MyBatis 將按照如下順序來加載:
- 在 properties 元素體內(nèi)指定的屬性首先被讀取
<properties> <!--property子元素定義--> <property name="database.driver" value="com.mysql.cj.jdbc.Driver"/> <property name="database.url" value="jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/> <property name="database.username" value="root"/> <property name="database.password" value="123456"/> </properties>
- 然后根據(jù) properties 元素中的 resource 屬性讀取類路徑下屬性文件或根據(jù) url 屬性指定的路徑讀取屬性文件,并覆蓋已讀取的同名屬性
- 最后讀取作為方法參數(shù)傳遞的屬性,并覆蓋已讀取的同名屬性
// 加載數(shù)據(jù)庫配置文件 is = Resources.getResourceAsStream("msyql.properties"); Properties properties = new Properties(); properties.load(is); // 獲取加密信息 String username= properties.getProperty("database.username"); String password= properties.getProperty("database.password"); // 解密用戶名和密碼,并重置屬性 properties.setProperty("database.username", CyperTool.decodeByBase64(username)); properties.setProperty("database.password", CyperTool.decodeByBase64(password));
3 setting 設(shè)置
setting 設(shè)置是 MyBatis 中極為重要的調(diào)整設(shè)置,它們會改變 MyBatis 的運行時行為。但是大部分情況下使用默認值便可以運行,所以在大部分情況下不需要大量配置,只需要修改一些常用的規(guī)則即可。常用規(guī)則有自動映射、駝峰命名映射、級聯(lián)規(guī)則、是否啟動緩存、執(zhí)行器類型等。
<settings> <!--緩存配置的全局開關(guān):如果這里設(shè)置成false,那么即便在映射器中配置開啟也無濟于事 --> <setting name="cacheEnabled" value="true" /> <!--延時加載的全局開關(guān) --> <setting name="lazyLoadingEnabled" value="false" /> </settings>
屬性名 | 含義 | 簡介 | 有效值 | 默認值 |
---|---|---|---|---|
cacheEnabled | 是否使用緩存 | 是整個工程中所有映射器配置緩存的開關(guān),即是一個全局緩存開關(guān) | true | false | true |
lazyLoadingEnabled | 是否開啟延遲加載 | 控制全局是否使用延遲加載。當有特殊關(guān)聯(lián)關(guān)系需要單獨配置時,可以使用 fetchType 屬性來覆蓋此配置 | true | false | false |
aggressiveLazyLoading | 是否按需加載屬性 | 開啟時,不論調(diào)用什么方法加載某個對象,都會加載該對象的所有屬性,關(guān)閉后只會按需加載 | true | false | false |
multipleResultSetsEnabled | 是否允許單一語句返回多結(jié)果集 | 即 Mapper 配置中一個單一的 sql 配置是否能夠返回多個結(jié)果集 | true | false | true |
useColumnLabel | 使用列標簽代替列名 | 設(shè)置是否使用列標簽代替列名 | true | false | true |
useGenerateKeys | 是否支持 JDBC 自動生成主鍵 | 設(shè)置之后,將會強制使用自動生成主鍵的策略 | true | false | false |
autoMappingBehavior | 指定 MyBatis 自動映射字段或?qū)傩缘姆绞?/td> | 有三種方式,NONE 時將取消自動映射;PARTIAL 時只會自動映射沒有定義結(jié)果集的結(jié)果映射;FULL 時會映射任意復雜的結(jié)果集 | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 設(shè)置當自動映射時發(fā)現(xiàn)未知列的動作 | 有三種動作,NONE 時不做任何操作;WARNING 時會輸出提醒日志;FALLING 時會拋出 SqlSessionException 異常表示映射失敗 | NONE, WARNING, FALLING | NONE |
defaultExecutorType | 設(shè)置默認的執(zhí)行器 | 有三種執(zhí)行器,SIMPLE 為普通執(zhí)行器;REUSE 執(zhí)行器會重用處理語句;BATCH 執(zhí)行器將重用語句并執(zhí)行批量更新 | SIMPLE, REUSE, BATCH | SIMPLE |
defaultStatementTimeout | 設(shè)置超時時間 | 該超時時間即數(shù)據(jù)驅(qū)動連接數(shù)據(jù)庫時,等待數(shù)據(jù)庫回應(yīng)的最大秒數(shù) | 任意正整數(shù) | 無 |
defaultFetchSize | 設(shè)置驅(qū)動的結(jié)果集 | 為了防止從數(shù)據(jù)庫查詢出來的結(jié)果過多,而導致內(nèi)存溢出,可以通過設(shè)置 fetchSize 參數(shù)來控制結(jié)果集的數(shù)量 | 任意正整數(shù) | 無 |
safeRowBoundsEnabled | 允許在嵌套語句中使用分頁,RowBound,即行內(nèi)嵌套語句 | 如果允許在 sql 的行內(nèi)嵌套語句中使用分頁,就設(shè)置該值為 false | true | false | false |
safeResultHandlerEnabled | 允許在嵌套語句中使用分頁,ResultHandler,即結(jié)果及處理 | 如果允許對 sql 的結(jié)果集使用分頁,就設(shè)置該值為 false | true | false | true |
mapUnderscoreToCamelCase | 是否開啟駝峰命名規(guī)則映射 | 表名數(shù)據(jù)庫中的字段名稱與工程中 Java 實體內(nèi)的映射是否采用駝峰命名規(guī)則校驗 | true | false | false |
localCacheScope | MyBatis 利用本地緩存機制防止循環(huán)引用和加速重復嵌套查詢 | 默認值為 SESSION,這種情況下會緩存一個會話中執(zhí)行的所有查詢。若設(shè)置為 STATEMENT,一級緩存僅對當前執(zhí)行的語句有效。這意味著每次語句執(zhí)行完畢后,緩存就會被清空 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | JDBC 類型的默認設(shè)置 | 當沒有參數(shù)提供特定的 JDBC 類型時,為空值指定 JDBC 類型。某些驅(qū)動需要指定列的 JDBC 類型,多數(shù)情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER | 常用 NUL、VARCHAR、OTHER | OTHER |
lazyLoadTriggeerMethods | 指定哪個對象的方法觸發(fā)一次延遲加載 | 配置需要觸發(fā)延遲加載的方法的名字,該方法就會觸發(fā)一次延遲加載 | 一個逗號分隔的方法名稱列表 | equals, clone, hashCode, toString |
defaultScriptingLanguage | 動態(tài) sql 默認語言 | 指定動態(tài) sql 生成的默認語言 | 一個類型的的別名或者一個類的全類名 | org.apache.ibatis. scripting.xmltargs. XMLLanguageDriver |
callSettersOnNulls | 是否在空值情況下調(diào)用 Set 方法 | 指定當結(jié)果集中的值為 null 時是否調(diào)用映射對像的 setter (map 對象為 put)方法,這對于有 Map.keySet() 依賴或 null 值初始化是有用的。注意基本類型不能設(shè)置為 null | true | false | false |
returnInstanceForEmptyRow | 返回空實體集對象 | 當返回行的所有列都是空時,MyBatis 默認返回 null。當開啟這個設(shè)置時,MyBatis 會返回一個空實例。此外,從 MyBatis 3.4.2 開始,它也適用于嵌套的結(jié)果集 | true | false | false |
logImpl | 日志實現(xiàn) | 指定 MyBatis 所用日志的具體實現(xiàn),為指定時將自動查找 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 無 |
proxyFactory | 代理工廠 | 指定 MyBatis 創(chuàng)建具有延遲加載能力的對象所用到的代理工具 | CGLIB | JAVASSIST | JAVASSIST |
vfsImpl | vfs 實現(xiàn) | 指定 vfs 的實現(xiàn) | 自定義 VFS 實現(xiàn)類的全類名,以逗號分割 | 無 |
useActualParamName | 使用方法簽名 | 允許使用方法簽名中的名稱作為語句參數(shù)名稱。要使用該特性,工程必須采用 Java8 編譯,并且加上 -parameters 選項(從 MyBatis 3.4.1 版本開始) | true | false | false |
configurationFactory | 配置工廠 | 指定提供配置實例的類。返回的配置實例用于加載反序列化的懶加載參數(shù)。這個類必須有一個簽名的靜態(tài)配置 getconfiguration() 方法(從 MyBatis 3.2.3 版本開始) | 一個類型別名或者一個類的全類名 | 無 |
4 typeAlianses 別名處理器
typeAliases 可以給類設(shè)置別名,這樣當我們需要使用類時,可以不用每次都寫那么復雜的全類名 (com.pojo.User)
<!--設(shè)置別名--> <typeAliases> <!--對類單獨進行別名設(shè)置 --> <typeAlias alias="user" type="com.pojo.User"></typeAlias> <typeAlias alias="student" type="com.pojo.Student"></typeAlias> </typeAliases>
批量給類設(shè)置別名,為包中的每一個類設(shè)置別名,設(shè)置規(guī)則是:獲取類名稱,將其第一個字母變?yōu)樾?/strong>
<!--設(shè)置別名--> <typeAliases> <!-- 對包進行掃描,可以批量進行別名設(shè)置,設(shè)置規(guī)則是:獲取類名稱,將其第一個字母變?yōu)樾?--> <package name="com.pojo1"/> <package name="com.pojo2"/> <package name="com.pojo3"/> </typeAliases>
通過 @Alias 注解設(shè)置別名
@Alias("user") public class User { 省略...... }
需要注意的是,MyBatis 已經(jīng)為某些類定義了別名,此外,別名對大小寫不敏感。對此,為某些類定義別名時,不能占用已有別名
5 typeHandler 類型處理器
在 typeHandler 類型處理器中,包含 javaType 和 jdbcType 兩種類型,其中 javaType 用來定義 Java 類型,jdbcType 用來定義數(shù)據(jù)庫類型,而 typeHandler 的作用就是對 javaType 和 jdbcType 兩種類型進行轉(zhuǎn)換,如下圖所示:
下圖是 MyBatis 已經(jīng)定義好的部分類型處理器,當然,我們也可以自定義類型處理器,此處不做介紹
6 objectFacotry 對象工廠(了解)
objectFacotry 表示為對象工廠。對象工廠我們只需了解即可,因為到時候與 Spring 整合后,都會由 Spring 來管理。我們知道,在 JDBC 中查詢的結(jié)果會保存在一個結(jié)果集中,而 MyBatis 也是這樣,它會使用其定義的對象工廠 DefaultObjectFactory 來將查詢的結(jié)果保存在結(jié)果集中。
7 plugins 插件(了解)
plugins 插件是 MyBatis 提供的一個非常強大的機制。通過插件,我們可以在不修改 MyBatis 核心代碼的情況下,對其核心行為進行修改。利用動態(tài)代理機制,插件能夠介入到四大對象(Mapper Interface、Mapped Statement、Parameter Map 和 ResultSet Handler)的任何一個方法的執(zhí)行過程中。
8 environments 運行環(huán)境
environments 標簽用于指定當前運行環(huán)境,在 MyBatis 中可以配置多種環(huán)境,比如開發(fā)、測試和生產(chǎn)環(huán)境。每種環(huán)境使用一個 environment 標簽進行配置并指定唯一標識符,可以通過 environments 標簽中的 default 屬性指定一個環(huán)境的標識符來快速的切換環(huán)境,environment 標簽里面分為兩個可配置的標簽:事務(wù)管理 (transactionManager)、數(shù)據(jù)源 (DataSource)。而在我們的日常開發(fā)中,這些都會交給 Spring 來管理,不用在全局配置中編寫。
transactionManager
transactionManager 配置事務(wù)管理器類型,type = JDBC | MANAGED | 自定義(type=全類名或別名)
- JDBC 使用 JdbcTransactionFactory 工廠生成的 JdbcTransaction 對象實現(xiàn),以 JDBC 的方式進行數(shù)據(jù)庫的提交、回滾等操作,它依賴于從數(shù)據(jù)源得到的連接來管理事務(wù)范圍
- MANAGED 使用 ManagedTransactionFactory 工廠生成的 ManagedTransaction 對象實現(xiàn),它的提交和回滾不需要任何操作,而是把事務(wù)交給容器進行處理,默認情況下會關(guān)閉連接,如果不希望默認關(guān)閉,只要將其中的 closeConnection 屬性設(shè)置為 false 即可
- 自定義的事務(wù)管理類型需要實現(xiàn) TransactionFactory 接口
DataSource
在 MyBatis 中,數(shù)據(jù)庫是通過 PooledDataSourceFactory、UnpooledDataSourceFactory 和 JndiDataSourceFactory 三個工廠類來提供,前兩者分別產(chǎn)生 PooledDataSource 和 UnpooledDataSource 類對象,第三個則會根據(jù) JNDI 的信息獲得外部容器實現(xiàn)的數(shù)據(jù)庫連接對象,總之,它們最后都會生成一個實現(xiàn)了 DataSource 接口的數(shù)據(jù)庫連接對象。
type = UNPOOLED | POOLED | JNDI | 自定義
UNPOOLED
UNPOOLED 采用非數(shù)據(jù)庫池的管理方式,每次請求都會新建一個連接,所以性能不是很高,使用這種數(shù)據(jù)源的時候,UNPOOLED 類型的數(shù)據(jù)源可以配置以下屬性:
- driver:數(shù)據(jù)庫驅(qū)動名
- url:數(shù)據(jù)庫連接 URL
- username:用戶名
- password:密碼
- defaultTransactionIsolationLevel:默認的事務(wù)隔離級別,如果要傳遞屬性給驅(qū)動,則屬性的前綴為 driver
POOLED
POOLED 采用連接池的概念將數(shù)據(jù)庫鏈接對象 Connection 組織起來,可以在初始化時創(chuàng)建多個連接,使用時直接從連接池獲取,避免了重復創(chuàng)建連接所需的初始化和認證時間,從而提升了效率,所以這種方式比較適合對性能要求高的應(yīng)用中。除了 UNPOOLED 中的配置屬性之外,還有以下幾個修改連接池的配置:
poolMaximumActiveConnections:用于設(shè)置連接池中允許的最大活躍連接數(shù)。超過這個數(shù)量的連接將會被阻塞,直到有連接被釋放為止,默認值為 10
poolMaxmumIdleConnections:用于設(shè)置連接池中允許的最大空閑連接數(shù)。當連接池中的連接數(shù)量超過這個值時,多余的連接將會被釋放,默認值為 5
poolMaxmumCheckoutTime:用于設(shè)置連接在連接池中的最大使用時間。超過這個時間的連接將會被強制回收,默認值為 20000 毫秒(即 20 秒)
poolTimeToWait:用于設(shè)置從連接池中獲取連接時的最大等待時間。如果在這個時間內(nèi)無法獲取到連接,將會拋出超時異常,默認值為 20000 毫秒(即 20 秒)
JNDI
數(shù)據(jù)源 JNDI 的實現(xiàn)是為了能在如 EJB 或應(yīng)用服務(wù)器這類容器中使用,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個 JNDI 上下文的引用。這種數(shù)據(jù)源只需配置兩個屬性:
- initial_context:用來在 InitialContext 中尋找上下文??蛇x,如果忽略,data_source 屬性將會直接從 InitialContext 中尋找
- data_source:引用數(shù)據(jù)源實例位置上下文的路徑。當提供 initial_context 配置時,data_source 會在其返回的上下文進行查找,否則直接從 InitialContext 中查找
9 databaseIdProvider 數(shù)據(jù)庫廠商(了解)
databaseIdProvider 元素主要是為了支持不同廠商的數(shù)據(jù)庫,這個元素不常用。
<!--數(shù)據(jù)庫廠商標示 --> <databaseIdProvider type="DB_VENDOR"> <property name="Oracle" value="oracle"/> <property name="MySQL" value="mysql"/> <property name="DB2" value="d2"/> </databaseIdProvider>
以下是 databaseIdProvider 中的屬性介紹:
- Type:DB_VENDOR,使用 MyBatis 提供的 VendorDatabaseIdProvider 解析數(shù)據(jù)庫廠商標識。也可以實現(xiàn) DatabaseIdProvider 接口來自定義
- Property-name:數(shù)據(jù)庫廠商標識
- Property-value:為數(shù)據(jù)庫廠商標識起一個別名,方便 SQL 語句使用 databaseId 屬性引用
設(shè)置了以上配置,我們就可以在自己的 sql 語句中使用屬性 databaseId 來標示數(shù)據(jù)庫類型
<!-- 查詢所有用戶 --> <select id="selectAllUser" resultType="com.entity.User" databaseId="oracle"> select * from t_user </select>
10 mapper 加載 SQL 映射文件
mapper 用來加載配置的 SQL 映射文件,它有以下四種加載方式:
- 用文件路徑引入
- 使用 URL 方式引入
- 用類注冊引入
- 用包名引入(推薦)
<mappers> <!-- 用文件路徑引入,這種方式是相對路徑,相對于項目目錄下 --> <mapper resource="com/mapper/UserMapper.xml" /> <!-- 使用 URL 方式引入,這種方式是絕對路徑, 就是從我們的磁盤讀取映射文件,一般不會使用這種方式 --> <mapper url="D:/xxx/com/mapper/UserMapper.xml" /> <!-- 用類注冊引入,若使用這種方式,Mapper接口的名稱必須與映射文件的名稱相同, 并且要在同一個包名下,否則會找不到。如:UserMapper.java(接口)—UserMapper.xml(映射文件) --> <mapper class="com.mapper.UserMapper" /> <!-- 用包名引入(推薦),這種方式的要求同樣是Mapper接口和Mapper的映射文件的名稱要相同, 并且要放在相同的包名下,否則會導致找不到 --> <package name="com.mapper"/> </mappers>
11 參考文檔
尚硅谷文檔
Mybatis3詳解(三)----Mybatis全局配置文件詳解
到此這篇關(guān)于MyBatis 全局配置文件詳解的文章就介紹到這了,更多相關(guān)MyBatis 全局配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java編程實現(xiàn)遍歷兩個MAC地址之間所有MAC的方法
這篇文章主要介紹了Java編程實現(xiàn)遍歷兩個MAC地址之間所有MAC的方法,涉及Java針對MAC的遍歷獲取與字符串轉(zhuǎn)換相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11SpringBoot項目打成war和jar的區(qū)別說明
這篇文章主要介紹了SpringBoot項目打成war和jar的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06Spring中AOP概念與兩種動態(tài)代理模式原理詳解
AOP是面向切面編程的技術(shù),AOP基于IoC基礎(chǔ),是對OOP的有益補充,流行的AOP框架有Sping AOP、AspectJ,這篇文章主要給大家介紹了關(guān)于Spring中AOP概念與兩種動態(tài)代理模式原理的相關(guān)資料,需要的朋友可以參考下2021-10-10Java實現(xiàn)的圖片高質(zhì)量縮放類定義與用法示例
這篇文章主要介紹了Java實現(xiàn)的圖片高質(zhì)量縮放類定義與用法,涉及java針對圖片的運算與轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11