MyBatis超詳細介紹——XML配置
MyBatis XML配置
(本文作為學習筆記,瞭解更多請參考:MyBatis參考文件)
- Tip:
如果屬性在不只一個地方進行了配置,那麼 MyBatis 將按照下面的順序來載入:
- 在 properties 元素體內指定的屬性首先被讀取。
- 然後根據 properties 元素中的 resource 屬性讀取類路徑下屬性檔案或根據 url 屬性指定的路徑讀取屬性檔案,並覆蓋已讀取的同名屬性。
- 最後讀取作為方法引數傳遞的屬性,並覆蓋已讀取的同名屬性。
因此,通過方法引數傳遞的屬性具有最高優先順序,resource/url 屬性中指定的配置檔案次之,最低優先順序的是 properties 屬性中指定的屬性。
settings
- 配置完整的settings元素的示例
<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
- 類型別名存在的意義僅在於用來減少類完全限定名的冗餘,例如:
<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>
- 指定包名
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
- 註解別名
@Alias("author")
public class Author {
...
}
配置環境(environments)
- MyBatis可以配置成適應多種環境,但是每個SqlSessionFactory例項只能選擇其一,每個資料庫環境都需要對應一個SqlSessionFactory例項。可以將environment作為可選引數傳遞給SqlSessionFactoryBuilder。
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
當忽略環境引數的時候,預設環境將會被載入
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
- XML檔案配置環境
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<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>
事物管理器(transactionManager)
MyBatis中存在兩種事物管理器(JDBC & MANAGED)
- JDBC
直接使用JDBC的提交和回滾設定,依賴於從資料來源得到的連線來管理事物作用域 - MANAGED
它幾乎沒做什麼,從不提交或者回滾一個連線,而是讓容器來管理事物的整個生命週期(比如JEE應用伺服器的上下文),預設情況下會關閉連線,而一些容器不希望這樣,因此需要將closeConnection屬性設定為false來阻止它預設的關閉行為
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
- Tip
如果使用了Spring + MyBatis,則不需要配置事物管理器,因為Spring會使用自帶的管理器來覆蓋配置
資料來源(dataSource)
- 三種內建的資料來源型別(UNPOOLED & POOLED & JDNI)
UNPOOLED(每次被請求時開啟和關閉連線)
屬性設定:
driver – 這是 JDBC 驅動的 Java 類的完全限定名(並不是 JDBC 驅動中可能包含的資料來源類)。
url – 這是資料庫的 JDBC URL 地址。
username – 登入資料庫的使用者名稱。
password – 登入資料庫的密碼。
defaultTransactionIsolationLevel – 預設的連線事務隔離級別。
POOLED(利用“池”的概念管理JDBC連線物件)
除上述屬性設定之外,還存在以下設定:
poolMaximumActiveConnections – 在任意時間可以存在的活動(也就是正在使用)連線數量,預設值:10
poolMaximumIdleConnections – 任意時間可能存在的空閒連線數。
poolMaximumCheckoutTime – 在被強制返回之前,池中連線被檢出(checked out)時間,預設值:20000 毫秒(即 20 秒)
poolTimeToWait – 這是一個底層設定,如果獲取連線花費了相當長的時間,連線池會列印狀態日誌並重新嘗試獲取一個連線(避免在誤配置的情況下一直安靜的失敗),預設值:20000 毫秒(即 20 秒)。
poolMaximumLocalBadConnectionTolerance – 這是一個關於壞連線容忍度的底層設定, 作用於每一個嘗試從快取池獲取連線的執行緒. 如果這個執行緒獲取到的是一個壞的連線,那麼這個資料來源允許這個執行緒嘗試重新獲取一個新的連線,但是這個重新嘗試的次數不應該超過 poolMaximumIdleConnections 與 poolMaximumLocalBadConnectionTolerance 之和。 預設值:3 (新增於 3.4.5)
poolPingQuery – 傳送到資料庫的偵測查詢,用來檢驗連線是否正常工作並準備接受請求。預設是“NO PING QUERY SET”,這會導致多數資料庫驅動失敗時帶有一個恰當的錯誤訊息。
poolPingEnabled – 是否啟用偵測查詢。若開啟,需要設定 poolPingQuery 屬性為一個可執行的 SQL 語句(最好是一個速度非常快的 SQL 語句),預設值:false。
poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的頻率。可以被設定為和資料庫連線超時時間一樣,來避免不必要的偵測,預設值:0(即所有連線每一時刻都被偵測 — 當然僅當 poolPingEnabled 為 true 時適用)。
JNDI(為了能在如EJB等容器中使用)
initial_context – 這個屬性用來在 InitialContext 中尋找上下文(即,initialContext.lookup(initial_context))。這是個可選屬性,如果忽略,那麼 data_source 屬性將會直接從 InitialContext 中尋找。
data_source – 這是引用資料來源例項位置的上下文的路徑。提供了 initial_context 配置時會在其返回的上下文中進行查詢,沒有提供時則直接在 InitialContext 中查詢。
對映器(mappers)
- 有以下幾種方式告訴MyBatis去哪裡找SQL對映檔案
<!-- 使用相對於類路徑的資源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定資源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用對映器介面實現類的完全限定類名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 將包內的對映器介面實現全部註冊為對映器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>