MyBatis - Configuration

一、Configuration 屬性講解(一)

Configuration就像是Mybatis的總管,Mybatis的所有配置信息都存放在這裏,此外,它還提供了設置這些配置信息的方法。Configuration可以從配置文件裏獲取屬性值,也可以通過程序直接設置。Configuration裏可供配置的屬性有:

1、properties 屬性

1)配置示例

<properties resource="org/mybatis/example/config.properties"> 
    <property name="username" value="dev_user"/> 
    <property name="password" value="F2Fa3!33TYyg"/> 
</properties>

2)用途

properties裏配置的屬性將被存放在Configuration的variables變量裏,供Mybatis使用。此外在配置文件中,也可以使用這些屬性,用來對配置項實現動態配置。比如:

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

3)注意事項

resource裏也可指定屬性值,並且resource裏屬性值的優先級高於property子節點裏配置的值,也就是說resource的同名屬性將會覆蓋於property子節點裏的值。

 

2、settings 設置

1)配置示例

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

2)用途

setting節點裏配置的值會直接改寫Configuration對應的變量值,這些變量描述的是Mybatis的全局運行方式,如果對這些屬性的含義不熟悉的話建議不要配置,使用默認值即可。下面這個表格描述了各個配置項的含義和默認值:

3)注意事項

謹慎修改這些配置值。

 

3、typeAliases 類型命名

1)配置示例

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

2)用途

別名是爲Java類型命名一個短的名字。它只用在XML配置文件裏,用來減少類完全限定名的多餘部分。例如在配置文件裏需要使用domain.blog.Author的地方可以簡單的使用Author替換。

3)注意事項

Mybatis裏有一些默認的別名,不要覆蓋這些別名:

 

4、typeHandlers 類型處理器

1)配置示例

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

2)用途

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

3)注意事項

Mybatis已經有了若干個類型處理器了,編寫自己的類型處理器時勿重新發明輪子。

 

5、objectFactory 對象工廠

略(不常用)

 

6、plugins 插件

1)配置示例

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

2)用途

插件可以改變某些類的執行, MyBatis允許被插件來攔截的類有:

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 
ParameterHandler (getParameterObject, setParameters) 
ResultSetHandler (handleResultSets, handleOutputParameters) 
StatementHandler (prepare, parameterize, batch, update, query)

3)注意事項

插件可以改變MyBatis底層的行爲,因此功能非常強大。但在對MyBatis深入理解前不要急着編寫自己的插件,因爲若插件編寫不當,將導致整個MyBatis都不能正常工作。本系列的後面會有專門的章節介紹插件機制以及兩個有用的插件,歡迎持續關注。

 

7、environments 環境

environments裏可以配置多個environment,每個environment對應一個數據庫環境。一個完整的定義如下:

<environments default="development"> 
    <environment id="development"> 
        <transactionManager type="JDBC"></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>

environments裏的default屬性表示默認的數據庫環境,與某個environment的id相對應。

environment 環境變量

environment通過id屬性與其他數據庫環境區別。它有兩個子節點:

a)transactionManager事務管理器

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

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

l MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連接。而它會讓容器來管理事務的整個生命週期(比如Spring或JEE應用服務器的上下文)。

b)dataSource數據源

在MyBatis中有三種數據源類型(也就是type=」[UNPOOLED | POOLED| JNDI]」):

l UNPOOLED:這個數據源的實現是每次被請求時簡單打開和關閉連接,需要配置的屬性:

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

url:這是數據庫的JDBC URL地址。

username:登錄數據庫的用戶名。

password:登錄數據庫的密碼。

defaultTransactionIsolationLevel:默認的連接事務隔離級別。

l POOLED:mybatis實現的簡單的數據庫連接池類型,它使得數據庫連接可被複用,不必在每次請求時都去創建一個物理的連接。

l JNDI:通過jndi從tomcat之類的容器裏獲取數據源。

 

8、mapper 映射器

1)配置示例

<mappers> 
    <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> 
    <mapper resource="org/mybatis/builder/BlogMapper.xml"/> 
    <mapper resource="org/mybatis/builder/PostMapper.xml"/> 
</mappers>

2)用途

Mappers用於告訴Mybatis去哪裏尋找sql映射文件。sql映射文件是Mybatis最靈活的地方。sql映射文件在後續的章節裏會進一步詳細描述,歡迎持續關注。

 

二、Configuration 屬性講解(二)

前面介紹了Configuration的各個屬性以及在文件裏配置他們的方法。這一節介紹如何從文件裏解析這些配置項以及簡化配置的方法。Configuration在SqlSessionFactoryBuilder創建SqlSessionFactory時創建,通過XMLConfigBuilder的parse方法創建。下面一個個的介紹:

1、properties 屬性

通過XMLConfigBuilder的propertiesElement方法解析,解析後的結果存放在Configuration的variables變量裏。解析順序,先解析子節點裏的屬性值,再解析resource屬性指定的配置文件裏的值。後者會覆蓋前者的值。

 

2、settings 設置

通過XMLConfigBuilder的settingsElement方法解析,解析前校驗屬性是否是可配置的,只要有一個不可配置,整個mybatis就會異常退出,所以配置這些屬性務必小心。

 

3、typeAliases 類型命名

通過XMLConfigBuilder的typeAliasesElement方法解析,在該方法內部調用TypeAliasRegistry的registerAlias方法完成註冊,並將註冊的別名存入本地緩存中。XMLConfigBuilder調用的registerAlias方法並沒有什麼特別的地方,但TypeAliasRegistry卻提供了批量註冊別名的方法,該方法只需要一個包名參數。該方法會在指定的包路徑下掃描可註冊的類(接口和內部類除外),並以類的簡單名爲key完整名爲value註冊別名。這個方法極大的簡化了配置,後續章節將要介紹的spring與mybatis的整合模塊裏就使用了這個方法使得配置量大大減少。

 

4、typeHandlers 類型處理器

通過XMLConfigBuilder的typeHandlerElement方法解析,在該方法內部調用TypeHandlerRegistry的register方法完成註冊,並將註冊的類型處理器存入本地緩存中。同typeAliases一樣,TypeHandlerRegistry也提供了批量註冊的方法,該方法同樣只需要一個包名參數。該方法會在指定的包路徑下掃描可註冊的類(接口、抽象類和內部類除外),不過只註冊那些配置了MappedTypes註解的類。這個方法極大的簡化了配置,後續章節將要介紹的spring與mybatis的整合模塊裏就使用了這個方法使得配置量大大減少。

 

5、objectFactory 對象工廠

略(不常用)

 

6、plugins 插件

通過XMLConfigBuilder的pluginElement方法解析,在該方法內部實例化插件對象後存入Configuration的interceptorChain變量裏。

 

7、environments 環境

通過XMLConfigBuilder的environmentsElement方法解析,在該方法內,先判斷默認是否指定了環境ID,沒有的話就使用默認的環境ID嗎,然後在各個環境裏取ID對應的項。也就是說一個Configuration只會保存一個數據庫環境,如果要配置多數據庫環境的話需要創建多個Configuration對象。在改方法內先解析事務工廠、再解析數據源、然後再解析數據庫環境,在解析數據庫環境的過程中會訪問一次數據庫,以取得數據庫類型信息。

 

8、mapper 映射器

通過XMLConfigBuilder的mapperElement方法解析,在該方法內部通過調用XMLMapperBuilder的parse方法完成。mapper的解析是mybatis的核心功能,涉及的流程較複雜,在下一章將專門分析,敬請期待。

 

轉自:https://blog.csdn.net/hupanfeng/article/details/9080545