[02] mybatis-config.xml 全局配置文件解析


本篇會摘錄mybatis全局配置文件中比較常見經常使用的一些配置進行說明,其實 官方文檔已經寫得足夠清晰了(關鍵是還有中文版徹底不慌),此處記錄重要仍是做爲我的的鞏固記錄。

一、properties

在全局配置文件中,屬性的值是能夠由外部配置進行動態替換的,這也就使咱們把諸如 「數據庫鏈接信息放到單獨的文件」 成爲可能,這裏有兩種方式:
  • 配置信息放在常見的 .properties 文件中,經過 resource 屬性來引入
  • 直接經過 property 屬性進行定義

以下有 .properties 文件:
jdbc.username=root
jdbc.password=dev

則咱們在配置文件中配置數據庫鏈接信息能夠這樣:
<configuration>
    <properties resource="db.properties">
        <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="jdbc.url" value="jdbc:mysql://localhost:3306/dbgirl" />
    </properties>

    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事務管理 -->
            <transactionManager type="JDBC"/>
            <!-- 數據庫鏈接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="sqlmapper/GirlMapper.xml"/>
    </mappers>
</configuration>

屬性值經過表達式 ${ } 來讀取,如上例中 driver 和 url 將從 properties 的元素 <property> 中讀取,而 username 和 url 則能夠從 db.properties 中讀取。固然,更多狀況下咱們仍是統一寫在 .properties 中。須要注意的是,properties 元素體內的屬性會優先讀取,這意味着若是你在兩個地方分別定義了同名的屬性,那麼最終讀取到的值會以 .properties 文件中的爲準。

二、environments

2.1 environment

如上例中咱們的數據庫鏈接配置是放置在 <environments> 中的 <environment> 標籤中,這是MyBatis提供的多環境適應機制,例如開發、測試、生產環境都須要有不一樣的配置,這意味着假如你有生產環境和開發環境兩種配置,你能夠這樣寫:
<environments default="development">
    <!--開發環境-->
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="root"/>
            <property name="password" value="dev"/>
        </dataSource>
    </environment>
    
    <!--生產環境-->
    <environment id="produce">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
    
</environments>
  • environment 的 id 屬性用來區分和定義不一樣的配置環境
  • environments 的 default 用來肯定默認使用的配置環境,值是某個 environment 的 id

須要注意的是, 儘管能夠配置多個環境,但每一個 SqlSessionFactory 實例只能選擇其一,若是想鏈接兩個數據庫,就須要建立兩個 SqlSessionFactory 實例,每一個數據庫對應一個。

爲了肯定建立哪一種環境,咱們每每須要將其做爲參數傳給 SqlSessionFactoryBuilder :
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);

若是忽略將 environment 做爲參數傳入,則會加載默認的環境:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);

2.2 transactionManager

在 MyBatis 中有兩種類型的事務管理器:
  • JDBC - 這個配置就是直接使用了 JDBC 的提交和回滾設置,它依賴於從數據源獲得的鏈接來管理事務做用域
  • MANAGED - 這個配置歷來不提交或回滾一個鏈接,而是讓容器來管理事務的整個生命週期

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

2.3 dataSource

dataSource 元素使用標準的 JDBC 數據源接口來配置 JDBC 鏈接對象的資源,有三種內建的數據源類型
  • UNPOOLED - 只是每次被請求時打開和關閉鏈接
  • POOLED - 利用「池」的概念將 JDBC 鏈接對象組織起來,避免了建立新的鏈接實例時所必需的初始化和認證時間
  • JNDI - 爲了能在如 EJB 或應用服務器這類容器中使用,容器能夠集中或在外部配置數據源,而後放置一個 JNDI 上下文的引用

三、mappers

