MyBatis 中的 XML 配置文件指的是 mybatis-config.xml,该配置文件主要用于配置 MyBatis 架构的全局性配置内容,可配置如下内容:
在 mybatis-config.xml 配置文件中,需要进行头部的声明,声明内容如下:
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 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 中增加如下配置内容:
3、在 mybatis-config.xml 后面中的内容就可直接使用 db.properties 配置文件中的配置项:driver/url/username/password,具体使用方式如下:
该配置文件中的 properties 的配置项在 MyBatis 代码中的进行设置也可以达到一样的效果,Java 设置内容如下:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);
// ... 或者 ...
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);
如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。
settings 配置内容是 MyBatis 中极为重要的调整设置,可以把 settings 中的配置理解成 MyBatis 的全局配置,MyBatis 运行过程中的各种判断都依赖于该配置项的内容。
MyBatis 提供的大部分的参数使用默认值即可,下面部分设置是平时开发过程中使用较为频繁的配置项:
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 |
true | false | false |
useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置 为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持 此特性,但仍可正常工作(如 Derby)。 |
true | false | false |
mapUnderscoreToCamelCase | 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn |
true | false | false |
localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加 速重复的嵌套查询。默认值为 SESSION,会缓存一个会话中执行的 所有查询。若设置值为 STATEMENT, 本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。 |
SESSION | STATEMENT | SESSION |
returnInstanceForEmptyRow | 当返回行的所有列都是空时,MyBatis默认返回 null。当开启这 个设置时,MyBatis会返回一个空实例。请注意,它也适用于嵌套 的结果集(如集合或关联)。(新增于 3.4.2) |
true | false | false |
logPrefix | 指定 MyBatis 增加到日志名称的前缀。 | 任何字符串 | 未设置 |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J |LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING |
未设置 |
对应的配置好的 settings 元素的示例如下:
类型别名可为 Java 类型设置一个缩写名字。它仅用于 XML 配置,意在降低冗余的全限定类名书写。
更通俗的讲就是 MyBatis 在做结果集或者入参对象映射时,需要找到 bean 对象的全限定类名(包路径+类名)才能精准的进行属性的映射,但全限定类名过长,MyBatis 对些做出了类型别名的设计,即可以给一个全限定类名设定一个别名,在配置文件中配置别名即可最终找到全限定类名。
设置类的全限定类名示例如下:
但一个系统中会有大量的 bean 文件,都这样一个文件一个文件的进行配置太过复杂,MyBatis 还支持指定一个包路径进行别名的设置,每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 示例如下:
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 |
iterator | Iterator |
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 类型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean, boolean | 数据库兼容的 BOOLEAN |
ShortTypeHandler | java.lang.Short, short | 数据库兼容的 NUMERIC 或 SMALLINT |
IntegerTypeHandler | java.lang.Integer, int | 数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long, long | 数据库兼容的 NUMERIC 或 BIGINT |
FloatTypeHandler | java.lang.Float, float | 数据库兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler | java.lang.Double, double | 数据库兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler | java.math.BigDecimal | 数据库兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler | java.lang.String | CHAR, VARCHAR |
ClobTypeHandler | java.lang.String | CLOB, LONGVARCHAR |
MyBatis 的类型处理器,除了默认类型的转换,还支持重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。具体可完成类似如下需求:
每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。
PS:该属性在平时开发系统过程中较少使用。
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 发行包中的源代码。 如果你想做的不仅仅是监控方法的调用,那么你最好相当了解要重写的方法的行为。 因为在试图修改或重写已有方法的行为时,很可能会破坏 MyBatis 的核心模块。 这些都是更底层的类和方法,所以使用插件的时候要特别当心。
更通俗的讲就是,MyBatis 是对 JDBC 各个过程处理的封装,MyBatis 对外提供了4个(插件)位置,允许外部系统对 MyBatis 运行过程中进行拦截处理,以完成更多通用的业务性需求。
插件可以实现的功能有:
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
即环境配置主要是配置数据库连接、数据库连接池相关的内容。
MyBatis 在设计上是把 SQL 语句单独放在 XML 文件中进行编写,解析的时候再去 XML 文件中找到对应的 SQL 语句进行预处理与执行,该 XML 文件就叫 XML映射器。MyBatis 在运行过程中需要找到 XML 映射器才能找到对应的 SQL,所以需要在 MyBatis 配置文件(mybatis-config.xml)中配置 XML映射器。
对于 XML映射器的配置可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名进行配置,使用包名进行配置是最常用的做法。示例如下: