mybatis主配置文件解析

所謂mybatis主配置文件就是上一篇文章中提到的mybatis-config.xml,SqlSessionFactoryBuilder 通過解析這個配置文件得到代表數據庫的SqlSessionFactory對象,所以說這個文件是mybatis配置的入口。下面來仔細解析下這個配置文件。首先給出所有可以配置的屬性,然後再重點研究下幾個重要屬性。mybatis配置文件是有固定結構的,每個標籤出現順序是固定的,如果改變這種順序就會造成解析失敗。具體順序如下:

<configuration><!--配置-->
    <properties/><!--屬性-->
    <settings/><!--設置-->
    <typeAliases/><!--類型命名-->
    <typeHandlers/><!--類型處理器-->
    <objectFactory/><!--對象工廠-->
    <plugins/><!--插件-->
    <environments><!--環境配置-->
        <environment><!--環境配置-->
            <transactionManager/><!--事務管理方式-->
            <dataSource><!--數據源配置-->
        </environment>
    </environments>
    <databaseIdProvider/><!--數據庫提供廠商-->
    <mappers/><!--映射器-->
</configuration>

1.properties屬性配置方式
配置屬性的目的往往是爲了方便在別的地方直接引用,properties的配置有以下幾種方式。
1)直接配置properties元素的子元素,然後在其它地方進行引用

 <configuration>
    <properties>
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/bank"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </properties>
    <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>
</configuration>

2)通過properties的resource/url屬性引入properties配置文件,然後之後的代碼可以引用文件中的配置
properties文件配置:

driver=com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/bank
username=root
password=root

xml文件中直接引用文件中的配置:

<configuration>
    <properties resource="jdbc.properties"/>
    <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>
</configuration>

3)通過代碼配置
可以在代碼中創建一個Properties對象,然後填充一些屬性,傳給SqlSessionFactoryBuilder對象的buider()方法,這樣也可以在xml文件中引用到在代碼中傳入的那些屬性。
上述的三種方式不是完全互斥的而是可能同時出現並且還可能針對某個屬性使用三種方式都進行了配置,導致相互覆蓋的情況;這時就得清楚mybatis的加載順序:mybatis首先解析properties元素體內的配置,然後根據properties元素中的resource屬性讀取類路徑下指定的配置文件,或讀取url指定的配置文件,並覆蓋已經讀取的同名屬性;最後讀取作爲方法參數傳遞的屬性,並覆蓋已讀取的同名屬性。所以通過方法傳遞的屬性具有最高優先級,配置文件次之,properties子元素配置的屬性優先級最低。
總的來說應該不應該同時混合使用這幾種配置方式,首選的還是配置文件方式。

2.setting配置
設置(setting)配置是mybatis中最複雜、最重要的配置,因爲它會改變mybatis默認的行爲。一般情況下不需要配置這個文件,mybatis也可以正常工作,但如果要進行一些高級配置,則需要配置這裏面的屬性。比如說要將數據庫裏的下劃線字段名映射到Java駝峯字段,則配置。下面列舉了所有的settings屬性配置,常用的有下劃線轉駝峯設置、緩存設置、超時時間設置、默認執行器等設置。下標展示了所有mybatis可以設置的setting屬性及其含義。
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

3.別名設置
別名(typeAliases)是一個指代的名稱,一般情況下是因爲我們遇到的全限定類名過長,所以定義一個簡短的名稱去指代它。mybatis分爲系統別名和自定義別名兩類,另外別名不區分大小寫。系統別名可以直接使用,並且在自定義別名的時候注意不要覆蓋系統別名。自定義別名通過typealiase實現:

 <!--爲POJO對象定義別名,定義的別名可以在mapper配置文件中使用-->
    <typeAliases>
        <typeAlias alias="branch" type="com.sankuai.longkaili.domain.Branch"/>
    </typeAliases>

如果需要映射的POJO對象很多,那麼這樣的配置需要重複多次很不方便,可以指定typeAliases的package子元素,這樣mybatis會主動掃描配置的包下所有的類。對於這些類,如果使用@Alias()指定了別名,則會使用這個名稱作爲該類在mybatis中的別名;如果沒有使用註解指定別名,則會默認將該類名首字母小寫之後註冊爲其別名。

