配置文件的體系架構(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>
<!-- 外部配置悍汛,動(dòng)態(tài)替換颅围,可以將配置信息抽取到配置文件中 -->
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
<!-- 極為重要的調(diào)整設(shè)置,它們會(huì)改變 MyBatis 的運(yùn)行時(shí)行為,下面是setting設(shè)置配置示例 -->
<settings>
<!-- 全局性地開啟或關(guān)閉所有映射器配置文件中已配置的任何緩存。默認(rèn)為true-->
<setting name="cacheEnabled" value="true"/>
<!-- 延遲加載的全局開關(guān)。
當(dāng)開啟時(shí),所有關(guān)聯(lián)對(duì)象都會(huì)延遲加載裆馒。 特定關(guān)聯(lián)關(guān)系中可通過設(shè)置 fetchType 屬性來覆蓋該項(xiàng)的開關(guān)狀態(tài)。
默認(rèn)為false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!--
開啟時(shí)丐怯,任一方法的調(diào)用都會(huì)加載該對(duì)象的所有延遲加載屬性喷好。
否則,每個(gè)延遲加載屬性會(huì)按需加載(參考 lazyLoadTriggerMethods)读跷。
默認(rèn)為false (在 3.4.1 及之前的版本中默認(rèn)為 true)-->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 是否允許單個(gè)語句返回多結(jié)果集(需要數(shù)據(jù)庫(kù)驅(qū)動(dòng)支持)梗搅。默認(rèn)為true-->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 使用列標(biāo)簽代替列名。實(shí)際表現(xiàn)依賴于數(shù)據(jù)庫(kù)驅(qū)動(dòng)效览,具體可參考數(shù)據(jù)庫(kù)驅(qū)動(dòng)的相關(guān)文檔些膨,或通過對(duì)比測(cè)試來觀察。默認(rèn)為true-->
<setting name="useColumnLabel" value="true"/>
<!-- 允許 JDBC 支持自動(dòng)生成主鍵钦铺,需要數(shù)據(jù)庫(kù)驅(qū)動(dòng)支持订雾。
如果設(shè)置為 true,將強(qiáng)制使用自動(dòng)生成主鍵矛洞。盡管一些數(shù)據(jù)庫(kù)驅(qū)動(dòng)不支持此特性洼哎,但仍可正常工作(如 Derby)烫映。
默認(rèn)為false-->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定 MyBatis 應(yīng)如何自動(dòng)映射列到字段或?qū)傩浴? NONE 表示關(guān)閉自動(dòng)映射;
PARTIAL 只會(huì)自動(dòng)映射沒有定義嵌套結(jié)果映射的字段噩峦;
FULL 會(huì)自動(dòng)映射任何復(fù)雜的結(jié)果集(無論是否嵌套)锭沟。
默認(rèn)為 PARTIAL-->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 指定發(fā)現(xiàn)自動(dòng)映射目標(biāo)未知列(或未知屬性類型)的行為。
NONE: 不做任何反應(yīng)
WARNING: 輸出警告日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等級(jí)必須設(shè)置為 WARN)
FAILING: 映射失敗 (拋出 SqlSessionException)
默認(rèn)為 NONE-->
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<!-- 配置默認(rèn)的執(zhí)行器识补。
SIMPLE 就是普通的執(zhí)行器族淮;
REUSE 執(zhí)行器會(huì)重用預(yù)處理語句(PreparedStatement);
BATCH 執(zhí)行器不僅重用語句還會(huì)執(zhí)行批量更新凭涂。
默認(rèn)為SIMPLE-->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 設(shè)置超時(shí)時(shí)間祝辣,它決定數(shù)據(jù)庫(kù)驅(qū)動(dòng)等待數(shù)據(jù)庫(kù)響應(yīng)的秒數(shù)。默認(rèn)為未設(shè)置null-->
<setting name="defaultStatementTimeout" value="25"/>
<!-- 為驅(qū)動(dòng)的結(jié)果集獲取數(shù)量(fetchSize)設(shè)置一個(gè)建議值切油。此參數(shù)只可以在查詢?cè)O(shè)置中被覆蓋蝙斜。默認(rèn)為未設(shè)置null-->
<setting name="defaultFetchSize" value="100"/>
<!-- 是否允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設(shè)置為 false澎胡。-->
<setting name="safeRowBoundsEnabled" value="false"/>
<!-- 是否開啟駝峰命名自動(dòng)映射孕荠,即從經(jīng)典數(shù)據(jù)庫(kù)列名 A_COLUMN 映射到經(jīng)典 Java 屬性名 aColumn。 true | false
默認(rèn)為False-->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!--
MyBatis 利用本地緩存機(jī)制(Local Cache)防止循環(huán)引用和加速重復(fù)的嵌套查詢攻谁。
默認(rèn)值為 SESSION稚伍,會(huì)緩存一個(gè)會(huì)話中執(zhí)行的所有查詢。
若設(shè)置值為 STATEMENT戚宦,本地緩存將僅用于執(zhí)行語句个曙,對(duì)相同 SqlSession 的不同查詢將不會(huì)進(jìn)行緩存。-->
<setting name="localCacheScope" value="SESSION"/>
<!-- 當(dāng)沒有為參數(shù)指定特定的 JDBC 類型時(shí)阁苞,
空值的默認(rèn) JDBC 類型。 某些數(shù)據(jù)庫(kù)驅(qū)動(dòng)需要指定列的 JDBC 類型祠挫,多數(shù)情況直接用一般類型即可那槽,
比如 NULL、VARCHAR 或 OTHER等舔。-->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!-- 指定對(duì)象的哪些方法觸發(fā)一次延遲加載骚灸。用逗號(hào)分隔的方法列表。-->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
<!-- 類型別名可為 Java 類型設(shè)置一個(gè)縮寫名字慌植。 它僅用于 XML 配置甚牲,意在降低冗余的全限定類名書寫-->
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
<!-- 指定一個(gè)包名,MyBatis 會(huì)在包名下面搜索需要的 Java Bean-->
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
<!--
配置成適應(yīng)多種環(huán)境蝶柿,這種機(jī)制有助于將 SQL 映射應(yīng)用于多種數(shù)據(jù)庫(kù)之中丈钙,
現(xiàn)實(shí)情況下有多種理由需要這么做。例如交汤,開發(fā)雏赦、測(cè)試和生產(chǎn)環(huán)境需要有不同的配置;
或者想在具有相同 Schema 的多個(gè)生產(chǎn)數(shù)據(jù)庫(kù)中使用相同的 SQL 映射。還有許多類似的使用場(chǎng)景星岗。
不過要記滋畲蟆:盡管可以配置多個(gè)環(huán)境,但每個(gè) SqlSessionFactory 實(shí)例只能選擇一種環(huán)境俏橘。
-->
<environments default="development">
<environment id="development">
<!--
兩種類型的事務(wù)管理器(也就是 type="[JDBC|MANAGED]";
JDBC – 這個(gè)配置直接使用了 JDBC 的提交和回滾設(shè)施允华,它依賴從數(shù)據(jù)源獲得的連接來管理事務(wù)作用域;
MANAGED – 這個(gè)配置幾乎沒做什么。它從不提交或回滾一個(gè)連接寥掐,而是讓容器來管理事務(wù)的整個(gè)生命周期(比如 JEE 應(yīng)用服務(wù)器的上下文)靴寂。 默認(rèn)情況下它會(huì)關(guān)閉連接。然而一些容器并不希望連接被關(guān)閉曹仗,因此需要將 closeConnection 屬性設(shè)置為 false 來阻止默認(rèn)的關(guān)閉行為
注意:使用 Spring + MyBatis榨汤,則沒有必要配置事務(wù)管理器,因?yàn)?Spring 模塊會(huì)使用自帶的管理器來覆蓋前面的配置怎茫。
-->
<transactionManager type="JDBC"/>
<!--
dataSource 元素使用標(biāo)準(zhǔn)的 JDBC 數(shù)據(jù)源接口來配置 JDBC 連接對(duì)象的資源收壕。
大多數(shù) MyBatis 應(yīng)用程序會(huì)按示例中的例子來配置數(shù)據(jù)源。雖然數(shù)據(jù)源配置是可選的轨蛤,但如果要啟用延遲加載特性蜜宪,就必須配置數(shù)據(jù)源。
有三種內(nèi)建的數(shù)據(jù)源類型(也就是 type="[UNPOOLED|POOLED|JNDI]");
UNPOOLED– 這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)會(huì)每次請(qǐng)求時(shí)打開和關(guān)閉連接祥山。雖然有點(diǎn)慢圃验,但對(duì)那些數(shù)據(jù)庫(kù)連接可用性要求不高的簡(jiǎn)單應(yīng)用程序來說,是一個(gè)很好的選擇缝呕。 性能表現(xiàn)則依賴于使用的數(shù)據(jù)庫(kù)澳窑,對(duì)某些數(shù)據(jù)庫(kù)來說,使用連接池并不重要供常,這個(gè)配置就很適合這種情形摊聋。UNPOOLED 類型的數(shù)據(jù)源僅僅需要配置以下 5 種屬性:
driver – 這是 JDBC 驅(qū)動(dòng)的 Java 類全限定名(并不是 JDBC 驅(qū)動(dòng)中可能包含的數(shù)據(jù)源類)。
url – 這是數(shù)據(jù)庫(kù)的 JDBC URL 地址栈暇。
username – 登錄數(shù)據(jù)庫(kù)的用戶名麻裁。
password – 登錄數(shù)據(jù)庫(kù)的密碼。
defaultTransactionIsolationLevel – 默認(rèn)的連接事務(wù)隔離級(jí)別源祈。
defaultNetworkTimeout – 等待數(shù)據(jù)庫(kù)操作完成的默認(rèn)網(wǎng)絡(luò)超時(shí)時(shí)間(單位:毫秒)煎源。查看 java.sql.Connection#setNetworkTimeout() 的 API 文檔以獲取更多信息。
POOLED– 這種數(shù)據(jù)源的實(shí)現(xiàn)利用“池”的概念將 JDBC 連接對(duì)象組織起來香缺,避免了創(chuàng)建新的連接實(shí)例時(shí)所必需的初始化和認(rèn)證時(shí)間手销。 這種處理方式很流行,能使并發(fā) Web 應(yīng)用快速響應(yīng)請(qǐng)求图张。
driver – 這是 JDBC 驅(qū)動(dòng)的 Java 類全限定名(并不是 JDBC 驅(qū)動(dòng)中可能包含的數(shù)據(jù)源類)原献。
url – 這是數(shù)據(jù)庫(kù)的 JDBC URL 地址馏慨。
username – 登錄數(shù)據(jù)庫(kù)的用戶名。
password – 登錄數(shù)據(jù)庫(kù)的密碼姑隅。
defaultTransactionIsolationLevel – 默認(rèn)的連接事務(wù)隔離級(jí)別写隶。
defaultNetworkTimeout – 等待數(shù)據(jù)庫(kù)操作完成的默認(rèn)網(wǎng)絡(luò)超時(shí)時(shí)間(單位:毫秒)。查看 java.sql.Connection#setNetworkTimeout() 的 API 文檔以獲取更多信息讲仰。
poolMaximumActiveConnections – 在任意時(shí)間可存在的活動(dòng)(正在使用)連接數(shù)量慕趴,默認(rèn)值:10
poolMaximumIdleConnections – 任意時(shí)間可能存在的空閑連接數(shù)。
poolMaximumCheckoutTime – 在被強(qiáng)制返回之前鄙陡,池中連接被檢出(checked out)時(shí)間冕房,默認(rèn)值:20000 毫秒(即 20 秒)
poolTimeToWait – 這是一個(gè)底層設(shè)置,如果獲取連接花費(fèi)了相當(dāng)長(zhǎng)的時(shí)間趁矾,連接池會(huì)打印狀態(tài)日志并重新嘗試獲取一個(gè)連接(避免在誤配置的情況下一直失敗且不打印日志)耙册,默認(rèn)值:20000 毫秒(即 20 秒)。
poolMaximumLocalBadConnectionTolerance – 這是一個(gè)關(guān)于壞連接容忍度的底層設(shè)置毫捣, 作用于每一個(gè)嘗試從緩存池獲取連接的線程详拙。 如果這個(gè)線程獲取到的是一個(gè)壞的連接,那么這個(gè)數(shù)據(jù)源允許這個(gè)線程嘗試重新獲取一個(gè)新的連接蔓同,但是這個(gè)重新嘗試的次數(shù)不應(yīng)該超過 poolMaximumIdleConnections 與 poolMaximumLocalBadConnectionTolerance 之和饶辙。 默認(rèn)值:3(新增于 3.4.5)
poolPingQuery – 發(fā)送到數(shù)據(jù)庫(kù)的偵測(cè)查詢,用來檢驗(yàn)連接是否正常工作并準(zhǔn)備接受請(qǐng)求斑粱。默認(rèn)是“NO PING QUERY SET”弃揽,這會(huì)導(dǎo)致多數(shù)數(shù)據(jù)庫(kù)驅(qū)動(dòng)出錯(cuò)時(shí)返回恰當(dāng)?shù)腻e(cuò)誤消息。
poolPingEnabled – 是否啟用偵測(cè)查詢则北。若開啟矿微,需要設(shè)置 poolPingQuery 屬性為一個(gè)可執(zhí)行的 SQL 語句(最好是一個(gè)速度非常快的 SQL 語句)尚揣,默認(rèn)值:false涌矢。
poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的頻率』笸В可以被設(shè)置為和數(shù)據(jù)庫(kù)連接超時(shí)時(shí)間一樣蒿辙,來避免不必要的偵測(cè)拇泛,默認(rèn)值:0(即所有連接每一時(shí)刻都被偵測(cè) — 當(dāng)然僅當(dāng) poolPingEnabled 為 true 時(shí)適用)滨巴。
JNDI – 這個(gè)數(shù)據(jù)源實(shí)現(xiàn)是為了能在如 EJB 或應(yīng)用服務(wù)器這類容器中使用,容器可以集中或在外部配置數(shù)據(jù)源俺叭,然后放置一個(gè) JNDI 上下文的數(shù)據(jù)源引用恭取。這種數(shù)據(jù)源配置只需要兩個(gè)屬性:
initial_context – 這個(gè)屬性用來在 InitialContext 中尋找上下文(即,initialContext.lookup(initial_context))熄守。這是個(gè)可選屬性蜈垮,如果忽略耗跛,那么將會(huì)直接從 InitialContext 中尋找 data_source 屬性。
data_source – 這是引用數(shù)據(jù)源實(shí)例位置的上下文路徑攒发。提供了 initial_context 配置時(shí)會(huì)在其返回的上下文中進(jìn)行查找调塌,沒有提供時(shí)則直接在 InitialContext 中查找。
-->
<dataSource type="POOLED">
<!-- ${}由 properties 元素中設(shè)置的相應(yīng)值來替換 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 通過該配置告訴MyBatis到哪里去找到這些SQL語句 -->
<mappers>
<!-- 使用相對(duì)于類路徑的資源引用 -->
<mapper resource="mapper/CategoriesMapper.xml"/>
<!-- 使用映射器接口實(shí)現(xiàn)類的完全限定類名 -->
<mapper class="org.mybatis.builder.AuthorMapper"/>
<!-- 使用完全限定資源定位符(URL) -->
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
</configuration>