MyBatis 全局配置文件詳解
1 MyBatis 全局配置文件
MyBatais 全局配置文件所有配置項如下所示,配置項只能按照如下順序進行設置
<?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/> <!--全局配置參數-->
<typeAliases/> <!--類型別名-->
<typeHandlers/> <!--類型處理器-->
<objectFactory/><!--對象工廠-->
<plugins/><!--創(chuàng)建-->
<environments default=""><!--環(huán)境配置-->
<environment id=""><!--環(huán)境變量-->
<transactionManager type=""/><!--事務管理器-->
<dataSource type=""/><!--數據源-->
</environment>
</environments>
<databaseIdProvider type=""/><!--數據庫廠商標識-->
<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
<!-- 指定一個網絡上的屬性文件 --> <properties url="http://example.com/jdbc.properties" /> <!-- 指定一個位于本地文件系統(tǒng)中的屬性文件 --> <properties url="file:///path/to/config.properties" />
如果屬性在不只一個地方進行了配置,那么 MyBatis 將按照如下順序來加載:
- 在 properties 元素體內指定的屬性首先被讀取
<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>- 然后根據 properties 元素中的 resource 屬性讀取類路徑下屬性文件或根據 url 屬性指定的路徑讀取屬性文件,并覆蓋已讀取的同名屬性
- 最后讀取作為方法參數傳遞的屬性,并覆蓋已讀取的同名屬性
// 加載數據庫配置文件
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 設置
setting 設置是 MyBatis 中極為重要的調整設置,它們會改變 MyBatis 的運行時行為。但是大部分情況下使用默認值便可以運行,所以在大部分情況下不需要大量配置,只需要修改一些常用的規(guī)則即可。常用規(guī)則有自動映射、駝峰命名映射、級聯規(guī)則、是否啟動緩存、執(zhí)行器類型等。
<settings>
<!--緩存配置的全局開關:如果這里設置成false,那么即便在映射器中配置開啟也無濟于事 -->
<setting name="cacheEnabled" value="true" />
<!--延時加載的全局開關 -->
<setting name="lazyLoadingEnabled" value="false" />
</settings>| 屬性名 | 含義 | 簡介 | 有效值 | 默認值 |
|---|---|---|---|---|
| cacheEnabled | 是否使用緩存 | 是整個工程中所有映射器配置緩存的開關,即是一個全局緩存開關 | true | false | true |
| lazyLoadingEnabled | 是否開啟延遲加載 | 控制全局是否使用延遲加載。當有特殊關聯關系需要單獨配置時,可以使用 fetchType 屬性來覆蓋此配置 | true | false | false |
| aggressiveLazyLoading | 是否按需加載屬性 | 開啟時,不論調用什么方法加載某個對象,都會加載該對象的所有屬性,關閉后只會按需加載 | true | false | false |
| multipleResultSetsEnabled | 是否允許單一語句返回多結果集 | 即 Mapper 配置中一個單一的 sql 配置是否能夠返回多個結果集 | true | false | true |
| useColumnLabel | 使用列標簽代替列名 | 設置是否使用列標簽代替列名 | true | false | true |
| useGenerateKeys | 是否支持 JDBC 自動生成主鍵 | 設置之后,將會強制使用自動生成主鍵的策略 | true | false | false |
| autoMappingBehavior | 指定 MyBatis 自動映射字段或屬性的方式 | 有三種方式,NONE 時將取消自動映射;PARTIAL 時只會自動映射沒有定義結果集的結果映射;FULL 時會映射任意復雜的結果集 | NONE, PARTIAL, FULL | PARTIAL |
| autoMappingUnknownColumnBehavior | 設置當自動映射時發(fā)現未知列的動作 | 有三種動作,NONE 時不做任何操作;WARNING 時會輸出提醒日志;FALLING 時會拋出 SqlSessionException 異常表示映射失敗 | NONE, WARNING, FALLING | NONE |
| defaultExecutorType | 設置默認的執(zhí)行器 | 有三種執(zhí)行器,SIMPLE 為普通執(zhí)行器;REUSE 執(zhí)行器會重用處理語句;BATCH 執(zhí)行器將重用語句并執(zhí)行批量更新 | SIMPLE, REUSE, BATCH | SIMPLE |
| defaultStatementTimeout | 設置超時時間 | 該超時時間即數據驅動連接數據庫時,等待數據庫回應的最大秒數 | 任意正整數 | 無 |
| defaultFetchSize | 設置驅動的結果集 | 為了防止從數據庫查詢出來的結果過多,而導致內存溢出,可以通過設置 fetchSize 參數來控制結果集的數量 | 任意正整數 | 無 |
| safeRowBoundsEnabled | 允許在嵌套語句中使用分頁,RowBound,即行內嵌套語句 | 如果允許在 sql 的行內嵌套語句中使用分頁,就設置該值為 false | true | false | false |
| safeResultHandlerEnabled | 允許在嵌套語句中使用分頁,ResultHandler,即結果及處理 | 如果允許對 sql 的結果集使用分頁,就設置該值為 false | true | false | true |
| mapUnderscoreToCamelCase | 是否開啟駝峰命名規(guī)則映射 | 表名數據庫中的字段名稱與工程中 Java 實體內的映射是否采用駝峰命名規(guī)則校驗 | true | false | false |
| localCacheScope | MyBatis 利用本地緩存機制防止循環(huán)引用和加速重復嵌套查詢 | 默認值為 SESSION,這種情況下會緩存一個會話中執(zhí)行的所有查詢。若設置為 STATEMENT,一級緩存僅對當前執(zhí)行的語句有效。這意味著每次語句執(zhí)行完畢后,緩存就會被清空 | SESSION | STATEMENT | SESSION |
| jdbcTypeForNull | JDBC 類型的默認設置 | 當沒有參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 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 | 是否在空值情況下調用 Set 方法 | 指定當結果集中的值為 null 時是否調用映射對像的 setter (map 對象為 put)方法,這對于有 Map.keySet() 依賴或 null 值初始化是有用的。注意基本類型不能設置為 null | true | false | false |
| returnInstanceForEmptyRow | 返回空實體集對象 | 當返回行的所有列都是空時,MyBatis 默認返回 null。當開啟這個設置時,MyBatis 會返回一個空實例。此外,從 MyBatis 3.4.2 開始,它也適用于嵌套的結果集 | true | false | false |
| logImpl | 日志實現 | 指定 MyBatis 所用日志的具體實現,為指定時將自動查找 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 無 |
| proxyFactory | 代理工廠 | 指定 MyBatis 創(chuàng)建具有延遲加載能力的對象所用到的代理工具 | CGLIB | JAVASSIST | JAVASSIST |
| vfsImpl | vfs 實現 | 指定 vfs 的實現 | 自定義 VFS 實現類的全類名,以逗號分割 | 無 |
| useActualParamName | 使用方法簽名 | 允許使用方法簽名中的名稱作為語句參數名稱。要使用該特性,工程必須采用 Java8 編譯,并且加上 -parameters 選項(從 MyBatis 3.4.1 版本開始) | true | false | false |
| configurationFactory | 配置工廠 | 指定提供配置實例的類。返回的配置實例用于加載反序列化的懶加載參數。這個類必須有一個簽名的靜態(tài)配置 getconfiguration() 方法(從 MyBatis 3.2.3 版本開始) | 一個類型別名或者一個類的全類名 | 無 |
4 typeAlianses 別名處理器
typeAliases 可以給類設置別名,這樣當我們需要使用類時,可以不用每次都寫那么復雜的全類名 (com.pojo.User)
<!--設置別名-->
<typeAliases>
<!--對類單獨進行別名設置 -->
<typeAlias alias="user" type="com.pojo.User"></typeAlias>
<typeAlias alias="student" type="com.pojo.Student"></typeAlias>
</typeAliases>批量給類設置別名,為包中的每一個類設置別名,設置規(guī)則是:獲取類名稱,將其第一個字母變?yōu)樾?/strong>
<!--設置別名-->
<typeAliases>
<!-- 對包進行掃描,可以批量進行別名設置,設置規(guī)則是:獲取類名稱,將其第一個字母變?yōu)樾?-->
<package name="com.pojo1"/>
<package name="com.pojo2"/>
<package name="com.pojo3"/>
</typeAliases>通過 @Alias 注解設置別名
@Alias("user")
public class User {
省略......
}需要注意的是,MyBatis 已經為某些類定義了別名,此外,別名對大小寫不敏感。對此,為某些類定義別名時,不能占用已有別名