4.typeHander類型處理器
數據庫有自己的數據類型,JDBC/(Java)也定義有自己的數據類型,typeHander的功能就是提供類型映射—-數據庫類型和Java類型的相互映射。
什麼時候需要映射?給sql傳遞參數(PrepareStatement動態參數傳遞)需要將Java類型的參數轉換爲JDBC類型的數據;從ResultSet中提取結果時,需要數據從數據庫數據類型轉換成Java類型。

5.ObjectFactory
當MyBatis在構建一個結果返回的時候,都會使用ObjectFactory(對象工廠)去構建POJO,在MyBatis可以定製自己的對象工廠。一般情況下,我們都不需要自己定義ObjectFactory對象,使用系統默認的就行。

6.environments配置環境
通過配置environments下的多個environment子元素,可以實現多數據源配置。具體的來說,一個數據源分爲兩大部分:一個是數據庫資源的配置,一個是數據庫事務配置。下面是示例:

<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/bank"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
        <environment id="product">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://117.23.05.2:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

environments中的default標明在缺省的情況下,我們將啓用哪個數據源配置—- SqlSessionFactoryBuilder對象的buid方法是可以通過傳入environment的id來指定具體數據源的。
environment元素是配置一個數據源的開始,屬性id是設置這個數據源的標識,便於Mybatis上下文使用。
transactionManager配置的是數據庫事務,其中type屬性有以下幾種配置:
JDBC,採用JDBC方式管理事務
MANAGED,採用容器方式管理事務,在JNDI數據源中使用
自定義,由使用者自定義數據庫事務管理方法,適用特殊應用
datasource標籤,是配置數據源連接的信息,type屬性指定了數據庫連接方式,有以下幾種類型
UNPOOLED,非連接池數據庫
POOLED,連接池數據庫
JNDI,JNDI數據源
自定義數據源
其中配置的property元素就是定義數據庫的各類參數。
使用UNPOOLED 非連接池時,使用的是
org.apache.ibatis.datasource.unpooled.UnpooledDataSource的實現
使用POOLED 連接池時,使用的是
org.apache.ibatis.datasource.unpooled.PooledDataSource實現
如果使用JDNI,則使用
org.apache.ibatis.datasource.jndi.JndiDataSourceFactory來獲取數據源
除了這三種方式以外,還可以自定義數據源的實現方式,如果要使用自定義數據源,需要實現org.apache.ibatis.datasource.DataSourceFactory
並將其配置到datasource元素的type屬性.下面的代碼展示瞭如何使用dbcp數據源:

package com.sankuai.lkl.DatasourceFactory;

import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.apache.ibatis.datasource.DataSourceFactory;

import javax.sql.DataSource;
import java.util.Properties;


public class DbcpDataSourceFactory extends BasicDataSource implements DataSourceFactory {

    private Properties properties = null;

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public DataSource getDataSource() {
        DataSource dataSource = null;
        try {
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dataSource;
    }
}

xml中配置:

<dataSource type="com.sankuai.lkl.DatasourceFactory.DbcpDataSourceFactory">

7.引入映射器的方法
這裏的映射器指的就是前面我們配置的mapper文件,首先是通過命名空間將配置文件和某個接口進行關聯,然後通過子元素的id將指定的sql關聯到接口的具體方法上去;配置這個文件之後,我們就可以通過SqlSession生成接口的代理對象,並通過調用這個代理對象的方法來執行具體的sql。下面看下引入映射器的幾種方式。

<!--定義映射器,Mapper接口中的方法和具體SQL語句的映射關係-->
    <!--四種引入映射器的方式-->
    <mappers>
        <!--resource指定的是classpath下面的mapper文件,只需配置相對路徑-->
        <mapper resource="mapper/branchMapper.xml"/>
        <!--url指定的也是某個mapper文件,與resource不同,用的是絕對路徑-->
        <mapper url="file:///Users/longkaili/IDEA/mybatis3/src/main/resources/mapper/branchMapper.xml"/>
        <!--class屬性指定從某個類上讀取映射規則,用於註解綁定sql的情景-->
        <mapper class="com.sankuai.longkaili.mapper.BranchMapper"/>
        <!--package指定掃描某個包下的所有類,同樣用於註解綁定sql的情況-->
        <package name="com.sankuai.longkaili.mapper"/>
    </mappers>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章