MyBatis 主配置文件详解

MyBatis 主配置文件详解

MyBatis 主配置文件,即全局配置文件,包含了影响 MyBatis 行为的各种设置与属性信息,其根标签为 <configuration></configuration>,以下所有标签都写在此根标签下。

properties

<properties> 标签用于引入外部资源配置文件,例如,不想在主配置文件中写死数据库连接属性,而写在一个外部文件中,例如 dbconfig.properties,该文件存放于类路径下,内容如下

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=root

主配置文件引入该文件

<properties resource="dbconfig.properties"></properties>

其中,resource 属性用于引入类路径下资源,url 属性用于引入网络资源

则主配置文件中可以使用 ${} 引入外部资源中的内容

<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>

settings

<setrings> 标签非常重要,它可以改变 MyBatis 的运行时行为,其主要设置有

设置参数作用有效值默认值
cacheEnabled关于MyBatis缓存的全局开关true或falseTRUE
lazyLoadingEnabled所有关联对象是否开启懒加载true或falseFALSE
defaultStatementTimeout设置超时时间,即等待数据库响应的秒数任意正整数null
mapUnderscoreToCamelCase是否开启自动驼峰命名映射,即从数据库字段名ABC_COLUMN到Java字段名abcColumn的映射,以实现自动封装true或falseFALSE

例如

<settings>
    <setting name="mapUnderscoreToCamelCase" value="TRUE"/>
</settings>

typeAliases

<typeAliases> 标签用于为 Java 类型设置别名,方便使用,例如

<typeAliases>
    <typeAlias type="cool.yzt.entity.User" alias="user"/>
</typeAliases>

那么,在映射文件中,可以这样使用别名,而不必使用全类名

<insert id="save" parameterType="user">
    insert into User (username,password) value(#{username},#{password})
</insert>

也可以为某一包及其子包下的所有类自动配置别名,默认别名就是leiming,使用 package 标签

<typeAliases>
    <package name="cool.yzt.entity"/>
</typeAliases>

注意

  1. 别名不区分大小写
  2. 可以使用 @Alias 注解为自定义类起别名,例如在 User 类上加注解 @Alias("user")
  3. MyBatis 已经为常见的 Java 内置对象创建了别名,在自定义别名时,不要与之冲突

别名映射.jpg

typeHandlers

TypeHandlers 即类型处理器(类型转换器),无论是 MyBatis 在预处理语句(PreparedStatement)中设置参数,还是从结果集中取出一个值时,都会使用类型处理器 TypeHandler 将获取的值以合适的方式转换成 Java 对象,或反之。简而言之,MyBatis 通过类型处理器进行 Java 类型与 JDBC 类型的互转。

MyBatis 内置的类型处理器包括

类型处理器.jpg

自定义类型处理器

我们可以创建自己的类型处理器来转换原生 MyBatis 不支持的或非标准的类型,以完成特定的需求,例如现在需求一个可以转换 Java Date 类型与 MySQL Long 类型的转换,也就是说 Java 实体类中的字段是 Date 类型,但是使用其 Long 型的时间戳存储在数据库中,要完成这个需求,需要两个步骤

  1. 编写自定义的类型处理器,实现 org.apache.ibatis.type.TypeHandler 接口或者继承 org.apache.ibatis.type.BaseTypeHandler 类,并实现其中的四个方法。
package cool.yzt.utils;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;
import java.util.Date;
// 继承BaseTypeHandler并指明泛型,该泛型就是要转换的Java类
public class MyBatisDateTypeHandler extends BaseTypeHandler<Date> {
    // 实现四个方法,注意这四个方法都是回调方法,供MyBatis自己调用

    // 实现从Java类型到JDBC类型的转换
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
        // setLong方法说明是statement设置long类型的变量,i就是该字段参数的位置
        preparedStatement.setLong(i,date.getTime());
    }

    // 以下三个方法实现从JDBC类型到Java类的转换
    public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
        long time = resultSet.getLong(s);
        return new Date(time);
    }

    public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
        long time = resultSet.getLong(i);
        return new Date(time);
    }

    public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        long time = callableStatement.getLong(i);
        return new Date(time);
    }
}
  1. 在主配置文件中注册该类型处理器
