深刻MyBatis配置文件

咱們都知道MyBatis的持久化操做離不開SqlSessionFactory對象,這個對象是整個數據庫映射關係通過編譯後的內存鏡像,該對象的openSession()方法能夠打開SqlSession對象.該對象由由SqlSessionFactoryBuilder加載MyBatis的配置文件產生.

先貼一張MyBatis初始化的基本過程,以下圖:
sql

上圖所示,MyBatis初始化要通過如下幾步:數據庫

  1. 調用SqlSessionFactoryBuilder對象的build(inputStream)方法;
  2. SqlSessionFactoryBuilder會根據輸入流inputStream等信息建立XMLConfigBuilder對象;
  3. SqlSessionFactoryBuilder調用XMLConfigBuilder對象的parse()方法;
  4. XMLConfiguBuilder對象解析XML配置文件返回Configuration對象;
  5. SqlSessionFactoryBuilder根據Configuration對象建立一個DefaultSessionFactory對象;
  6. SqlSessionFactoryBuilder返回DefaultSessionFactory對象給客戶端,供客戶端調用;

因而可知,SqlSessionFactory是根據MyBatis的配置文件mybatis-config.xml建立的,接下來咱們就來重點研究下MyBatis配置文件中經常使用屬性的意義.服務器

MyBatis的配置文件結構

MyBatis的配置文件包含了影響MyBatis行爲的信息,文檔的結構以下:
頂層configuration配置mybatis

  • properties 屬性
  • settings 設置
  • typeAliases 類型命名
  • typeHandlers 類型處理器
  • objectFactory 對象工廠
  • plugins 插件
  • environments 環境併發

    • environment 環境變量oracle

      • transactionManager 事務管理器
      • dataSource 數據源
  • databaseIdProvider 數據庫廠商標識
  • mappers 映射器

properties屬性

這些屬性都是可外部配置且可動態替換的,既能夠在典型的Java屬性文件中配置,亦可經過properties元素的子元素來傳遞.

能夠再CLASSPATH中增長一個db.properties的Java屬性文件.app

driver=oracle.jdbc.driver.OracleDriver
ur=jdbc:oracle:thin:@127.0.0.1:1526:mybatis
username=root
password=root

在配置文件中配置<properties.../>屬性:
<properties resource="db.properties"/>
其中的屬性就能夠在整個配置文件中使用來替換須要動態配置的屬性值.dom

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

settings設置

一個配置完成的settings元素示例以下,具體含義這裏再也不列舉,能夠自行google.
ide

typeAliases 類型命名

類型別名是爲Java類型設置的一個短的名字.它只和XML配置有關,存在的意義僅在於用來減小類徹底限定名的冗餘.性能

<typeAliases>
  <typeAlias alias="user" type="org.ccgogoing.domian.User"/>
</typeAliases>

當這樣配置時,user能夠用在任何使用org.ccgogoing.domain.User的地方.
也能夠指定一個包名,MyBatis會在包名下面搜索須要的Java Bean

<typeAliases>
  <package name="org.ccgogoing.domian"/>
</typeAliases>

每個在包org.ccgogoing.domain中的Java Bean,在沒有註解的狀況下,會使用Bean的首字母小寫的非限定類名來做爲它的別名.好比org.ccgogoing.domain.User的別名爲user,如有註解,則別名爲其註解值.

@Alias("user")
public class User {
    ...
}

typeHandlers 類型處理器

不管是MyBatis在預處理語句(preparedStatement)中設置一個參數時,仍是從結果集中取出一個值時,都會用類型處理器將獲取的值以合適的方式轉換成Java類型,下圖描述了一些默認的類型處理器.

objectFactory 對象工廠

MyBatis每次建立結果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成.默認的對象工廠須要作的僅僅是實例化目標類,要麼經過默認構造方法,要買在參數映射存在的時候經過參數構造方法來實例化.若是想覆蓋對象工廠的默認行爲,則能夠經過建立本身的對象工廠來實現.

environments 配置環境

MyBatis的環境配置實際就是數據源的配置.MyBatis能夠配置多種環境,這種機制使得MyBatis能夠將SQL映射應用於多種數據庫中.例如,開發,測試盒生產環境須要不一樣的配置;多個生產數據庫想使用相同的sql映射,等等.

儘管能夠配置多個環境,可是每一個SqlSessionFactory實例只能選擇一個環境,即每一個數據庫對應一個SqlSessionFactory實例.因此若是你想鏈接兩個數據庫,就須要建立兩個SqlSessionFactory實例,每一個數據庫對應一個.

環境配置示例以下:

<environments default="development">
        <environment id="development">
            <!--指定事務管理類型,type="JDBC"指直接簡單使用了JDBC的提交和回滾事務-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- dateSource指定數據源配置,POOLED是jdbc鏈接對象的數據源鏈接池的實現-->
            <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").
