Loading

Mybatis的全局配置文件

1 概述

  • Mybatis的全局配置文件包含了影响Mybatis行为甚深的设置(settings)和属性(properties)信息。

  • 文档的顶层结构如下:

    • Configuration配置:
      • properties属性
      • settings设置
      • typeAliases类型命名
      • typeHandlers类型处理器
      • objectFactory对象工厂
      • plugins插件
      • environments环境
        • environment环境变量
          • transactionManager事务管理器
          • dataSource数据源
      • databaseIdProvider数据库厂商标识
      • mappers 映射器

2 properties(了解)

  • Mybatis可以使用properties标签来引入外部的properties属性配置文件中的内容。

  • 属性:

    • resource:引入类路径下的配置文件。
    • url:引入网络或磁盘上的配置文件。
  • 示例:

  • db.properties

jdbc.url=jdbc:mysql://192.168.134.100:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=123456
  • mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--
        Mybatis可以使用properties标签来引入外部properties配置文件的内容
            resource属性:引入类路径下的配置文件
            url属性:引入网络或磁盘上的配置文件
    -->
    <properties resource="db.properties" ></properties>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用${}引入db.properties属性文件中的内容 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
    </mappers>
</configuration>

3 settings

  • 这是Mybatis中极为重要的调整设置,它们会改变Mybatis的运行时行为。

  • 示例:

  • mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--
        Mybatis可以使用properties标签来引入外部properties配置文件的内容
            resource属性:引入类路径下的配置文件
            url属性:引入网络或磁盘上的配置文件
    -->
    <properties resource="db.properties" ></properties>

    <settings>
        <!-- 
			开启自动驼峰命名规则映射,可以将诸如last_name封装为lastName。
 		-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用${}引入db.properties属性文件中的内容 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
    </mappers>
</configuration>

4 typeAliases(别名处理器)

  • 类型别名是为Java类型设置一个短的名字,可以方便我们引用某个类。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--
        Mybatis可以使用properties标签来引入外部properties配置文件的内容
            resource属性:引入类路径下的配置文件
            url属性:引入网络或磁盘上的配置文件
    -->
    <properties resource="db.properties" ></properties>

    <settings>
        <!-- 开启自动驼峰命名规则映射 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <typeAliases>
        <!--
            类型别名是为Java类型设置一个短的名字,可以方便我们引用某个类
        -->
        <typeAlias type="com.sunxiaping.domain.Employee" alias="emp"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用${}引入db.properties属性文件中的内容 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
    </mappers>
</configuration>
  • 在类很多的情况下,可以批量设置别名。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--
        Mybatis可以使用properties标签来引入外部properties配置文件的内容
            resource属性:引入类路径下的配置文件
            url属性:引入网络或磁盘上的配置文件
    -->
    <properties resource="db.properties" ></properties>

    <settings>
        <!-- 开启自动驼峰命名规则映射 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <typeAliases>
        <!--  
            通过package标签的name属性指定需要生成别名的包,默认会创建一个别名,就是类名的小写
        -->
        <package name="com.sunxiaping"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用${}引入db.properties属性文件中的内容 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
    </mappers>
</configuration>
  • 可以在类上使用@Alias注解设置别名:
package com.sunxiaping.domain;

import org.apache.ibatis.type.Alias;

@Alias("emp")
public class Employee {

    private Integer id;

    private String lastName;

    private String email;

    private String gender;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}
  • 需要注意的是,Mybatis已经为许多常见的Java类型内建了相应的类型别名。它们都是大小写不敏感的,我们在起别名的时候千万不要占用已有的别名。
别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection

5 typeHandlers(类型处理器)

  • 无论是Mybatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值的时候,都会用类型处理器将获取的值以合适的方式转换为Java类型。
类型处理器 Java类型 JDBC类型
BooleanTypeHandler java.lang.Boolean,boolean 数据库兼容的BOOLEAN
ByteTypeHandler java.lang.Byte,byte 数据库兼容的NUMERIC或BYTE
ShortTypeHandler java.lang.Short,short 数据库兼容的NUMERIC或SHROT INTEGER
IntegerTypeHandler java.lang.Integer,int 数据库兼容的NUMERIC或INTEGER
LongTypeHandler java.lang.Long,long 数据库兼容的NUMERIC或Long INTEGER
FloatTypeHandler java.lang.Float,float 数据库兼容的NUMERIC或FLOAT
DoubleTypeHandler java.lang.Double,double 数据库兼容的NUMERIC或DOUBLE
BigDecimalTypeHandler java.lang.BigDecimal 数据库兼容的NUMERIC或DECIMAL
StringTypeHandler java.lang.String CHAR,VARCHAR
  • 日期类型的处理:JDK1.8以前一直是个头疼的问题。我们通常使用JSR310规范领导者Stephen Colebourne创建的Joda-Time来操作。JDK1.8已经实现全部的JST310规范了。日期时间处理上,我们可以使用Mybatis基于JSR310编写的各种日期时间类型处理器。Mybatis3.4以前的版本需要我们手动注册这些处理器,以后的版本都是自动注册的。

  • 自定义类型处理器:我们可以重写类型处理器或者创建自己的类型处理器来处理器不支持的或非标准的类型。

    • 步骤:
      • ①实现org.apche.ibatis.type.TypeHandler接口或者继承org.apche.ibatis.type.BaseTypeHandler。
      • ②指定其映射某个JDBC类型。
      • ③在Mybatis的全局配置文件中注册。

