前言
前一篇文章,講了MyBatis入門,講到了MyBatis有兩個基本的配置檔案,一個用來配置環境資訊,一個用來寫SQL語句。前者我把它命名為config.xml,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> <typeAliases> <typeAlias alias="Student" type="com.xrq.domain.Student"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="student.xml"/> </mappers> </configuration>
這是一個最基本的配置寫法,一般使用MyBatis都可以在這個配置檔案的基礎上進行修改加以擴充套件,本文就學習一下config.xml檔案<configuration></configuration>裡面的一些內容。
typeAliases
這個標籤倒不關鍵,但是有這個標籤之後整體使用MyBatis就會很方便。typeAliases是為Java型別命名一個短的名字,它只和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>
有了這個配置,"Blog"可以任意用來代替"domain.blog.Blog"所使用的地方。
environments
MyBatis可以配置多種環境,這會幫助你將SQL對映應用於多種資料庫之中。例如,你也許為開發要設定不同的配置,測試和生產環境。或者你可能有多重生產級資料庫卻共享相同的模式,所以你會想到對不同資料庫使用相同的SQL對映。這種用法是最多的。
有一個很重要的問題是:你可以配置多種環境,但你只能為每個SqlSessionFactory例項選擇一個。
所以,如果你想連線兩個資料庫,那麼就需要建立兩個SqlSessionFactory例項,每個資料庫對應一個。而如果是三個資料庫,你就需要三個例項,以此類推。我們把前面的environments拿出來看:
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments>
而對應的Java程式碼是:
reader = Resources.getResourceAsReader("config.xml"); ssf = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactoryBuilder的build方法實際上還有幾個別的過載方法,其中一個重要的是:
public SqlSessionFactory build(Reader reader, String environment) { return build(reader, environment, null); }
原則是:如果傳入environment,指定的envrionment被繫結到SqlSessionFactory;如果不傳入environment,default指定的environment被繫結到SqlSessionFactory。
接著來看一下環境元素:
1、transactionManager
在MyBatis中有兩種事物管理器型別,一種是JDBC,一種是MANAGED。
- JDBC----這個配置直接簡單使用了JDBC的提交和回滾設定,它依賴於資料來源得到的連線來管理事物範圍
- MANAGED----這個配置幾乎不做什麼。它從來不提交或回滾一個連線,而它會讓容器來管理事物的整個生命週期(比如Spring或J2EE應用伺服器的上下文),預設情況下它會關閉連線,然而一些容器並不希望這樣,因此如果你需要從連線中停止它,將closeConnection屬性設定為false,例如:
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager><transactionManager type="MANAGED">
2、dataSource
dataSource元素使用基本的JDBC資料來源介面來配置JDBC連線物件的資源。許多MyBatis的應用程式將會按照上面的示例來配置資料來源,然而它並不是必須的,要知道為了方便使用使用延遲載入,資料來源才是必須的。有三種內建的資料來源型別(也就是type="XXX"):
(1)UNPOOLED
這個資料來源的實現是每次被請求時開啟和關閉連線。它有一點慢,這是對簡單應用程式的一個很好的選擇,因為它不需要及時的可用連線,不同的資料庫對這個的表現也是不一樣的,所以對某些資料庫來說配置資料來源並不重要,這個配置也是閒置的。UNPOOLED型別的資料來源僅僅用來配置以下六種屬性:
- driver----這是JDBC驅動的Java類的完全限定名
- url----這是資料庫的JDBC URL地址
- username----登陸資料庫的使用者名稱
- password----登入資料庫的密碼
- defaultTransactionIsolationLevel----預設的連線事物隔離級別
- driver.encoding----傳遞資料庫驅動的屬性,字首以"driver."開頭即可,"driver.encoding"表示的就是傳遞encoding屬性
(2)POOLED
這是JDBC連線物件的資料來源連線池的實現,用來避免建立新的連線例項時必要的連線和認證時間。這是一種當前Web應用程式用來快速響應請求的很流行的方法。除了上述(UNPOOLED)的屬性之外,還有些別的屬性可以用來配置POOLED資料來源:
- poolMaximumActiveConnections----在任意時間存在的活動(也就是正在使用)連線的數量,預設值為10
- poolMaximumIdleConnections----任意時間存在的空閒連線數
- poolMaximumCheckoutTime----在被強制返回之前,池中連線被檢查的時間,預設值為2000毫秒也就是20秒
- poolTimeToWait、poolPingQuery、poolPingEnabled、poolPingConnectionsNotUsedFor----這些都是一些偵測資料庫連線的屬性
(3)JNDI
這個資料來源的實現是為了使用如Spring或應用伺服器這類的容器,容器可以集中或在外部配置資料來源,然後放置一個JNDI上下文的引用。這個資料來源只需要兩個屬性:
- initial_context----這個屬性用來從初始上下文尋找環境,這個是可選屬性,如果被忽略,那麼data_source屬性將會直接以initialContext為背景再次尋找
- data_source----這是引用資料來源例項位置的上下文路徑,它會以由initial_context查詢返回的環境為背景來查詢,如果initial_context沒有返回結果時,直接以初始上下文為環境來查詢
和其它資料來源配置相似,它也可以通過名為"env."的字首直接向初始上下文傳送屬性。
mappers
既然MyBatis的行為已經由上述元素配置完了,那麼下面就要定義SQL對映語句了,但是首先我們要告訴MyBatis到哪裡去尋找這些語句。Java在這方面沒有提供一個很好的方法,所以最佳方式是告訴MyBatis去哪裡找對映檔案,可以通過使用相對路徑的資源引用,或者字元表示,或者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>
這些語句簡單告訴了MyBatis去哪裡找對映檔案,其餘的細節就是在每個SQL對映檔案中了,將在下面的文章中探討。
settings
前面幾個都是config.xml裡面出現的,下面多講一個屬性,這個屬性可以不在config.xml中出現,但是比較重要,寫在這裡為了以後可以看。
這個屬性是settings,是非常重要的調整,它們會改變MyBatis在執行時的行為方式。這面這個表格描述了設定資訊,它們的含義和預設值:
引數設定 | 描述 | 有效值 | 預設值 |
cachedEnabled | 用於配置使全域性的對映器啟用或禁止快取 | true|false |
true |
lazyLoadingEnabled | 全域性啟用或禁用延遲載入。當禁用時,所有關聯物件都會即時載入 | true|false | true |
aggressiveLazyLoading | 當啟用時,有延遲載入屬性的物件在被呼叫時將會完全載入任任意屬性,否則每種屬性將會按需要載入 | true|false | true |
multipleResultSetsEnabled | 允許或不允許多種結果集從一個單獨的語句中返回(需要合適的驅動) | true|false | true |
useColumnLabel | 使用列標籤代替列名。不同的驅動在這方面表現不同,參考驅動文件或充分測試兩種方法來決定所使用的驅動 | true|false | true |
useGeneratedKeys | 允許JDBC支援生成的鍵,需要合適的驅動。如果設定為true則這個驅動強制生成的鍵被使用,儘管一些驅動拒絕相容但仍然有效。 | true|false | true |
autoMappingBehavior | 指定MyBatis如何自動對映列到欄位/屬性PARTIAL只會自動對映簡單、沒有巢狀的結果。FULL會自動對映任意複雜的結果。 | NONE|PARTIAL|FULL | PARTIAL |
defaultExecutorType | 配置預設的執行器。SIMPLE執行器沒有什麼特別之處,REUSE執行器重用預處理語句,BATCH執行器重用語句和批量更新。 | SIMPLE|REUSE|BATCH | SIMPLE |
defaultStatementTimeout | 設定超時時間,它決定驅動等待一個資料庫響應的時間。 | 任何正整數 | Not Set(null) |
一個完整的設定資訊元素的示例配置如下:
<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>
config.xml主要的配置資訊差不多就是上面這一些,前三個比較重要,settings屬於高階設定了,需要比較有經驗的開發來依據專案情況做調整。
後面的一篇文章將探討SQL語句的對映,這也是MyBatis的核心。