環境ID能夠隨意命名,建議簡潔有意義,而默認環境必定要匹配定義的其中一個環境ID.
<transactionManager.../>表示事務管理配置,在MyBatis中有JDBCMANAGED兩中類型的事務管理器:

  • JDBC.這個配置就是直接使用了JDBC的提交和回滾設置,它依賴於從數據源獲得的鏈接來管理事務範圍.
  • MANAGED. 這個配置幾乎沒作什麼.它歷來不提交或回滾一個鏈接,而是讓容器來管理事務的整個生命週期(好比JAVAEE應用服務器的上下文).默認狀況下它會關閉鏈接,然而一些容器並不但願這樣,能夠將closeConnection屬性設置爲false來阻止它的默認關閉行爲.
<transactionManager type="MANAGED">
                <property name="closeConnection" value="false"/>
            </transactionManager>

提示: 若是開發使用Spring+MyBatis,則沒有必要配置事務管理器,由於Spring模塊會使用自帶的管理器來覆蓋前面的配置.

<dataSource.../>表示數據源配置,在MyBatis中有UNPOOLED、POOLED和JNDI三種數據源類型:

  • UNPOOLED.這個數據源的實現只是每次被請求時打開和關閉鏈接。它對沒有性能要求的簡單應用程序是一個很好的選擇。不一樣的數據庫在這方面表現也是不同的。

UNPOOLED類型的數據源僅僅須要配置一下5種屬性:
drive、url、username、password、defaultTransactionIsolationLevel。默認的鏈接事務隔離級別。

  • POOLED:這種數據源的實現利用「池」的概念將JDBC鏈接對想組織起來,避免了建立新的鏈接實例時所必需的初始化時間和認證時間。這是一種使得併發Web應用快速響應請求的流行處理方式,除了上述提到的UNPOOLED的5中屬性外,還可使用更多的屬性來配置POOLED的數據源:

    • poolMaximumActiveConnections.在任意時間能夠存在的活動(也就是正在使用)鏈接數量,默認值是10.
    • poolMaximumIdleConnections.任意時間可能存在的空閒鏈接數.
    • poolMaximunCheckoutTime.在被強制返回以前,池中鏈接被檢出時間,默認值爲20000毫秒(即20秒).
    • poolTimeToWait.這是一個底層設置,若是獲取鏈接花費至關長的時間,它會給鏈接池打印狀態日誌並從新嘗試獲取一個鏈接(避免在誤配置的狀況下一直安靜地失敗),默認值爲20000毫秒(20秒).
    • poolPingQuery.發送到數據庫的偵測查詢,用來檢驗鏈接是否處於正在工做秩序中並準備接受請求.默認是"NO PING QUERY SET",這會致使多數數據庫驅動失敗時帶有一個恰當的錯誤消息.
    • poolPingEnabled.是否啓用偵測查詢.若開啓,也必須使用一個可執行的sql語句設置poolPingQuery屬性(最好是一個很是快的sql),默認值爲false.
    • poolPingConnectionsNotUsedFor.配置poolPingQuery的使用頻度.這能夠被設置成匹配具體的數據庫鏈接超時時間,來避免沒必要要的偵測,默認值爲0(即全部鏈接每一時刻都被偵測,固然僅當poolPingEnabled爲true時適用).
  • JNDI.這個數據源的實現是爲了能在如EJB或應用服務器這類容器中使用,容器能夠集中或在外部配置數據源,而後放置一個JNDI上下文的引用.這種數據源配置只須要兩個屬性以下圖所示:

mapper 映射器

MyBatis須要開發者本身寫sql語句,mapper映射器正是告訴MyBatis到哪裏去找映射文件,進而找到這些sql語句.實際開發中可使用相對於類路徑的資源引用或徹底限定資源定位符(包括file:///的URL),以及類名和包名等,例如:

<!-- 使用類路徑查找資源文件 -->
    <mappers>
        <mapper resource="com/ccgogoing/fileupload/mapper/sqlmap-mapping-user.xml"/>
    </mappers>
    <!-- 使用本地文件 -->
    <mappers>
        <mapper url="file:///C:/mapper/UserMapper.xml">
    </mappers>
    <!-- 使用接口類 -->
    <mappers>
        <mapper class="org.ccgogoing.mapper.UserMapper"
    </mappers>
    <!-- 使用包名 -->
    <mappers>
        <package name="org.ccgogoing.mapper"/>
    </mappers>

mapper映射器會告訴MyBatis去哪裏找映射文件,剩下的細節就是每一個SQL映射文件了,我會在接下來的文章中詳細說明這部分知識.

相關文章
相關標籤/搜索