02.Mybatis的xml映射配置文件

MyBatis 的 XML 配置文件包含了影響 MyBatis 行爲甚深的設置和屬性信息。XML 文檔
的高層級結構如下:

  • configuration 配置
    • properties 屬性
    • settings 設置
    • typeAliases 類型命名
    • typeHandlers 類型處理器
    • objectFactory 對象工廠
    • plugins 插件
    • environments 環境
    • environment 環境變量
    • transactionManager 事務管理器
    • dataSource 數據源
    • 映射器
      <br/>

properties

這些是外部化的,可替代的屬性,這些屬性也可以配置在典型的 Java 屬性配置文件中,或者通過 properties 元素的子元素來傳遞。

例如:

    <properties resource="jdbc.properties"></properties>

其中的屬性就可以在整個配置文件中使用,使用可替換的屬性來實現動態配置。
比如:

<dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
</dataSource>

properties 將會從包含進來的 jdbc.properties 文件中的值來替換。
<br/>

Settings

下面這個表格描述了設置信息,它們的含義和默認值。

02.Mybatis的xml映射配置文件

一個設置信息元素的示例,完全的配置如下所示:

<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>

typeAliases

類型別名是爲 Java 類型命名一個短的名字。它只和 XML 配置有關,只用來減少類完全限定名的多餘部分。

例如:

<typeAliases>
    <typeAlias alias="User" type="com.mu.mybatis.domain.User"/>
</typeAliases>

使用這個配置,“User”可以任意用來替代“com.mu.mybatis.domain.User”所使用的地方。

typeHandlers

無論是 MyBatis 在預處理語句中設置一個參數,還是從結果集中取出一個值時,類型處理器被用來將獲取的值以合適的方式轉換成 Java 類型。下面這個表格描述了默認的類型處理器。

02.Mybatis的xml映射配置文件

你可以重寫類型處理器或創建你自己的類型處理器來處理不支持的或非標準的類型。要這樣做的話,簡單實現 TypeHandler 接口(org.mybatis.type),然後映射新的類型處理器類到Java 類型,還有可選的一個 JDBC 類型。例如:

// ExampleTypeHandler.java
public class ExampleTypeHandler implements TypeHandler {
    public void setParameter(PreparedStatement ps, int i, Object parameter,JdbcType jdbcType) throws SQLException {
        ps.setString(i, (String) parameter);
    }
    public Object getResult(ResultSet rs, String columnName)throws SQLException {
        return rs.getString(columnName);
    }
    public Object getResult(CallableStatement cs, int columnIndex)throws SQLException {
        return cs.getString(columnIndex);
    }
}

// MapperConfig.xml

<typeHandlers>
    <typeHandler javaType="String" jdbcType="VARCHAR"
    handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>

使用這樣的類型處理器將會覆蓋已經存在的處理 Java 的 String 類型屬性和 VARCHAR參數及結果的類型處理器。要注意 MyBatis 不會審視數據庫元信息來決定使用哪種類型,所以你必須在參數和結果映射中指定那是 VARCHAR 類型的字段,來綁定到正確的類型處理器上。這是因爲 MyBatis 直到語句被執行都不知道數據類型的這個現實導致的.

objectFactory

MyBatis 每次創建結果對象新的實例時,它使用一個 ObjectFactory 實例來完成。如果參數映射存在,默認的 ObjectFactory 不比使用默認構造方法或帶參數的構造方法實例化目標類做的工作多。如果你想重寫默認的 ObjectFactory,你可以創建你自己的。

比如:

// ExampleObjectFactory.java
public class ExampleObjectFactory extends DefaultObjectFactory {
    public Object create(Class type) {
        return super.create(type);
    }
    public Object create(Class type,List<Class> constructorArgTypes,List<Object> constructorArgs) {
        return super.create(type, constructorArgTypes, constructorArgs);
    }
    public void setProperties(Properties properties) {
        super.setProperties(properties);
    }
}
// MapperConfig.xml
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
    <property name="someProperty" value="100"/>
</objectFactory>

