目录
1 MyBatis 全局配置文件
2 properties 元素
3 setting 设置
4 typeAlianses 别名处理器
5 typeHandler 类型处理器
6 objectFacotry 对象工厂(了解)
7 plugins 插件(了解)
8 environments 运行环境
9 databaseIdProvider 数据库厂商(了解)
10 mapper 加载 SQL 映射文件
11 参考文档
1 MyBatis 全局配置文件
MyBatais 全局配置文件所有配置项如下所示,配置项只能按照如下顺序进行设置
<?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> <!--配置--><properties/> <!--属性--><settings/> <!--全局配置参数--><typeAliases/> <!--类型别名--><typeHandlers/> <!--类型处理器--><objectFactory/><!--对象工厂--><plugins/><!--创建--><environments default=""><!--环境配置--><environment id=""><!--环境变量--><transactionManager type=""/><!--事务管理器--><dataSource type=""/><!--数据源--></environment></environments><databaseIdProvider type=""/><!--数据库厂商标识--><mappers/><!--映射器-->
</configuration>
2 properties 元素
mysql.properties 配置文件
url=jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
name=root
password=123456
driver=com.mysql.cj.jdbc.Driver
通过 properties 元素导入 mysql.properties 配置文件,会在当前配置文件所在目录下查找 mysql.properties 配置文件
<properties resource="mysql.properties" />
此外,也可以用 properties 元素的 url 属性来指定属性文件的 URL
<!-- 指定一个网络上的属性文件 -->
<properties url="http://example.com/jdbc.properties" /><!-- 指定一个位于本地文件系统中的属性文件 -->
<properties url="file:///path/to/config.properties" />
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照如下顺序来加载:
- 在 properties 元素体内指定的属性首先被读取
<properties><!--property子元素定义--><property name="database.driver" value="com.mysql.cj.jdbc.Driver"/><property name="database.url" value="jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/><property name="database.username" value="root"/><property name="database.password" value="123456"/>
</properties>
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性
- 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性
// 加载数据库配置文件
is = Resources.getResourceAsStream("msyql.properties");
Properties properties = new Properties();
properties.load(is);// 获取加密信息
String username= properties.getProperty("database.username");
String password= properties.getProperty("database.password");// 解密用户名和密码,并重置属性
properties.setProperty("database.username", CyperTool.decodeByBase64(username));
properties.setProperty("database.password", CyperTool.decodeByBase64(password));
3 setting 设置
setting 设置是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。但是大部分情况下使用默认值便可以运行,所以在大部分情况下不需要大量配置,只需要修改一些常用的规则即可。常用规则有自动映射、驼峰命名映射、级联规则、是否启动缓存、执行器类型等。
<settings><!--缓存配置的全局开关:如果这里设置成false,那么即便在映射器中配置开启也无济于事 --><setting name="cacheEnabled" value="true" /><!--延时加载的全局开关 --><setting name="lazyLoadingEnabled" value="false" />
</settings>
属性名 | 含义 | 简介 | 有效值 | 默认值 |
---|---|---|---|---|
cacheEnabled | 是否使用缓存 | 是整个工程中所有映射器配置缓存的开关,即是一个全局缓存开关 | true | false | true |
lazyLoadingEnabled | 是否开启延迟加载 | 控制全局是否使用延迟加载。当有特殊关联关系需要单独配置时,可以使用 fetchType 属性来覆盖此配置 | true | false | false |
aggressiveLazyLoading | 是否按需加载属性 | 开启时,不论调用什么方法加载某个对象,都会加载该对象的所有属性,关闭后只会按需加载 | true | false | false |
multipleResultSetsEnabled | 是否允许单一语句返回多结果集 | 即 Mapper 配置中一个单一的 sql 配置是否能够返回多个结果集 | true | false | true |
useColumnLabel | 使用列标签代替列名 | 设置是否使用列标签代替列名 | true | false | true |
useGenerateKeys | 是否支持 JDBC 自动生成主键 | 设置之后,将会强制使用自动生成主键的策略 | true | false | false |
autoMappingBehavior | 指定 MyBatis 自动映射字段或属性的方式 | 有三种方式,NONE 时将取消自动映射;PARTIAL 时只会自动映射没有定义结果集的结果映射;FULL 时会映射任意复杂的结果集 | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 设置当自动映射时发现未知列的动作 | 有三种动作,NONE 时不做任何操作;WARNING 时会输出提醒日志;FALLING 时会抛出 SqlSessionException 异常表示映射失败 | NONE, WARNING, FALLING | NONE |
defaultExecutorType | 设置默认的执行器 | 有三种执行器,SIMPLE 为普通执行器;REUSE 执行器会重用处理语句;BATCH 执行器将重用语句并执行批量更新 | SIMPLE, REUSE, BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间 | 该超时时间即数据驱动连接数据库时,等待数据库回应的最大秒数 | 任意正整数 | 无 |
defaultFetchSize | 设置驱动的结果集 | 为了防止从数据库查询出来的结果过多,而导致内存溢出,可以通过设置 fetchSize 参数来控制结果集的数量 | 任意正整数 | 无 |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页,RowBound,即行内嵌套语句 | 如果允许在 sql 的行内嵌套语句中使用分页,就设置该值为 false | true | false | false |
safeResultHandlerEnabled | 允许在嵌套语句中使用分页,ResultHandler,即结果及处理 | 如果允许对 sql 的结果集使用分页,就设置该值为 false | true | false | true |
mapUnderscoreToCamelCase | 是否开启驼峰命名规则映射 | 表名数据库中的字段名称与工程中 Java 实体内的映射是否采用驼峰命名规则校验 | true | false | false |
localCacheScope | MyBatis 利用本地缓存机制防止循环引用和加速重复嵌套查询 | 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | JDBC 类型的默认设置 | 当没有参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER | 常用 NUL、VARCHAR、OTHER | OTHER |
lazyLoadTriggeerMethods | 指定哪个对象的方法触发一次延迟加载 | 配置需要触发延迟加载的方法的名字,该方法就会触发一次延迟加载 | 一个逗号分隔的方法名称列表 | equals, clone, hashCode, toString |
defaultScriptingLanguage | 动态 sql 默认语言 | 指定动态 sql 生成的默认语言 | 一个类型的的别名或者一个类的全类名 | org.apache.ibatis. scripting.xmltargs. XMLLanguageDriver |
callSettersOnNulls | 是否在空值情况下调用 Set 方法 | 指定当结果集中的值为 null 时是否调用映射对像的 setter (map 对象为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化是有用的。注意基本类型不能设置为 null | true | false | false |
returnInstanceForEmptyRow | 返回空实体集对象 | 当返回行的所有列都是空时,MyBatis 默认返回 null。当开启这个设置时,MyBatis 会返回一个空实例。此外,从 MyBatis 3.4.2 开始,它也适用于嵌套的结果集 | true | false | false |
logImpl | 日志实现 | 指定 MyBatis 所用日志的具体实现,为指定时将自动查找 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 无 |
proxyFactory | 代理工厂 | 指定 MyBatis 创建具有延迟加载能力的对象所用到的代理工具 | CGLIB | JAVASSIST | JAVASSIST |
vfsImpl | vfs 实现 | 指定 vfs 的实现 | 自定义 VFS 实现类的全类名,以逗号分割 | 无 |
useActualParamName | 使用方法签名 | 允许使用方法签名中的名称作为语句参数名称。要使用该特性,工程必须采用 Java8 编译,并且加上 -parameters 选项(从 MyBatis 3.4.1 版本开始) | true | false | false |
configurationFactory | 配置工厂 | 指定提供配置实例的类。返回的配置实例用于加载反序列化的懒加载参数。这个类必须有一个签名的静态配置 getconfiguration() 方法(从 MyBatis 3.2.3 版本开始) | 一个类型别名或者一个类的全类名 | 无 |
4 typeAlianses 别名处理器
typeAliases 可以给类设置别名,这样当我们需要使用类时,可以不用每次都写那么复杂的全类名 (com.pojo.User)
<!--设置别名-->
<typeAliases><!--对类单独进行别名设置 --><typeAlias alias="user" type="com.pojo.User"></typeAlias><typeAlias alias="student" type="com.pojo.Student"></typeAlias>
</typeAliases>
批量给类设置别名,为包中的每一个类设置别名,设置规则是:获取类名称,将其第一个字母变为小写
<!--设置别名-->
<typeAliases><!-- 对包进行扫描,可以批量进行别名设置,设置规则是:获取类名称,将其第一个字母变为小写 --><package name="com.pojo1"/><package name="com.pojo2"/><package name="com.pojo3"/>
</typeAliases>
通过 @Alias 注解设置别名
@Alias("user")
public class User {省略......
}
需要注意的是,MyBatis 已经为某些类定义了别名,此外,别名对大小写不敏感。对此,为某些类定义别名时,不能占用已有别名
5 typeHandler 类型处理器
在 typeHandler 类型处理器中,包含 javaType 和 jdbcType 两种类型,其中 javaType 用来定义 Java 类型,jdbcType 用来定义数据库类型,而 typeHandler 的作用就是对 javaType 和 jdbcType 两种类型进行转换,如下图所示:
下图是 MyBatis 已经定义好的部分类型处理器,当然,我们也可以自定义类型处理器,此处不做介绍
6 objectFacotry 对象工厂(了解)
objectFacotry 表示为对象工厂。对象工厂我们只需了解即可,因为到时候与 Spring 整合后,都会由 Spring 来管理。我们知道,在 JDBC 中查询的结果会保存在一个结果集中,而 MyBatis 也是这样,它会使用其定义的对象工厂 DefaultObjectFactory 来将查询的结果保存在结果集中。
7 plugins 插件(了解)
plugins 插件是 MyBatis 提供的一个非常强大的机制。通过插件,我们可以在不修改 MyBatis 核心代码的情况下,对其核心行为进行修改。利用动态代理机制,插件能够介入到四大对象(Mapper Interface、Mapped Statement、Parameter Map 和 ResultSet Handler)的任何一个方法的执行过程中。
8 environments 运行环境
environments 标签用于指定当前运行环境,在 MyBatis 中可以配置多种环境,比如开发、测试和生产环境。每种环境使用一个 environment 标签进行配置并指定唯一标识符,可以通过 environments 标签中的 default 属性指定一个环境的标识符来快速的切换环境,environment 标签里面分为两个可配置的标签:事务管理 (transactionManager)、数据源 (DataSource)。而在我们的日常开发中,这些都会交给 Spring 来管理,不用在全局配置中编写。
transactionManager
transactionManager 配置事务管理器类型,type = JDBC | MANAGED | 自定义(type=全类名或别名)
- JDBC 使用 JdbcTransactionFactory 工厂生成的 JdbcTransaction 对象实现,以 JDBC 的方式进行数据库的提交、回滚等操作,它依赖于从数据源得到的连接来管理事务范围
- MANAGED 使用 ManagedTransactionFactory 工厂生成的 ManagedTransaction 对象实现,它的提交和回滚不需要任何操作,而是把事务交给容器进行处理,默认情况下会关闭连接,如果不希望默认关闭,只要将其中的 closeConnection 属性设置为 false 即可
- 自定义的事务管理类型需要实现 TransactionFactory 接口
DataSource
在 MyBatis 中,数据库是通过 PooledDataSourceFactory、UnpooledDataSourceFactory 和 JndiDataSourceFactory 三个工厂类来提供,前两者分别产生 PooledDataSource 和 UnpooledDataSource 类对象,第三个则会根据 JNDI 的信息获得外部容器实现的数据库连接对象,总之,它们最后都会生成一个实现了 DataSource 接口的数据库连接对象。
type = UNPOOLED | POOLED | JNDI | 自定义
UNPOOLED
UNPOOLED 采用非数据库池的管理方式,每次请求都会新建一个连接,所以性能不是很高,使用这种数据源的时候,UNPOOLED 类型的数据源可以配置以下属性:
- driver:数据库驱动名
- url:数据库连接 URL
- username:用户名
- password:密码
- defaultTransactionIsolationLevel:默认的事务隔离级别,如果要传递属性给驱动,则属性的前缀为 driver
POOLED
POOLED 采用连接池的概念将数据库链接对象 Connection 组织起来,可以在初始化时创建多个连接,使用时直接从连接池获取,避免了重复创建连接所需的初始化和认证时间,从而提升了效率,所以这种方式比较适合对性能要求高的应用中。除了 UNPOOLED 中的配置属性之外,还有以下几个修改连接池的配置:
-
poolMaximumActiveConnections:用于设置连接池中允许的最大活跃连接数。超过这个数量的连接将会被阻塞,直到有连接被释放为止,默认值为 10
-
poolMaxmumIdleConnections:用于设置连接池中允许的最大空闲连接数。当连接池中的连接数量超过这个值时,多余的连接将会被释放,默认值为 5
-
poolMaxmumCheckoutTime:用于设置连接在连接池中的最大使用时间。超过这个时间的连接将会被强制回收,默认值为 20000 毫秒(即 20 秒)
-
poolTimeToWait:用于设置从连接池中获取连接时的最大等待时间。如果在这个时间内无法获取到连接,将会抛出超时异常,默认值为 20000 毫秒(即 20 秒)
JNDI
数据源 JNDI 的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这种数据源只需配置两个属性:
- initial_context:用来在 InitialContext 中寻找上下文。可选,如果忽略,data_source 属性将会直接从 InitialContext 中寻找
- data_source:引用数据源实例位置上下文的路径。当提供 initial_context 配置时,data_source 会在其返回的上下文进行查找,否则直接从 InitialContext 中查找
9 databaseIdProvider 数据库厂商(了解)
databaseIdProvider 元素主要是为了支持不同厂商的数据库,这个元素不常用。
<!--数据库厂商标示 -->
<databaseIdProvider type="DB_VENDOR"><property name="Oracle" value="oracle"/><property name="MySQL" value="mysql"/><property name="DB2" value="d2"/>
</databaseIdProvider>
以下是 databaseIdProvider 中的属性介绍:
- Type:DB_VENDOR,使用 MyBatis 提供的 VendorDatabaseIdProvider 解析数据库厂商标识。也可以实现 DatabaseIdProvider 接口来自定义
- Property-name:数据库厂商标识
- Property-value:为数据库厂商标识起一个别名,方便 SQL 语句使用 databaseId 属性引用
设置了以上配置,我们就可以在自己的 sql 语句中使用属性 databaseId 来标示数据库类型
<!-- 查询所有用户 -->
<select id="selectAllUser" resultType="com.entity.User" databaseId="oracle">select * from t_user
</select>
10 mapper 加载 SQL 映射文件
mapper 用来加载配置的 SQL 映射文件,它有以下四种加载方式:
- 用文件路径引入
- 使用 URL 方式引入
- 用类注册引入
- 用包名引入(推荐)
<mappers><!-- 用文件路径引入,这种方式是相对路径,相对于项目目录下 --><mapper resource="com/mapper/UserMapper.xml" /><!-- 使用 URL 方式引入,这种方式是绝对路径,就是从我们的磁盘读取映射文件,一般不会使用这种方式 --><mapper url="D:/xxx/com/mapper/UserMapper.xml" /><!-- 用类注册引入,若使用这种方式,Mapper接口的名称必须与映射文件的名称相同,并且要在同一个包名下,否则会找不到。如:UserMapper.java(接口)—UserMapper.xml(映射文件) --><mapper class="com.mapper.UserMapper" /><!-- 用包名引入(推荐),这种方式的要求同样是Mapper接口和Mapper的映射文件的名称要相同,并且要放在相同的包名下,否则会导致找不到 --><package name="com.mapper"/>
</mappers>
11 参考文档
尚硅谷文档
MyBatis 配置 setting 详解
Mybatis3详解(三)----Mybatis全局配置文件详解 - 唐浩荣 - 博客园 (cnblogs.com)