MyBatis 配置介紹
1. 前言
MyBatis 的配置十分重要,它直接左右 MyBatis 的行為。我們可以將 MyBatis 配置分為兩大部分
,第一部分是 mapper,也就是容納 SQL 語句的.xml文件,另一部分是 configuration ,也就是前面小節(jié)提到的 mybatis-config.xml 文件。
本小節(jié),我們將介紹 configuration 中常見且有用的配置項。
2. 結構
MyBatis 以 .xml 作為配置文件,且以 configuration 作為配置的根節(jié)點。在 configuration 下有諸多配置項,它們的結構如下:
configuration(配置)
- properties(屬性)
- settings(設置)
- typeAliases(類型別名)
- typeHandlers(類型處理器)
- objectFactory(對象工廠)
- plugins(插件)
- environments(環(huán)境配置)
- environment(環(huán)境變量)
- transactionManager(事務管理器)
- dataSource(數(shù)據(jù)源)
- environment(環(huán)境變量)
- databaseIdProvider(數(shù)據(jù)庫廠商標識)
- mappers(映射器)
MyBatis configuration 共 9 項,其中一些配置在前面的小節(jié)中已經(jīng)介紹到了,下面我們將分別介紹每一項配置。
3. 屬性 properties
通過 properties 配置,我們可以將一些重要的配置屬性抽離
到其它的 .properties 文件。
比如,dataSource 中的數(shù)據(jù)庫 url、用戶名和密碼,我們可以單獨以 datasource.properties 文件來存儲,然后在 mybatis-config.xml 文件中導入使用。
在 resources 目錄下新建 datasource.properties 文件,并填入以下內(nèi)容:
url=jdbc:mysql://localhost:3306/imooc?useSSL=false
username=root
password=123456
然后在 mybatis-config.xml 文件中通過 properties 配置來引入 datasource.properties 文件:
<?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>
<!-- 引入datasource.properties -->
<properties resource="datasource.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 占位符動態(tài)替換配置 -->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
通過 properties 中的 resource 屬性引入 datasource.properties 后,我們就可以使用占位符的方式去動態(tài)替換配置,如 ${url}
,表示從 datasource.properties 文件中取出 url 項并填充在此處。
它們在目錄中的位置如下:
src/main/resources
├── datasource.properties
├── mybatis-config.xml
4. 設置 settings
MyBatis 提供了 settings 來設置一些主要的參數(shù),它們會直接的改變 MyBatis 的運行時行為。
settings 共有十幾項,我們羅列一些常用的:
設置名 | 描述 | 可選值 | 默認值 |
---|---|---|---|
cacheEnabled | 全局地開啟或關閉所有 mapper 中的緩存 | true | false | true |
lazyLoadingEnabled | 延遲加載的全局開關,當開啟時,所有關聯(lián)對象都會延遲加載 | true | false | false |
defaultStatementTimeout | 設置數(shù)據(jù)庫查詢超時時間 | 任意正整數(shù) | null |
mapUnderscoreToCamelCase | 是否開啟自動駝峰命名規(guī)則(camel case)映射 | true |false | false |
localCacheScope | MyBatis會默認緩存會話中的查詢,即 SESSION,若無需緩存則設置為 STATEMENT | SESSION | STATEMENT | SESSION |
defaultEnumTypeHandler | 指定 Enum 使用的默認 TypeHandler | Java 類的全路徑 | org.apache.ibatis. type.EnumTypeHandler |
logPrefix | 指定 MyBatis 日志名稱前綴 | 任何字符串 | 未設置 |
logImpl | 指定 MyBatis 日志的實現(xiàn),未指定時將自動查找 | SLF4J | LOG4J|LOG4J2|JDK_LOGGING|COMMONS_LOGGING|STDOUT_LOGGING|NO_LOGGING | 未設置 |
proxyFactory | 指定 Mybatis 創(chuàng)建具有延遲加載能力的對象所用到的代理工具 | CGLIB | JAVASSIST | JAVASSIST |
當使用它們時,你只需要在 mybatis-config.xml 配置文件中打開相應的配置。
例如,我們開啟了下劃線轉駝峰的配置:
<?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>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
5. 別名 typeAliases
MyBatis 在指定 Java 類時需要使用到類的全路徑,如 com.imooc.mybatis.model.Blog,typeAliases 可以為全路徑定義一個別名,這樣就能減少一定的重復工作。
例如,將 com.imooc.mybatis.model.Blog 的別名定義為 Blog:
<?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>
<typeAliases>
<typeAlias type="com.imooc.mybatis.model.Blog" alias="Blog"/>
</typeAliases>
</configuration>
MyBatis 還支持為一個包下所有類定義別名:
<?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>
<typeAliases>
<package name="com.imooc.mybatis.model"/>
</typeAliases>
</configuration>
這樣在 com.imooc.mybatis.model 包中的所有類都有了別名,每個類的別名都是其類的名稱首字母小寫,如 Author 類的別名為 author。
6. 類型處理器 typeHandlers
類型處理器我們將在類型處理器小節(jié)中再詳細介紹。
7. 對象工廠 objectFactory
MyBatis 每次創(chuàng)建結果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)來完成。MyBatis 默認的對象工廠僅僅只是實例化目標類,我們可以自定義一個對象工廠類來覆蓋默認的對象工廠。
配置如下:
<?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>
<objectFactory type="org.mybatis.example.ExampleObjectFactory"/>
</configuration>
絕大多數(shù)情況下,這個操作都是極其危險的,改變了 MyBatis 默認的對象創(chuàng)建行為可能會帶來一定的兼容錯誤,所以我們不做過多介紹,如果你確實需要它,可以查閱相關的資料。
8. 插件 plugins
插件我們將在插件小節(jié)中再詳細介紹。
9. 環(huán)境配置 environments
環(huán)境配置是最為復雜的一項配置,MyBatis 提供了多環(huán)境配置機制,例如:開發(fā)環(huán)境和生產(chǎn)環(huán)境上的數(shù)據(jù)庫配置就大概率不一樣。
每個 environment 都有一個唯一的 id 字段,且 environments 需要提供一個默認環(huán)境,如下:
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/imooc?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
在每個 environment 下又有兩個子配置項,它們分別負責管理事務和數(shù)據(jù)源。
9.1 事務管理器 transactionManager
在 xml 文件中對應 <transactionManager type="JDBC"/>
,其中 type 屬性對應了事務管理器的兩種類型,分別是JDBC和MANAGED。
- JDBC :直接使用了 JDBC 的提交和回滾機制。
- MANAGED:讓容器來管理事務的整個生命周期,例如 spring 容器。
提示: 如果你使用 spring 作為容器,那么 transactionManager 會被自動配置且可用。
9.2 數(shù)據(jù)源 dataSource
在 xml 文件中對應<dataSource type="POOLED">
,其中 type 屬性代表了數(shù)據(jù)源的類型,可選的有三種類型,如下:
- UNPOOLED:非池化數(shù)據(jù)源,每次使用時打開,結束后關閉,不推薦。
- POOLED:池化數(shù)據(jù)源,連接池管理連接,推薦。
- JNDI:在 EJB 這類容器中使用,幾乎不用。
10. 數(shù)據(jù)庫廠商標識 databaseIdProvider
多數(shù)據(jù)源支持我們將在多數(shù)據(jù)源支持小節(jié)中詳細介紹。
11. 映射器 mappers
通過 mappers 配置,我們可以指定所對應 SQL 映射文件,這樣 MyBatis 才能找到另一部分的 SQL 配置文件。
mappers 可以包含多個 mapper,mapper 的加載共有 4
種方式。
11.1 相對類路徑
通過 resource 屬性指定 mapper .xml 文件所對應的類路徑。
<mappers>
<mapper resource="com/imooc/mybatis/mapper/UserMapper.xml"/>
</mappers>
11.2 URL路徑
通過 url 屬性指定 mapper .xml 文件所對應的文件路徑。
<mappers>
<mapper url="file:///mapper/UserMapper.xml"/>
</mappers>
11.3 類路徑
通過 class 屬性指定 mapper 類所對應的類路徑。
<mappers>
<mapper class="com.imooc.mybatis.mapper.UserMapper"/>
</mappers>
11.4 包路徑
通過制定包路徑,將包中的所有接口類自動掃描為 mapper。
<mappers>
<package name="com.imooc.mybatis.mapper"/>
</mappers>
12. 小結
- MyBatis 的配置是比較多的,本小節(jié)列舉了一些
常用且重要
的配置,如果你還不滿足,可以閱讀這里的官方配置文檔。 - MyBatis 的另一部分 SQL 配置雖然分散在了包中,但通過 mappers 這個中間橋梁,二者又緊密的結合在一起了。
- 在真實的開發(fā)中,會有專門的類庫來提供這些配置,但你需要了解它們,以便在需要時迅速作出反應。