ObjectFactory 接口非常簡單。它包含兩個用於創建的方法,一個是默認構造方法,另外一個是處理帶參數的構造方法。最終,setProperties 方法可以被用來配置 ObjectFactory。在初始化你的ObjectFactory實例後,objectFactory元素體中定義的屬性會被傳遞給setProperties方法。

plugins

MyBatis 允許你在某一點攔截已映射語句執行的調用。

默認情況下,MyBatis 允許使用插件來攔截方法調用:

  • Executor
    (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

  • ParameterHandler
    (getParameterObject, setParameters)

  • ResultSetHandler
    (handleResultSets, handleOutputParameters)

  • StatementHandler
    (prepare, parameterize, batch, update, query)

這些類中方法的詳情可以通過查看每個方法的簽名來發現,而且它們的源代碼存在於MyBatis 的發行包中。你應該理解你所覆蓋方法的行爲,假設你所做的要比監視調用要多。

如果你嘗試修改或覆蓋一個給定的方法,你可能會打破 MyBatis 的核心。這是低層次的類和方法,要謹慎使用插件。

使用插件是它們提供的非常簡單的力量。簡單實現攔截器接口,要確定你想攔截的指定簽名。

// ExamplePlugin.java
@Intercepts({@Signature(type= Executor.class,method = "update",
args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
    public Object intercept(Invocation invocation) throws Throwable
    {
        return invocation.proceed();
    }
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }
    public void setProperties(Properties properties) {
    }
}

// MapperConfig.xml
<plugins>
    <plugin interceptor="org.mybatis.example.ExamplePlugin">
        <property name="someProperty" value="100"/>
    </plugin>
</plugins>

上面的插件將會攔截在 Executor 實例中所有的“update”方法調用,它也是負責低層次映射語句執行的內部對象。

environments

MyBatis 可以配置多種環境。這會幫助你將 SQL 映射應用於多種數據庫之中。例如,你也許爲開發要設置不同的配置,測試和生產環境。或者你可能有多種生產級數據庫卻共享相同的模式,所以你會想對不同數據庫使用相同的 SQL 映射。這種用例是很多的。

要記得一個很重要的問題:你可以配置多種環境,但你只能爲每個 SqlSessionFactory實例選擇一個。

所以,如果你想連接兩個數據庫,你需要創建兩個 SqlSessionFactory 實例,每個數據庫對應一個。而如果是三個數據庫,你就需要三個實例,以此類推。記憶起來很簡單:

每個數據庫對應一個 SqlSessionFactory爲了明確創建哪種環境,你可以將它作爲可選的參數傳遞給 SqlSessionFactoryBuilder。
可以接受環境配置的兩個方法簽名是:

    SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
    SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);

如果環境被忽略,那麼默認環境將會被加載,如下進行:

    SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
    SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);

環境元素定義瞭如何配置環境。

<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>

注意這裏的關鍵部分:

  • 默認的環境 ID(比如:default=”development”)。
  • 每個 environment 元素定義的環境 ID(比如:id=”development”)。
  • 事務管理器的配置(比如:type=”JDBC”)。

<br/>

transactionManager

在 MyBatis 中有兩種事務管理器類型(也就是 type=”[JDBC|MANAGED]”):

  • JDBC – 這個配置直接簡單使用了 JDBC 的提交和回滾設置。它依賴於從數據源得到的連接來管理事務範圍。

  • MANAGED – 這個配置幾乎沒做什麼。它從來不提交或回滾一個連接。而它會讓容器來管理事務的整個生命週期(比如 Spring 或 JEE 應用服務器的上下文)。默認情況下它會關閉連接。然而一些容器並不希望這樣,因此如果你需要從連接中停止它,將 closeConnection 屬性設置爲 false。

<br/>

dataSsource

dataSource 元素使用基本的 JDBC 數據源接口來配置 JDBC 連接對象的資源。許多 MyBatis 的應用程序將會按示例中的例子來配置數據源。然而它並不是必須的。

要知道爲了方便使用延遲加載,數據源纔是必須的。

