在《第一個MyBatis程序》一節(jié)中,我們編寫了 MyBatis 的配置文件 mybatis-config.xml,在該文件中,您可以配置各種元素。
MyBatis 配置文件的結(jié)構(gòu)如下。
<?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 /><!-- 插件 --> <environments><!-- 配置環(huán)境 --> <environment><!-- 環(huán)境變量 --> <transactionManager /><!-- 事務(wù)管理器 --> <dataSource /><!-- 數(shù)據(jù)源 --> </environment> </environments> <databaseIdProvider /><!-- 數(shù)據(jù)庫廠商標(biāo)識 --> <mappers /><!-- 映射器 --> </configuration>
mybatis-config.xml 文件中的元素節(jié)點(diǎn)是有一定順序的,節(jié)點(diǎn)位置必須按以上位置排序,否則會編譯錯誤。
下面介紹 XML 配置文件中的重要元素(標(biāo)簽)。
configuration 元素是整個 XML 配置文件的根節(jié)點(diǎn),其角色就相當(dāng)于是 MyBatis 的總管,MyBatis 所有的配置信息都會存放在它里面。
properties 標(biāo)簽可以通過 resource 屬性指定外部 properties 文件(database.properties),也可以通過 properties 子元素配置。
使用 properties 指定外部文件,代碼如下。
<properties resource="mybatisDemo/resources/database.properties"/>
database.properties 用于描述數(shù)據(jù)庫連接的相關(guān)配置,例如數(shù)據(jù)庫驅(qū)動、連接數(shù)據(jù)庫的 url、數(shù)據(jù)庫用戶名、數(shù)據(jù)庫密碼等。
通過 properties 子元素 property 配置 username 和 password 變量,然后在 environments 節(jié)點(diǎn)中引用這些變量,代碼如下。
<properties> <property name="username" value="root"/> <property name="password" value="root"/> </properties>
在 environments 節(jié)點(diǎn)中引用 username 和 password 變量。
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
也可以不使用 properties 標(biāo)簽,直接將屬性值寫在 value 中。
settings 標(biāo)簽用于配置 MyBatis 的運(yùn)行時行為,它能深刻的影響 MyBatis 的底層運(yùn)行,一般不需要大量配置,大部分情況下使用其默認(rèn)值即可。
settings 的配置項(xiàng)很多,但是真正用到的不會太多,我們把常用的配置項(xiàng)研究清楚就可以了。settings 配置項(xiàng)說明如下表所示(表中紅色字體的配置項(xiàng)為常用配置項(xiàng))。
settings 配置項(xiàng)說明
配置項(xiàng) | 作用 | 配置選項(xiàng) | 默認(rèn)值 |
---|---|---|---|
cacheEnabled | 該配置影響所有映射器中配置緩存的全局開關(guān) | true|false | true |
lazyLoadingEnabled | 延遲加載的全局開關(guān)。當(dāng)開啟時,所有關(guān)聯(lián)對象都會延遲加載。在特定關(guān)聯(lián)關(guān)系中可通過設(shè)置 fetchType 屬性來覆蓋該項(xiàng)的開關(guān)狀態(tài) | true|false | false |
aggressiveLazyLoading | 當(dāng)啟用時,對任意延遲屬性的調(diào)用會使帶有延遲加載屬性的對象完整加載;反之,每種屬性將會按需加載 | true|false | 版本3.4.1(不包含) 之前默認(rèn)值為true, 之后為false |
multipleResultSetsEnabled | 是否允許單一語句返回多結(jié)果集(需要兼容驅(qū)動) | true|false | true |
useColumnLabel | 使用列標(biāo)簽代替列名。不同的驅(qū)動會有不同的表現(xiàn),具體可參考相關(guān)驅(qū)動文檔或通過測試這兩種不同的模式來觀察所用驅(qū)動的結(jié)果 | true|false | true |
useGeneratedKeys | 允許JDBC 支持自動生成主鍵,需要驅(qū)動兼容。如果設(shè)置為 true,則這個設(shè)置強(qiáng)制使用自動生成主鍵,盡管一些驅(qū)動不能兼容但仍可正常工作(比如 Derby) | true|false | false |
autoMappingBehavior | 指定 MyBatis 應(yīng)如何自動映射列到字段或?qū)傩浴?NONE 表示取消自動映射。 PARTIAL 表示只會自動映射,沒有定義嵌套結(jié)果集和映射結(jié)果集。 FULL 會自動映射任意復(fù)雜的結(jié)果集(無論是否嵌套) | NONE、PARTIAL、FULL | PARTIAL |
autoMappingUnkno wnColumnBehavior | 指定自動映射當(dāng)中未知列(或未知屬性類型)時的行為。 默認(rèn)是不處理,只有當(dāng)日志級別達(dá)到 WARN 級別或者以下,才會顯示相關(guān)日志,如果處理失敗會拋出 SqlSessionException 異常 | NONE、WARNING、FAILING | NONE |
defaultExecutorType | 配置默認(rèn)的執(zhí)行器。SIMPLE 是普通的執(zhí)行器;REUSE 會重用預(yù)處理語句(prepared statements);BATCH 執(zhí)行器將重用語句并執(zhí)行批量更新 | SIMPLE、REUSE、BATCH | SIMPLE |
defaultStatementTimeout | 設(shè)置超時時間,它決定驅(qū)動等待數(shù)據(jù)庫響應(yīng)的秒數(shù) | 任何正整數(shù) | Not Set (null) |
defaultFetchSize | 設(shè)置數(shù)據(jù)庫驅(qū)動程序默認(rèn)返回的條數(shù)限制,此參數(shù)可以重新設(shè)置 | 任何正整數(shù) | Not Set (null) |
safeRowBoundsEnabled | 允許在嵌套語句中使用分頁(RowBounds)。如果允許,設(shè)置 false | true|false | false |
safeResultHandlerEnabled | 允許在嵌套語句中使用分頁(ResultHandler)。如果允許,設(shè)置false | true|false | true |
mapUnderscoreToCamelCase | 是否開啟自動駝峰命名規(guī)則映射,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN 到經(jīng)典 Java 屬性名 aColumn 的類似映射 | true|false | false |
localCacheScope | MyBatis 利用本地緩存機(jī)制(Local Cache)防止循環(huán)引用(circular references)和加速聯(lián)復(fù)嵌套査詢。 默認(rèn)值為 SESSION,這種情況下會緩存一個會話中執(zhí)行的所有查詢。若設(shè)置值為 STATEMENT,本地會話僅用在語句執(zhí)行上,對相同 SqlScssion 的不同調(diào)用將不會共享數(shù)據(jù) | SESSION|STATEMENT | SESSION |
jdbcTypeForNull | 當(dāng)沒有為參數(shù)提供特定的 JDBC 類型時,為空值指定 JDBC 類型。某些驅(qū)動需要指定列的 JDBC 類型,多數(shù)情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER | NULL、VARCHAR、OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪個對象的方法觸發(fā)一次延遲加載 | — | equals、clone、hashCode、toString |
defaultScriptingLanguage | 指定動態(tài) SQL 生成的默認(rèn)語言 | — | org.apache.ibatis .script.ing.xmltags .XMLDynamicLanguageDriver |
callSettersOnNulls | 指定當(dāng)結(jié)果集中值為 null 時,是否調(diào)用映射對象的 setter(map 對象時為 put)方法,這對于 Map.kcySet() 依賴或 null 值初始化時是有用的。注意,基本類型(int、boolean 等)不能設(shè)置成 null | true|false | false |
logPrefix | 指定 MyBatis 增加到日志名稱的前綴 | 任何字符串 | Not set |
loglmpl | 指定 MyBatis 所用日志的具體實(shí)現(xiàn),未指定時將自動?xùn)苏?/td> | SLF4J|LOG4J|LOG4J2| JDK_LOGGING| COMMONS_LOGGING| ST DOUT_LOGGING| NO_LOGGING | Not set |
proxyFactory | 指定 MyBatis 創(chuàng)建具有延遲加栽能力的對象所用到的代理工具 | CGLIB|JAVASSIST | JAVASSIST (MyBatis 版本為 3.3 及以上的) |
vfsImpl | 指定 VFS 的實(shí)現(xiàn)類 | 提供 VFS 類的全限定名,如果存在多個,可以使用逗號分隔 | Not set |
useActualParamName | 允許用方法參數(shù)中聲明的實(shí)際名稱引用參數(shù)。要使用此功能,項(xiàng)目必須被編譯為 Java 8 參數(shù)的選擇。(從版本 3.4.1 開始可以使用) | true|false | true |
下面給出一個全量的配置樣例,如下所示。
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" value="100"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="mapUnderscoreToCamelCase" value="false"/> <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> </settings>
為了不在任何地方都指定類的全限定名,我們可以使用 typeAliases 標(biāo)簽定義一個別名。
例如,在 net.bianchengbang.po 包中有一個 Student 類,則該類的全限定名稱為 net.bianchengbang.po.Student。使用 typeAliases 標(biāo)簽定義別名,這樣就不用每次都書寫類的全限定名稱了,代碼如下。
<typeAliases> <typeAlias alias = "Student" type = "net.bianchengbang.po.Student"/> </typeAliases>
如果需要對同一個包下的多個類定義別名,則可以定義為:
<typeAliases> <package name="net.biancheng.po"/> </typeAliases>
這樣 MyBatis 將掃描 net.biancheng.po 包里面的類,將其第一個字母變?yōu)樾懽鳛槠鋭e名,例如 Student 別名為 student,User 別名為 user。
typeHandlers 主要將獲取的值合理地轉(zhuǎn)化為 Java 類型。在 typeHandler 中,分為 jdbcType 和 javaType,其中 jdbcType 用于定義數(shù)據(jù)庫類型,而 javaType 用于定義 Java 類型,typeHandler 的作用就是承擔(dān) jdbcType 和 javaType 之間的相互轉(zhuǎn)換。
MyBatis 支持自定義處理類型,在自定義處理類型時,需要實(shí)現(xiàn) org.apache.ibatis.type.TypeHandler 接口或繼承 org.apache.ibatis.type.BaseTypeHandle 類。詳細(xì)可參考官網(wǎng):http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers
在 environments 標(biāo)簽中,可以配置 MyBatis 的多套運(yùn)行環(huán)境,將 SQL 映射到多個不同的數(shù)據(jù)庫上。
environment 是 environments 的子標(biāo)簽,用來配置 MyBatis 的一套運(yùn)行環(huán)境,需指定運(yùn)行環(huán)境 ID、事務(wù)管理、數(shù)據(jù)源配置等相關(guān)信息。
我們可以通過配置多個 environment 標(biāo)簽來連接多個數(shù)據(jù)庫,需要注意的是必須指定其中一個為默認(rèn)運(yùn)行環(huán)境(通過default指定)。
environment 標(biāo)簽提供了兩個子標(biāo)簽,即 transactionManager 和 dataSource。
MyBatis 支持兩個事務(wù)管理器,即 JDBC 和 MANAGED。
如果使用 JDBC 類型的事務(wù)管理器,則應(yīng)用程序服務(wù)器負(fù)責(zé)事務(wù)管理操作,例如提交、回滾等。如果使用 MANAGED 類型的事務(wù)管理器,則應(yīng)用程序服務(wù)器負(fù)責(zé)管理連接生命周期。
用于配置數(shù)據(jù)庫的連接屬性,例如要連接的數(shù)據(jù)庫的驅(qū)動程序名稱、URL、用戶名和密碼等。
dataSource 中的 type 屬性用于指定數(shù)據(jù)源類型,有以下 3 種類型。
UNPOOLED 沒有數(shù)據(jù)庫連接池,效率低下。MyBatis 需要打開和關(guān)閉每個數(shù)據(jù)庫操作的連接,它有點(diǎn)慢,通常應(yīng)用于簡單的應(yīng)用程序。
對于 POOLED 數(shù)據(jù)源類型,MyBatis 將維護(hù)一個數(shù)據(jù)庫連接池。并且對于每個數(shù)據(jù)庫的操作,MyBatis 都會使用連接池中的連接,并在操作完成后將它們返回到池中。減少了創(chuàng)建新連接所需的初始連接和身份驗(yàn)證時間。
對于 JNDI 的數(shù)據(jù)源類型,MyBatis 將從 JNDI 數(shù)據(jù)源中獲取連接。
dataSource 標(biāo)簽示例代碼如下:
<dataSource type="POOLED"> <!-- MySQL數(shù)據(jù)庫驅(qū)動 --> <property name="driver" value="com.mysql.jdbc.Driver" /> <!-- 連接數(shù)據(jù)庫的URL --> <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf8" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource>
mappers 標(biāo)簽用于指定 MyBatis SQL 映射文件的路徑。
mapper 是 mappers 的子標(biāo)簽,mapper 中的 resource 屬性用于指定 SQL 映射文件的路徑(類資源路徑)
例如,SQL 映射文件的名稱是 Student.xml,它位于名為 net.biancheng.mapper 的包中,那么您可以這樣配置:
<mappers> <mapper resource="net/biancheng/mapper/Student.xml"/> </mappers>