前言
前一篇文章,講了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的核心。