MyBatis2:config.xml檔案

五月的倉頡發表於2016-03-13

前言

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

 

相關文章