目錄
1 MyBatis 全局配置文件
2 properties 元素
3 setting 設置
4?typeAlianses 別名處理器
5?typeHandler 類型處理器
6 objectFacotry 對象工廠(了解)
7 plugins 插件(了解)
8 environments 運行環境
9?databaseIdProvider 數據庫廠商(了解)
10 mapper 加載 SQL 映射文件
11 參考文檔
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/><!--創建--><environments default=""><!--環境配置--><environment id=""><!--環境變量--><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" /><!-- 指定一個位于本地文件系統中的屬性文件 -->
<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 的運行時行為。但是大部分情況下使用默認值便可以運行,所以在大部分情況下不需要大量配置,只需要修改一些常用的規則即可。常用規則有自動映射、駝峰命名映射、級聯規則、是否啟動緩存、執行器類型等。
<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 | 設置當自動映射時發現未知列的動作 | 有三種動作,NONE 時不做任何操作;WARNING 時會輸出提醒日志;FALLING 時會拋出 SqlSessionException 異常表示映射失敗 | NONE, WARNING, FALLING | NONE |
defaultExecutorType | 設置默認的執行器 | 有三種執行器,SIMPLE 為普通執行器;REUSE 執行器會重用處理語句;BATCH 執行器將重用語句并執行批量更新 | SIMPLE, REUSE, BATCH | SIMPLE |
defaultStatementTimeout | 設置超時時間 | 該超時時間即數據驅動連接數據庫時,等待數據庫回應的最大秒數 | 任意正整數 | 無 |
defaultFetchSize | 設置驅動的結果集 | 為了防止從數據庫查詢出來的結果過多,而導致內存溢出,可以通過設置 fetchSize 參數來控制結果集的數量 | 任意正整數 | 無 |
safeRowBoundsEnabled | 允許在嵌套語句中使用分頁,RowBound,即行內嵌套語句 | 如果允許在 sql 的行內嵌套語句中使用分頁,就設置該值為 false | true | false | false |
safeResultHandlerEnabled | 允許在嵌套語句中使用分頁,ResultHandler,即結果及處理 | 如果允許對 sql 的結果集使用分頁,就設置該值為 false | true | false | true |
mapUnderscoreToCamelCase | 是否開啟駝峰命名規則映射 | 表名數據庫中的字段名稱與工程中 Java 實體內的映射是否采用駝峰命名規則校驗 | true | false | false |
localCacheScope | MyBatis 利用本地緩存機制防止循環引用和加速重復嵌套查詢 | 默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。若設置為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | JDBC 類型的默認設置 | 當沒有參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER | 常用 NUL、VARCHAR、OTHER | OTHER |
lazyLoadTriggeerMethods | 指定哪個對象的方法觸發一次延遲加載 | 配置需要觸發延遲加載的方法的名字,該方法就會觸發一次延遲加載 | 一個逗號分隔的方法名稱列表 | equals, clone, hashCode, toString |
defaultScriptingLanguage | 動態 sql 默認語言 | 指定動態 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 創建具有延遲加載能力的對象所用到的代理工具 | CGLIB | JAVASSIST | JAVASSIST |
vfsImpl | vfs 實現 | 指定 vfs 的實現 | 自定義 VFS 實現類的全類名,以逗號分割 | 無 |
useActualParamName | 使用方法簽名 | 允許使用方法簽名中的名稱作為語句參數名稱。要使用該特性,工程必須采用 Java8 編譯,并且加上 -parameters 選項(從 MyBatis 3.4.1 版本開始) | true | false | false |
configurationFactory | 配置工廠 | 指定提供配置實例的類。返回的配置實例用于加載反序列化的懶加載參數。這個類必須有一個簽名的靜態配置 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>
批量給類設置別名,為包中的每一個類設置別名,設置規則是:獲取類名稱,將其第一個字母變為小寫
<!--設置別名-->
<typeAliases><!-- 對包進行掃描,可以批量進行別名設置,設置規則是:獲取類名稱,將其第一個字母變為小寫 --><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?核心代碼的情況下,對其核心行為進行修改。利用動態代理機制,插件能夠介入到四大對象(Mapper Interface、Mapped Statement、Parameter Map 和 ResultSet Handler)的任何一個方法的執行過程中。
8 environments 運行環境
????????environments 標簽用于指定當前運行環境,在 MyBatis 中可以配置多種環境,比如開發、測試和生產環境。每種環境使用一個 environment 標簽進行配置并指定唯一標識符,可以通過 environments 標簽中的 default 屬性指定一個環境的標識符來快速的切換環境,environment? 標簽里面分為兩個可配置的標簽:事務管理 (transactionManager)、數據源 (DataSource)。而在我們的日常開發中,這些都會交給 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 組織起來,可以在初始化時創建多個連接,使用時直接從連接池獲取,避免了重復創建連接所需的初始化和認證時間,從而提升了效率,所以這種方式比較適合對性能要求高的應用中。除了 UNPOOLED 中的配置屬性之外,還有以下幾個修改連接池的配置:
-
poolMaximumActiveConnections:用于設置連接池中允許的最大活躍連接數。超過這個數量的連接將會被阻塞,直到有連接被釋放為止,默認值為 10
-
poolMaxmumIdleConnections:用于設置連接池中允許的最大空閑連接數。當連接池中的連接數量超過這個值時,多余的連接將會被釋放,默認值為 5
-
poolMaxmumCheckoutTime:用于設置連接在連接池中的最大使用時間。超過這個時間的連接將會被強制回收,默認值為 20000 毫秒(即 20 秒)
-
poolTimeToWait:用于設置從連接池中獲取連接時的最大等待時間。如果在這個時間內無法獲取到連接,將會拋出超時異常,默認值為 20000 毫秒(即 20 秒)
JNDI
????????數據源 JNDI 的實現是為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然后放置一個 JNDI 上下文的引用。這種數據源只需配置兩個屬性:
- initial_context:用來在 InitialContext 中尋找上下文。可選,如果忽略,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 參考文檔
尚硅谷文檔
MyBatis 配置 setting 詳解
Mybatis3詳解(三)----Mybatis全局配置文件詳解 - 唐浩榮 - 博客園 (cnblogs.com)