5 typeHandler 類型處理器
在 typeHandler 類型處理器中,包含 javaType 和 jdbcType 兩種類型,其中 javaType 用來定義 Java 類型,jdbcType 用來定義數據庫類型,而 typeHandler 的作用就是對 javaType 和 jdbcType 兩種類型進行轉換,如下圖所示:

下圖是 MyBatis 已經定義好的部分類型處理器,當然,我們也可以自定義類型處理器,此處不做介紹

6 objectFacotry 對象工廠(了解)
objectFacotry 表示為對象工廠。對象工廠我們只需了解即可,因為到時候與 Spring 整合后,都會由 Spring 來管理。我們知道,在 JDBC 中查詢的結果會保存在一個結果集中,而 MyBatis 也是這樣,它會使用其定義的對象工廠 DefaultObjectFactory 來將查詢的結果保存在結果集中。
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ā)、測試和生產環(huán)境。每種環(huán)境使用一個 environment 標簽進行配置并指定唯一標識符,可以通過 environments 標簽中的 default 屬性指定一個環(huán)境的標識符來快速的切換環(huán)境,environment 標簽里面分為兩個可配置的標簽:事務管理 (transactionManager)、數據源 (DataSource)。而在我們的日常開發(fā)中,這些都會交給 Spring 來管理,不用在全局配置中編寫。
transactionManager
transactionManager 配置事務管理器類型,type = JDBC | MANAGED | 自定義(type=全類名或別名)
- JDBC 使用 JdbcTransactionFactory 工廠生成的 JdbcTransaction 對象實現,以 JDBC 的方式進行數據庫的提交、回滾等操作,它依賴于從數據源得到的連接來管理事務范圍
- MANAGED 使用 ManagedTransactionFactory 工廠生成的 ManagedTransaction 對象實現,它的提交和回滾不需要任何操作,而是把事務交給容器進行處理,默認情況下會關閉連接,如果不希望默認關閉,只要將其中的 closeConnection 屬性設置為 false 即可
- 自定義的事務管理類型需要實現 TransactionFactory 接口
DataSource
在 MyBatis 中,數據庫是通過 PooledDataSourceFactory、UnpooledDataSourceFactory 和 JndiDataSourceFactory 三個工廠類來提供,前兩者分別產生 PooledDataSource 和 UnpooledDataSource 類對象,第三個則會根據 JNDI 的信息獲得外部容器實現的數據庫連接對象,總之,它們最后都會生成一個實現了 DataSource 接口的數據庫連接對象。
type = UNPOOLED | POOLED | JNDI | 自定義
UNPOOLED
UNPOOLED 采用非數據庫池的管理方式,每次請求都會新建一個連接,所以性能不是很高,使用這種數據源的時候,UNPOOLED 類型的數據源可以配置以下屬性:
- driver:數據庫驅動名
- url:數據庫連接 URL
- username:用戶名
- password:密碼
- defaultTransactionIsolationLevel:默認的事務隔離級別,如果要傳遞屬性給驅動,則屬性的前綴為 driver
POOLED
POOLED 采用連接池的概念將數據庫鏈接對象 Connection 組織起來,可以在初始化時創(chuàng)建多個連接,使用時直接從連接池獲取,避免了重復創(chuàng)建連接所需的初始化和認證時間,從而提升了效率,所以這種方式比較適合對性能要求高的應用中。除了 UNPOOLED 中的配置屬性之外,還有以下幾個修改連接池的配置:
poolMaximumActiveConnections:用于設置連接池中允許的最大活躍連接數。超過這個數量的連接將會被阻塞,直到有連接被釋放為止,默認值為 10
poolMaxmumIdleConnections:用于設置連接池中允許的最大空閑連接數。當連接池中的連接數量超過這個值時,多余的連接將會被釋放,默認值為 5
poolMaxmumCheckoutTime:用于設置連接在連接池中的最大使用時間。超過這個時間的連接將會被強制回收,默認值為 20000 毫秒(即 20 秒)
poolTimeToWait:用于設置從連接池中獲取連接時的最大等待時間。如果在這個時間內無法獲取到連接,將會拋出超時異常,默認值為 20000 毫秒(即 20 秒)
JNDI
數據源 JNDI 的實現是為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然后放置一個 JNDI 上下文的引用。這種數據源只需配置兩個屬性:
- initial_context:用來在 InitialContext 中尋找上下文??蛇x,如果忽略,data_source 屬性將會直接從 InitialContext 中尋找
- data_source:引用數據源實例位置上下文的路徑。當提供 initial_context 配置時,data_source 會在其返回的上下文進行查找,否則直接從 InitialContext 中查找
9 databaseIdProvider 數據庫廠商(了解)
databaseIdProvider 元素主要是為了支持不同廠商的數據庫,這個元素不常用。
<!--數據庫廠商標示 -->
<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 解析數據庫廠商標識。也可以實現 DatabaseIdProvider 接口來自定義
- Property-name:數據庫廠商標識
- Property-value:為數據庫廠商標識起一個別名,方便 SQL 語句使用 databaseId 屬性引用
設置了以上配置,我們就可以在自己的 sql 語句中使用屬性 databaseId 來標示數據庫類型
<!-- 查詢所有用戶 -->
<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全局配置文件詳解
到此這篇關于MyBatis 全局配置文件詳解的文章就介紹到這了,更多相關MyBatis 全局配置文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot項目打成war和jar的區(qū)別說明
這篇文章主要介紹了SpringBoot項目打成war和jar的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
Spring中AOP概念與兩種動態(tài)代理模式原理詳解
AOP是面向切面編程的技術,AOP基于IoC基礎,是對OOP的有益補充,流行的AOP框架有Sping AOP、AspectJ,這篇文章主要給大家介紹了關于Spring中AOP概念與兩種動態(tài)代理模式原理的相關資料,需要的朋友可以參考下2021-10-10