6 plugins(插件)

  • 插件是Mybatis提供的一个非常强大的机制,我们可以通过插件来修改Mybatis的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行。
Executor(update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)
ParameterHandler(getParameterObject, setParameters)
ResultSetHandler(handleResultSets, handleOutputParameters)
StatementHandler(prepare, parameterize, batch, update, query)

7 environments(环境)

  • Mybatis可以配置多种环境,比如开发、测试和生产环境需要有不同的配置。

  • 每种环境使用一个environment标签进行配置并指定唯一标识符。

  • 可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境。

  • environment:指定具体环境

    • id:指定当前环境的唯一标识。
    • transactionManager:事务管理器。
      • type:事务管理器的类型。有JDBC、MANAGED和自定义类型。
        • JDBC:使用了JDBC的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。
        • MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期。
        • 自定义:实现TransactionFactory接口,type=全类名/别名。
    • dataSource:数据源。
      • type:数据源类型。有UNPOOLED、POOLED、JNDI和自定义类型。
        • UNPOOLED:不使用连接池。
        • POOLED:使用连接池。
        • JNDI:在EJB或应用服务器这类容器中查找指定的数据源。
        • 自定义:实现DataSourceFactory接口,定义数据源的获取方式。
  • 示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--
        Mybatis可以使用properties标签来引入外部properties配置文件的内容
            resource属性:引入类路径下的配置文件
            url属性:引入网络或磁盘上的配置文件
    -->
    <properties resource="db.properties" ></properties>

    <settings>
        <!-- 开启自动驼峰命名规则映射 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <typeAliases>
        <!--
            通过package标签的name指定需要生成别名的包,默认会创建一个别名,就是类名的小写
        -->
        <package name="com.sunxiaping"/>
    </typeAliases>

    <!--
        environments,Mybatis可以配置多种环境
            environment:配置一个具体的环境信息;必须有transactionManager和dataSource标签。属性id代表当前环境的标识,可以达到快速切换环境
                transactionManager:事务管理器
                    type:事务管理器的类型,有JDBC和MANAGED两种类型,还可以自定义事务管理器
                dataSource:数据源
                    type:数据源的类型,有UNPOOLED、POOLED、JNDI和自定义类型。
    -->
    <environments default="development">
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用${}引入db.properties属性文件中的内容 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用${}引入db.properties属性文件中的内容 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
    </mappers>
</configuration>

8 databaseIdProvider

  • Mybatis可以根据不同的数据库厂商执行不同的语句。
<databaseIdProvider type="DB_VENDOR">
    <!--
        为不同的数据库厂商起别名
    -->
    <property name="MySQL" value="mysql"/>
    <property name="Oracle" value="oracle"/>
    <property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
  • databaseIdProvider标签的属性type的值是DB_VENDOR,会通过DatabaseMetaData中的getDatabaseProductName()方法返回的字符串进行设置。由于通常情况下这个字符串非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短。

  • Mybatis的匹配规则如下:

    • ①如果没有配置databaseIdProvider标签,那么databaseId的值就为null。
    • ②如果配置了databaseIdProvider标签,使用标签配置的name去匹配数据库的信息,匹配上设置databaseId=配置指定的值,否则依旧为null。
    • ③如果databaseId不为null,Mybatis只会找到配置databaseId的SQL语句。
    • ④Mybatis会同时加载不带databaseId属性和带有匹配当前数据库databaseId属性的所有语句。如果同时找到带有databaseId和不带databaseId的相同语句,则后者会被舍弃。
  • 示例:

  • mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--
        Mybatis可以使用properties标签来引入外部properties配置文件的内容
            resource属性:引入类路径下的配置文件
            url属性:引入网络或磁盘上的配置文件
    -->
    <properties resource="db.properties"></properties>

    <settings>
        <!-- 开启自动驼峰命名规则映射 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <typeAliases>
        <!--
            通过package标签的name指定需要生成别名的包,默认会创建一个别名,就是类名的小写
        -->
        <package name="com.sunxiaping"/>
    </typeAliases>

    <!--
        environments,Mybatis可以配置多种环境
            environment:配置一个具体的环境信息;必须有transactionManager和dataSource标签。属性id代表当前环境的标识,可以达到快速切换环境
                transactionManager:事务管理器
                    type:事务管理器的类型,有JDBC和MANAGED两种类型,还可以自定义事务管理器
                dataSource:数据源
                    type:数据源的类型,有UNPOOLED、POOLED、JNDI和自定义类型。

    -->
    <environments default="development">
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用${}引入db.properties属性文件中的内容 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用${}引入db.properties属性文件中的内容 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--
        databaseIdProvider:支持多数据库厂商
            type="DB_VENDOR":VendorDatabaseIdProvider
                - 作用: 得到数据库厂商的标识(驱动,Connection接口中的getMetaData()返回了DatabaseMetaData,DatabaseMetaData中有getDatabaseProductName()方法),
                        Mybatis就能数据数据库厂商标识来指定不同的SQL
    -->
    <databaseIdProvider type="DB_VENDOR">
        <!--
            为不同的数据库厂商起别名
        -->
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle"/>
        <property name="SQL Server" value="sqlserver"/>
    </databaseIdProvider>

    <mappers>
        <mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
    </mappers>
</configuration>
  • EmployeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sunxiaping.mapper.EmployeeMapper">

    <select id="findById" resultType="com.sunxiaping.domain.Employee">
        SELECT id,last_name as lastName,email,gender
        FROM employee
        WHERE id = #{id,jdbcType=INTEGER}
    </select>

    <!--
        select标签中databaseId用来指定在那种数据库环境下执行
    -->
    <select id="findById" resultType="com.sunxiaping.domain.Employee" databaseId="mysql">
        SELECT id,last_name as lastName,email,gender
        FROM employee
        WHERE id = #{id,jdbcType=INTEGER}
    </select>
    <!--
        select标签中databaseId用来指定在那种数据库环境下执行
    -->
    <select id="findById" resultType="com.sunxiaping.domain.Employee" databaseId="oracle">
        SELECT id,last_name as lastName,email,gender
        FROM employees
        WHERE id = #{id,jdbcType=INTEGER}
    </select>
</mapper>

9 mapper(映射)

  • mapper逐个注册SQL映射文件
<mappers>
    <mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
</mappers>
  • 使用批量注册:如果有SQL映射文件存在,文件名必须和Mapper接口名相同且必须在同一个目录下
<mappers>
    <package name="com.sunxiaping.mapper"/>
</mappers>
  • 示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--
        Mybatis可以使用properties标签来引入外部properties配置文件的内容
            resource属性:引入类路径下的配置文件
            url属性:引入网络或磁盘上的配置文件
    -->
    <properties resource="db.properties"></properties>

    <settings>
        <!-- 开启自动驼峰命名规则映射 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <typeAliases>
        <!--
            通过package标签的name指定需要生成别名的包,默认会创建一个别名,就是类名的小写
        -->
        <package name="com.sunxiaping"/>
    </typeAliases>

    <!--
        environments,Mybatis可以配置多种环境
            environment:配置一个具体的环境信息;必须有transactionManager和dataSource标签。属性id代表当前环境的标识,可以达到快速切换环境
                transactionManager:事务管理器
                    type:事务管理器的类型,有JDBC和MANAGED两种类型,还可以自定义事务管理器
                dataSource:数据源
                    type:数据源的类型,有UNPOOLED、POOLED、JNDI和自定义类型。

    -->
    <environments default="development">
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用${}引入db.properties属性文件中的内容 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用${}引入db.properties属性文件中的内容 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--
        databaseIdProvider:支持多数据库厂商
            type="DB_VENDOR":VendorDatabaseIdProvider
                - 作用: 得到数据库厂商的标识(驱动,Connection接口中的getMetaData()返回了DatabaseMetaData,DatabaseMetaData中有getDatabaseProductName()方法),
                        Mybatis就能数据数据库厂商标识来指定不同的SQL
    -->
    <databaseIdProvider type="DB_VENDOR">
        <!--
            为不同的数据库厂商起别名
        -->
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle"/>
        <property name="SQL Server" value="sqlserver"/>
    </databaseIdProvider>

    <!--
        mappers将SQL映射注册到全局配置中
    -->
    <mappers>

        <!--
                mapper:注册一个SQL映射
                    - resource:引用类路径下的SQL映射文件
                    - url:引用网络路径下的SQL映射文件
                    - class:引用接口,
                        - 有SQL配置文件,接口和配置文件必须放在同一目录下,且接口名和配置文件的名称必须相同
                        - 没有SQL配置文件,所有的SQL都是利用注解写在接口上
        -->
        <!--  mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>-->
        <!--
                package:批量注册,如果有SQL配置文件,接口和配置文件必须放在同一目录下,且接口名和配置文件的名称必须相同
         -->
        <package name="com.sunxiaping.mapper"/>
    </mappers>

</configuration>
posted @ 2020-09-13 08:58  许大仙  阅读(707)  评论(0编辑  收藏  举报