有三種內建的數據源類型(也就是 type=”???”):

  • UNPOOLED – 這個數據源的實現是每次被請求時簡單打開和關閉連接。它有一點慢,
    這是對簡單應用程序的一個很好的選擇,因爲它不需要及時的可用連接。不同的數據庫對這
    個的表現也是不一樣的,所以對某些數據庫來說配置數據源並不重要,這個配置也是閒置的。
  • UNPOOLED 類型的數據源僅僅用來配置以下 5 種屬性:

    • driver – 這是 JDBC 驅動的 Java 類的完全限定名

    • url – 這是數據庫的 JDBC URL 地址

    • username – 登錄數據庫的用戶名

    • password – 登錄數據庫的密碼

    • defaultTransactionIsolationLevel – 默認的連接事務隔離級別
      作爲可選項,你可以傳遞數據庫驅動的屬性。要這樣做,屬性的前綴是以“driver.”開
      頭的,例如:

    • driver.encoding=UTF8

這 樣 就 會 傳 遞 以 值 “ UTF8 ” 來 傳 遞 “ encoding ” 屬 性 , 它 是 通 過DriverManager.getConnection(url,driverProperties)方法傳遞給數據庫驅動。

  • POOLED – 這是 JDBC 連接對象的數據源連接池的實現,用來避免創建新的連接實例時必要的初始連接和認證時間。這是一種當前 Web 應用程序用來快速響應請求很流行的方法。

除了上述(UNPOOLED)的屬性之外,還有很多屬性可以用來配置 POOLED 數據源:

  • poolMaximumActiveConnections – 在任意時間存在的活動(也就是正在使用)連接的數量。默認值:10

  • poolMaximumIdleConnections – 任意時間存在的空閒連接數。

  • poolMaximumCheckoutTime – 在被強制返回之前,池中連接被檢查的時間。默認值:20000 毫秒(也就是 20 秒)

  • poolTimeToWait – 這是給連接池一個打印日誌狀態機會的低層次設置,還有重新嘗試獲得連接,這些情況下往往需要很長時間(爲了避免連接池沒有配置時靜默失敗)。默認值:20000 毫秒(也就是 20 秒)

  • poolPingQuery – 發送到數據的偵測查詢,用來驗證連接是否正常工作,並且準備接受請求。默認是“NO PING QUERY SET”,這會引起許多數據庫驅動連接由一個錯誤信息而導致失敗。

  • poolPingEnabled – 這是開啓或禁用偵測查詢。如果開啓,你必須用一個合法的SQL 語句設置 poolPingQuery 屬性。默認值:false。

  • poolPingConnectionsNotUsedFor – 這是用來配置 poolPingQuery 多次時間被用一次。這可以被設置匹配標準的數據庫連接超時時間,來避免不必要的偵測。默認值:0(也就是所有連接每一時刻都被偵測-但僅僅當 poolPingEnabled 爲 true 時適用)。
  • JNDI – 這個數據源的實現是爲了使用如 Spring 或應用服務器這類的容器,容器可以集中或在外部配置數據源,然後放置一個 JNDI 上下文的引用。這個數據源配置只需要兩個屬性:

    • initial_context – 這 個 屬 性 用 來 從 初 始 上 下 文 中 尋 找 環 境 。這是個可選屬性,如果被忽略,那麼data_source 屬性將會直接以 initialContext 爲背景再次尋找。

    • data_source – 這是引用數據源實例位置的上下文的路徑。它會以由 initial_context查詢返回的環境爲背景來查找,如果 initial_context 沒有返回結果時,直接以初始上下文爲環境來查找。
      和其他數據源配置相似,它也可以通過名爲“env.”的前綴直接向初始上下文發送屬性。

    • env.encoding=UTF8
      在初始化之後,這就會以值“UTF8”向初始上下文的構造方法傳遞名爲“encoding”的屬性。

<br/>

mappers

既然 MyBatis 的行爲已經由上述元素配置完了,我們現在就要定義 SQL 映射語句了。但是,首先我們需要告訴 MyBatis 到哪裏去找到這些語句。Java 在這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪裏去找映射文件。

    <mappers>
            <mapper resource="com/mu/mybatis/mapper/UserMapper.xml"/>
    </mappers>

這些語句簡單告訴了 MyBatis 去×××映射文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章