MyBatis学习08-XML配置文件

1 概述

MyBatis 中的 XML 配置文件指的是 mybatis-config.xml,该配置文件主要用于配置 MyBatis 架构的全局性配置内容,可配置如下内容:

  • properties(属性)
  • settings(设置)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境配置)
  • mappers(映射器)

2 配置文件头部声明

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

3 properties(属性)

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。例如:

<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="root"/>
  <property name="password" value="root"/>
</properties>

但该属性使用最多的场景是引用外部的配置文件,如引用外部的数据库相关的配置信息。例如:

1、在 src/main/resources 下中新建 db.properties 的配置文件,文件内容如下:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username=root
password=root

2、在 mybatis-config.xml 中增加如下配置内容:

    <properties resource="db.properties" />

3、在 mybatis-config.xml 后面中的内容就可直接使用 db.properties 配置文件中的配置项:driver/url/username/password,具体使用方式如下:

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

该配置文件中的 properties 的配置项在 MyBatis 代码中的进行设置也可以达到一样的效果,Java 设置内容如下:

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);
// ... 或者 ...
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);

如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:

  • 首先读取在 properties 元素体内指定的属性。
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。

因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。

4 settings(设置)

settings 配置内容是 MyBatis 中极为重要的调整设置,可以把 settings 中的配置理解成 MyBatis 的全局配置,MyBatis 运行过程中的各种判断都依赖于该配置项的内容。

MyBatis 提供的大部分的参数使用默认值即可,下面部分设置是平时开发过程中使用较为频繁的配置项:

设置名描述有效值默认值
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。
特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。
true | falsefalse
useGeneratedKeys允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置
为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持
此特性,但仍可正常工作(如 Derby)。
true | falsefalse
mapUnderscoreToCamelCase是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN
映射到经典 Java 属性名 aColumn
true | falsefalse
localCacheScopeMyBatis 利用本地缓存机制(Local Cache)防止循环引用和加
速重复的嵌套查询。默认值为 SESSION,会缓存一个会话中执行的
所有查询。若设置值为 STATEMENT,
本地缓存将仅用于执行语句,对相同
SqlSession 的不同查询将不会进行缓存。
SESSION | STATEMENTSESSION
returnInstanceForEmptyRow当返回行的所有列都是空时,MyBatis默认返回 null。当开启这
个设置时,MyBatis会返回一个空实例。请注意,它也适用于嵌套
的结果集(如集合或关联)。(新增于 3.4.2)
true | falsefalse
logPrefix指定 MyBatis 增加到日志名称的前缀。任何字符串未设置
logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J | LOG4J |LOG4J2 |
JDK_LOGGING |
COMMONS_LOGGING |
STDOUT_LOGGING |
NO_LOGGING
未设置

对应的配置好的 settings 元素的示例如下:

<settings>
  <setting name="useGeneratedKeys" value="true" />
  <setting name="mapUnderscoreToCamelCase" value="true" />
  <setting name="localCacheScope" value="STATEMENT" />
</settings>

5 typeAliases(类型别名)

类型别名可为 Java 类型设置一个缩写名字。它仅用于 XML 配置,意在降低冗余的全限定类名书写。

更通俗的讲就是 MyBatis 在做结果集或者入参对象映射时,需要找到 bean 对象的全限定类名(包路径+类名)才能精准的进行属性的映射,但全限定类名过长,MyBatis 对些做出了类型别名的设计,即可以给一个全限定类名设定一个别名,在配置文件中配置别名即可最终找到全限定类名。

设置类的全限定类名示例如下:

<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Blog" type="domain.blog.Blog"/>
</typeAliases>

但一个系统中会有大量的 bean 文件,都这样一个文件一个文件的进行配置太过复杂,MyBatis 还支持指定一个包路径进行别名的设置,每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 示例如下:

<typeAliases>
  <package name="domain.blog"/>
</typeAliases>

MyBatis 为 Java 的原始类型的设置了别名,别名及映射的类型如下表格所示:

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

6 typeHandlers(类型处理器)

MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。从 3.4.5 开始,MyBatis 默认支持 JSR-310(日期和时间 API) 。

更通俗的讲就是,JDBC 预处理 SQL 语句(PreparedStatement)时,需要将参数设置进去;在处理 ResultSet 结果集时,需要将结果集中的各个值转换成 Java 中的属性值。这两个过程实际上就是 Java 属性类型与 JDBC 属性类型的相互转换过程。MyBatis 是对 JDBC 的封装,所以 MyBatis 在进行预处理和结果集转换时,也会有 Java 类型与 JDBC 类型的对应转换问题。

对于常见的类型,MyBatis 已经默认进行转换完成,不需要研发人员手动的进行类型处理器的添加(当然目前的代码生成器都会把类型处理器给带上)。常见的内置类型转换器如下所示:

类型处理器Java 类型JDBC 类型
BooleanTypeHandlerjava.lang.Boolean, boolean数据库兼容的 BOOLEAN
ShortTypeHandlerjava.lang.Short, short数据库兼容的 NUMERIC 或 SMALLINT
IntegerTypeHandlerjava.lang.Integer, int数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandlerjava.lang.Long, long数据库兼容的 NUMERIC 或 BIGINT
FloatTypeHandlerjava.lang.Float, float数据库兼容的 NUMERIC 或 FLOAT
DoubleTypeHandlerjava.lang.Double, double数据库兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal数据库兼容的 NUMERIC 或 DECIMAL
StringTypeHandlerjava.lang.StringCHAR, VARCHAR
ClobTypeHandlerjava.lang.StringCLOB, LONGVARCHAR

MyBatis 的类型处理器,除了默认类型的转换,还支持重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。具体可完成类似如下需求:

  1. 数据库存储着枚举类型的字段,如删除状态、性别等内容,数据库存储的是数值类型,但在页面上需要显示的是字符串类型,这种需求可以使用类型处理器进行数值与字符串的转换(当然通常情况下大家都不会这样去处理)。
  2. 数据库中存储着 json 或者 xml 格式的字符串,希望查询出来后可以直接将该字段的内容转换成 bean 对象。这种需求也可以自定义类型处理器进行实现。

7 objectFactory(对象工厂)

每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。

PS:该属性在平时开发系统过程中较少使用。

8 plugins(插件)

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

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

这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 发行包中的源代码。 如果你想做的不仅仅是监控方法的调用,那么你最好相当了解要重写的方法的行为。 因为在试图修改或重写已有方法的行为时,很可能会破坏 MyBatis 的核心模块。 这些都是更底层的类和方法,所以使用插件的时候要特别当心。

更通俗的讲就是,MyBatis 是对 JDBC 各个过程处理的封装,MyBatis 对外提供了4个(插件)位置,允许外部系统对 MyBatis 运行过程中进行拦截处理,以完成更多通用的业务性需求。

插件可以实现的功能有:

  1. 因为分页的过程是通用的,所以可以写一个插件将分页的过程进行封装(如 PageHelper 就是使用插件完成的)。
  2. 打印所有 SQL 的执行时间,统计 SQL 的执行情况。这种需求也可以通过插件来实现。
  3. 做多租户系统时,需要对所有的表字段都增加租户编码的查询条件,可以通过插件来实现。
  4. 业务系统按时间查询不同的数据源时,也可以通过插件进行实现。

9 environments(环境配置)

MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

即环境配置主要是配置数据库连接、数据库连接池相关的内容。

10 mappers(映射器)

MyBatis 在设计上是把 SQL 语句单独放在 XML 文件中进行编写,解析的时候再去 XML 文件中找到对应的 SQL 语句进行预处理与执行,该 XML 文件就叫 XML映射器。MyBatis 在运行过程中需要找到 XML 映射器才能找到对应的 SQL,所以需要在 MyBatis 配置文件(mybatis-config.xml)中配置 XML映射器。

对于 XML映射器的配置可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名进行配置,使用包名进行配置是最常用的做法。示例如下:

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值