持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
全局配置文件
掌握了简单的查询操作之后,我们来看看MyBatis的全局配置文件究竟能做些什么?
引入外部属性文件
还记得我们在全局配置文件中如何配置数据源的吗?
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
这种方式将属性值写死在了配置文件中,显然不是一个好的办法,为此,我们可以使用MyBatis提供的 properties 标签来引入外部的属性文件,所以在类路径下编写一个属性文件(dbconfig.properties):
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mybatis
jdbc.username=root
jdbc.password=123456
此时将该文件引入即可:
<?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 resource="dbconfig.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置数据源 -->
<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>
......
</configuration>
properties 标签有两种方式来引入外部属性文件:
- resource:引入本地属性文件
- url:引入网络属性文件
将属性文件引入后,我们就可以通过 ${键名} 的方式取出属性文件中键名对应的键值,实现数据源的动态配置。
settings
全局配置文件中有一个非常重要的标签: settings ,通过该标签能够设置MyBatis的一些运行时行为,比如我们在入门案例中开启了MyBatis的驼峰命名。
settings标签能够设置非常多的行为,具体列举如下:
| 设置名 | 描述 | 有效值 | 默认值 | |
|---|---|---|---|---|
| cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true |
| lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType属性来覆盖该项的开关状态。 | true | false | false |
| aggressiveLazyLoading | 开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。 | true | false | false (在 3.4.1 及之前的版本中默认为 true) |
| multipleResultSetsEnabled | 是否允许单个语句返回多结果集(需要数据库驱动支持)。 | true | false | true |
| useColumnLabel | 使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。 | true | false | true |
| useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 | true | false | False |
| autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。 | NONE, PARTIAL, FULL | PARTIAL | |
| autoMappingUnknownColumnBehavior | 指定发现自动映射目标未知列(或未知属性类型)的行为。- NONE: 不做任何反应 |
WARNING: 输出警告日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'的日志等级必须设置为WARN)FAILING: 映射失败 (抛出SqlSessionException)
所有属性的默认值,及其各值对应的功能在表中都已详细介绍。
typeAliases
typeAliases意为类型别名,该标签能够为Java类型设置一个缩短的名字,以此方便程序的书写。
比如EmployeeMapper.xml文件中:
<select id="getEmpById" resultType="com.wwj.mybatis.bean.Employee">
select * from tbl_employee where id = #{id}
</select>
resultType的属性值为Employee的全类名,我们可以在全局配置文件中设置Employee的别名:
<typeAliases>
<typeAlias type="com.wwj.mybatis.bean.Employee" alias="emp"/>
</typeAliases>
type属性指定需要设置别名的Java类型,默认别名为类名首字母小写,也可以设置alias属性来指定别名,现在EmployeeMapper.xml文件中就可以简写为:
<select id="getEmpById" resultType="emp">
select * from tbl_employee where id = #{id}
</select>
当我们需要起别名的Java类型过多时,一个一个地进行设置显然不太合理,为此,我们可以使用 package 标签来实现批量起别名,比如:
<typeAliases>
<package name="com.wwj.mybatis.bean"/>
</typeAliases>
此时 com.wwj.mybatis.bean 包及其子包下的所有类都将被设置别名,默认为类名首字母小写;然而别名是不区分大小写的,所以大小写均可。