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