mappers是用來讓告訴MyBatis去哪找到那些執行的SQL語句,可使用 相對於類路徑的資源引用, 或 徹底限定資源定位符(包括 file:/// 的 URL),或 類名包名等:
<!-- 使用相對於類路徑的資源引用 -->
<mappers>
    <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
    <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
    <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

<!-- 使用徹底限定資源定位符(URL) -->
<mappers>
    <mapper url="file:///var/mappers/AuthorMapper.xml"/>
    <mapper url="file:///var/mappers/BlogMapper.xml"/>
    <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

<!-- 使用映射器接口實現類的徹底限定類名 -->
<mappers>
    <mapper class="org.mybatis.builder.AuthorMapper"/>
    <mapper class="org.mybatis.builder.BlogMapper"/>
    <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

<!-- 將包內的映射器接口實現所有註冊爲映射器 -->
<mappers>
    <package name="org.mybatis.builder"/>
</mappers>

四、settings

在標題1-3中是MyBatis最最基本須要咱們改變的配置信息,而settings則是用來改變MyBatis運行時行爲的重要調整設置,由於屬性較多此處再也不細細展開,詳見 官方文檔,以下例爲官方提供的部分示例,以在此處作簡要說明:
<settings>
    <!--全局地開啓或關閉配置文件中的全部映射器已經配置的任何緩存-->
    <setting name="cacheEnabled" value="true"/>
    <!--延遲加載的全局開關。當開啓時,全部關聯對象都會延遲加載。特定關聯關係中可經過設置fetchType屬性來覆蓋該項的開關狀態-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--是否容許單一語句返回多結果集(須要兼容驅動)-->
    <setting name="multipleResultSetsEnabled" value="true"/>
    <!--使用列標籤代替列名,不一樣的驅動在這方面會有不一樣的表現-->
    <setting name="useColumnLabel" value="true"/>
    <!--容許 JDBC 支持自動生成主鍵,須要驅動兼容-->
    <setting name="useGeneratedKeys" value="false"/>
    <!--指定 MyBatis 應如何自動映射列到字段或屬性-->
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    <!--指定發現自動映射目標未知列(或者未知屬性類型)的行爲-->
    <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
    <!--配置默認的執行器-->
    <setting name="defaultExecutorType" value="SIMPLE"/>
    <!--設置超時時間,它決定驅動等待數據庫響應的秒數-->
    <setting name="defaultStatementTimeout" value="25"/>
    <!--爲驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只能夠在查詢設置中被覆蓋-->
    <setting name="defaultFetchSize" value="100"/>
    <!--容許在嵌套語句中使用分頁,若是容許使用則設置爲false-->
    <setting name="safeRowBoundsEnabled" value="false"/>
    <!--是否開啓自動駝峯命名規則映射,即從經典數據庫列名A_COLUMN到經典Java屬性名aColumn的相似映射-->
    <setting name="mapUnderscoreToCamelCase" value="false"/>
    <!--利用本地緩存機制防止循環引用和加速重複嵌套查詢-->
    <setting name="localCacheScope" value="SESSION"/>
    <!--當沒有爲參數提供特定的JDBC類型時,爲空值指定哪一種JDBC類型-->
    <setting name="jdbcTypeForNull" value="OTHER"/>
    <!--指定哪一個對象的方法觸發一次延遲加載,用逗號分隔的方法列表-->
    <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

五、typeAliases

類型別名是爲 Java 類型設置一個短的名字。它只和 XML 配置有關,存在的意義僅在於用來減小類徹底限定名的冗餘,以下配置時 「Blog能夠用在任何使用domain.blog.Blog的地方」:
<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>

也能夠指定一個包名,MyBatis會自動掃描包中的類,自動定義別名(別名即類名,且首字母大小寫都可):
<typeAliases>
    <package name="domain.blog"/>
    <package name="domain.article"/>
    <!-- ... -->
</typeAliases>

這個配置每每使得咱們在mapper.xml中指定輸入參數和輸出結果類型變得簡單方便。

MyBatis中也提供了一些默認支持的別名(默認別名的規則是基本數據類型是名稱前加下劃線,引用數據類型是首字母小寫):
別名 映射的類型
別名 映射的類型
_byte byte
double
Double
_long long
float
Float
_short short
boolean Boolean
_int int
date
Date
_integer int
decimal
BigDecimal
_double double
bigdecimal
BigDecimal
_float float
object
Object
_boolean boolean
map
Map
string String
hashmap
HashMap
byte Byte
list
List
long Long
arraylist ArrayList
short Short
collection Collection
int Integer
iterator Iterator
integer
Integer




六、typeHandlers

不管是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,仍是從結果集中取出一個值時,都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型,MyBatis 中已有一些默認的類型處理器,此處列舉一二僅供參考,詳情參考 官方文檔
類型處理器 Java類型 JDBC類型
StringTypeHandler java.lang.String CHAR, VARCHAR
DateTypeHandler java.util.Date TIMESTAMP
IntegerTypeHandler java.lang.Integer, int 數據庫兼容的 NUMERIC 或 INTEGER
FloatTypeHandler java.lang.Float, float 數據庫兼容的 NUMERIC 或 FLOAT
... ... ...

固然,你也能夠選擇重寫類型處理器或建立你本身的類型處理器來處理不支持的或非標準的類型,具體實現 org.apache.ibatis.type.TypeHandler 接口,或繼承 org.apache.ibatis.type.BaseTypeHandler ,一般來講MyBatis提供的類型處理器已經足夠知足平常的開發須要,不須要咱們額外自定義。
<!-- mybatis-config.xml -->
<typeHandlers>
    <typeHandler handler="org.mybatis.example.CustomTypeHandler"/>
</typeHandlers>

注意:舉例來講,假如你自定義的類型處理器是用來處理Java的String和JDBC的VARCHAR類型轉換,則自定義處理器會覆蓋掉原來默認的處理器。
相關文章
相關標籤/搜索