SQLSessionFactory 配置文件解析
在入門文章里灿意,配置了兩個 xml 文件伯顶,本文來解析 SQLSessionFactory 的環(huán)境配置文件李滴。在前文中命名未 conf.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>
<environments default="development">
<environment id="development">
<transactionManager type="jdbc"/>
<!-- 配置數(shù)據(jù)庫連接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=true"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="userMapper.xml" />
</mappers>
</configuration>
下面來解析一下 <configuration></configuration> 里面的一些內(nèi)容觉义。
environments
MyBatis可以配置多種環(huán)境设拟,這會幫助你將 SQL 映射應(yīng)用于多種數(shù)據(jù)庫之中慨仿。例如測試和生產(chǎn)環(huán)境∧呻剩或者你可能有多重生產(chǎn)級數(shù)據(jù)庫卻共享相同的模式镰吆,所以你會想到對不同數(shù)據(jù)庫使用相同的SQL映射。
但是配置多種環(huán)境跑慕,只能為每個SqlSessionFactory實(shí)例選擇一個万皿。
我們之前在文中加載環(huán)境配置文件的方法是:
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
其實(shí)該 build 有其他的重載方法。其中有配置環(huán)境參數(shù)的方法
public SqlSessionFactory build(InputStream inputStream, String environment) {
return this.build((InputStream)inputStream, environment, (Properties)null);
}
即傳入 environment 核行,指定的 environment 被綁定到 SqlSessionFactory 牢硅;如果不傳入 environment ,default 指定的 environment 被綁定到 SqlSessionFactory芝雪。
1 transactionManager
在MyBatis中有兩種事物管理器類型减余,一種是JDBC,一種是MANAGED惩系。
- JDBC—-這個配置直接簡單使用了JDBC的提交和回滾設(shè)置位岔,它依賴于數(shù)據(jù)源得到的連接來管理事物范圍
- MANAGED—-這個配置幾乎不做什么。它從來不提交或回滾一個連接堡牡,而它會讓容器來管理事物的整個生命周期(比如Spring或J2EE應(yīng)用服務(wù)器的上下文)抒抬,默認(rèn)情況下它會關(guān)閉連接,然而一些容器并不希望這樣晤柄,因此如果你需要從連接中停止它擦剑,將closeConnection屬性設(shè)置為false.
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager><transactionManager type="MANAGED">
2 dataSource
dataSource 元素使用基本的 JDBC 數(shù)據(jù)源接口來配置 JDBC 連接對象的資源。許多MyBatis的應(yīng)用程序?qū)凑丈厦娴氖纠齺砼渲脭?shù)據(jù)源芥颈,然而它并不是必須的惠勒,要知道為了方便使用延遲加載,數(shù)據(jù)源才是必須的浇借。有三種內(nèi)建的數(shù)據(jù)源類型(也就是type=”XXX”):
2.1 UNPOOLED
這個數(shù)據(jù)源的實(shí)現(xiàn)是每次被請求時打開和關(guān)閉連接捉撮。它有一點(diǎn)慢,這是對簡單應(yīng)用程序的一個很好的選擇妇垢,因?yàn)樗恍枰皶r的可用連接巾遭,不同的數(shù)據(jù)庫對這個的表現(xiàn)也是不一樣的肉康,所以對某些數(shù)據(jù)庫來說配置數(shù)據(jù)源并不重要,這個配置也是閑置的灼舍。UNPOOLED 類型的數(shù)據(jù)源僅僅用來配置以下六種屬性:
- driver—-這是JDBC驅(qū)動的Java類的完全限定名
- url—-這是數(shù)據(jù)庫的JDBC URL地址
- username—-登陸數(shù)據(jù)庫的用戶名
- password—-登錄數(shù)據(jù)庫的密碼
- defaultTransactionIsolationLevel—-默認(rèn)的連接事物隔離級別
- driver.encoding—-傳遞數(shù)據(jù)庫驅(qū)動的屬性吼和,前綴以”driver.”開頭即可,”driver.encoding”表示的就是傳遞 encoding 屬性
2.2 POOLED
這是 JDBC 連接對象的數(shù)據(jù)源連接池的實(shí)現(xiàn)骑素,用來避免創(chuàng)建新的連接實(shí)例時必要的連接和認(rèn)證時間炫乓。這是一種當(dāng)前 Web 應(yīng)用程序用來快速響應(yīng)請求的很流行的方法。除了上述(UNPOOLED)的屬性之外献丑,還有些別的屬性可以用來配置 POOLED 數(shù)據(jù)源:
- poolMaximumActiveConnections—-在任意時間存在的活動(也就是正在使用)連接的數(shù)量末捣,默認(rèn)值為10
- poolMaximumIdleConnections—-任意時間存在的空閑連接數(shù)
- poolMaximumCheckoutTime—-在被強(qiáng)制返回之前,池中連接被檢查的時間创橄,默認(rèn)值為2000毫秒也就是20秒
- poolTimeToWait箩做、poolPingQuery、poolPingEnabled妥畏、poolPingConnectionsNotUsedFor—-這些都是一些偵測數(shù)據(jù)庫連接的屬性
2.3 JNDI
這個數(shù)據(jù)源的實(shí)現(xiàn)是為了使用如 Spring 或應(yīng)用服務(wù)器這類的容器邦邦,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個 JNDI 上下文的引用醉蚁。這個數(shù)據(jù)源只需要兩個屬性:
- initial_context—-從初始上下文尋找環(huán)境燃辖,這個是可選屬性,如果被忽略网棍,那么 data_source 屬性將會直接以 initialContext 為背景再次尋找
- data_source—-這是引用數(shù)據(jù)源實(shí)例位置的上下文路徑黔龟,它會以由 initial_context 查詢返回的環(huán)境為背景來查找,如果 initial_context 沒有返回結(jié)果時确沸,直接以初始上下文為環(huán)境來查找
和其它數(shù)據(jù)源配置相似捌锭,它也可以通過名為”env.”的前綴直接向初始上下文發(fā)送屬性。
3 mappers
MyBatis 的行為已經(jīng)由上述元素配置好罗捎,下面是告訴 MyBatis 到哪里找到 SQL 的映射文件±埽可以通過使用相對路徑的資源引用桨菜,或者字符表示,或者url引用的完全限定名捉偏。
// 使用相對于類路徑的資源
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
// 使用完全限定路徑
<mappers>
<mapper url="file:///var/sqlmaps/AuthorMapper.xml"/>
<mapper url="file:///var/sqlmaps/BlogMapper.xml"/>
<mapper url="file:///var/sqlmaps/PostMapper.xml"/>
</mappers>
4 settings
下面多講一個屬性倒得,這個屬性可以不在config.xml中出現(xiàn),但是比較重要
settings夭禽,是非常重要的參數(shù)霞掺,它們會改變MyBatis在運(yùn)行時的行為方式禀崖。這面這個表格描述了設(shè)置信息沐绒,它們的含義和默認(rèn)值:
參數(shù)設(shè)置 | 描述 | 有效值 | 默認(rèn)值 | ||
---|---|---|---|---|---|
cachedEnabled | 用于配置使全局的映射器啟用或禁止緩存 | true | false | true | |
lazyLoadingEnabled | 全局啟用或禁用延遲加載宅楞。當(dāng)禁用時,所有關(guān)聯(lián)對象都會即時加載 | true | false | true | |
aggressiveLazyLoading | 當(dāng)啟用時狈究,有延遲加載屬性的對象在被調(diào)用時將會完全加載任任意屬性,否則每種屬性將會按需要加載 | true | false | true | |
multipleResultSetsEnabled | 允許或不允許多種結(jié)果集從一個單獨(dú)的語句中返回(需要合適的驅(qū)動) | true | false | true | |
useColumnLabel | 使用列標(biāo)簽代替列名艘策。不同的驅(qū)動在這方面表現(xiàn)不同系草,參考驅(qū)動文檔或充分測試兩種方法來決定所使用的驅(qū)動 | true | false | true | |
useGeneratedKeys | 允許JDBC支持生成的鍵,需要合適的驅(qū)動耙旦。如果設(shè)置為true則這個驅(qū)動強(qiáng)制生成的鍵被使用脱羡,盡管一些驅(qū)動拒絕兼容但仍然有效。 | true | false | true | |
autoMappingBehavior | 指定MyBatis如何自動映射列到字段/屬性PARTIAL只會自動映射簡單免都、沒有嵌套的結(jié)果锉罐。FULL會自動映射任意復(fù)雜的結(jié)果。 | NONE | PARTIAL | FULL | PARTIAL |
defaultExecutorType | 配置默認(rèn)的執(zhí)行器绕娘。SIMPLE執(zhí)行器沒有什么特別之處氓鄙,REUSE執(zhí)行器重用預(yù)處理語句,BATCH執(zhí)行器重用語句和批量更新业舍。 | SIMPLE | REUSE | BATCH | SIMPLE |
defaultStatementTimeout | 設(shè)置超時時間抖拦,它決定驅(qū)動等待一個數(shù)據(jù)庫響應(yīng)的時間。 | 任何正整數(shù) | Not | Set(null) |
完整的設(shè)置信息元素的示例配置如下:
<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="enhancementEnabled" value="false"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
主要的配置信息就是上面這些舷暮,前三個比較重要态罪,settings 屬于高級設(shè)置.