<typeHandlers>
    <typeHandler handler="cool.yzt.utils.MyBatisDateTypeHandler"/>
</typeHandlers>

environments

MyBatis 可以配置多套环境,例如开发、测试、生产环境需要不同的配置,通过 default 属性就可以快速在不同环境之间切换

<environments> 的一个 <environment> 子标签就代表一套环境,由其 id 属性进行唯一标识,其中 <transactionManager><dataSource> 是必须要配置的两个标签。

<!--配置默认运行环境为dev-->
<environments default="dev">
    <!--开发环境-->
    <environment id="dev">
        <!--事务管理器:选择JDBC-->
        <transactionManager type="JDBC"/>
        <!--数据库连接池,type选择pooled即选择池化-->
        <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>

    <environment id="test">
        <!--事务管理器:选择JDBC-->
        <transactionManager type="JDBC"/>
        <!--数据库连接池,type选择pooled即选择池化-->
        <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>

transactionManager

type 属性的可选值为 JDBCMANAGED自定义

  • JDBCJdbcTransactionFactory 的别名,表示使用 JDBC 的提交和回滚设置,即依赖于从数据源的到的连接来管理事务范围
  • MANAGEDManagedTransactionFactory 的别名,表示不提交或回滚一个连接,而是让容器来管理事务的生命周期
  • 自定义:自定义一个类实现 TransactionFactory 接口,将 type 设置为该实现类的全类名或别名

dataSource

type 属性的可选值为 UNPOOLEDPOOLEDJNDI自定义

  • UNPOOLED:不使用连接池
  • POOLED:使用连接池
  • JNDI:在容器中查找指定的数据源
  • 自定义:自定义一个类实现 DataSourceFactory 接口,自定义数据源的获取方式,将 type 设置为该实现类的全类名或别名

注意
实际开发中,我们使用 Spring 整合 MyBatis,并通过 Spring 进行事务控制和管理数据源,覆盖上述的配置

mappers

<mappers> 标签用于注册 SQL 映射文件,可以有以下方式

<mappers>
    <mapper resource="cool/yzt/mapper/UserMapper.xml"/>
    <mapper url="file:///D:/myNote/7.MyBatis/code/mybatisdemo1/src/main/resources/cool/yzt/mapper/UserMapper.xml"/>
    <mapper class="cool.yzt.dao.UserMapper"/>  
</mappers>
  • resource:使用 xml 进行映射,指定 xml 文件的包路径
  • url:使用 xml 进行映射,指定 xml 文件的网络路径或磁盘路径
  • class:一般用于注解方式配置 sql 映射,不推荐使用注解映射,因为 sql 语句依然写在了代码中

databaseIdProvider

MyBatis 可以根据不同的数据库厂商执行不同的语句,在主配置文件中加入以下配置,相当于为不同的数据库起别名,方便在映射文件中使用

<databaseIdProvider type="DB_VENDOR">
    <property name="MySQL" value="mysql"/>
    <property name="Oracle" value="oracle"/>
</databaseIdProvider>

映射文件的 statement 标签可以加入 databaseId 属性,以标识此条 sql 是用于哪种数据库的

<select id="findAll" resultType="user" databaseId="mysql">
    select * from user
</select>

plugins

plagins,即插件,是 MyBatis 提供的一个非常强大的机制,可以通过插件来修改 MyBatis 的一些核心行为,其原理,是通过动态代理机制,接入 MyBatis 四大对象的任何一个方法的执行,四大对象是指 ExecutorParameterHandlerResultSetHandlerStatementHandler

pagehelper 插件

pagehelper 是一款用于简化分页查询操作的插件,在之前,我们都是手动实现一个 PageBean 类,用于封装和分页有关的各个参数,还需要手写 limit 查询语句,进行一些细节的计算,而 pagehelper 插件大大简化了这个过程,要使用 pagehelper,遵循以下步骤

  1. 导入相关依赖
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.11</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.github.jsqlparser/jsqlparser -->
<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>3.1</version>
</dependency>

参考

尚硅谷 MyBatis 教程

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://yzt.cool/archives/mybatis主配置文件详解