学习Mybatis框架(四)— XML 映射配置文件(SqlMapConfig.xml)
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息。文档的顶层结构如下:
编写时一定按照这个顺序从上到下编写
properties属性
这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。
举例:
将数据库连接参数单独配置在db.properties中,只需要在SqlMapConfig.xml中加载db.properties的属性值。在SqlMapConfig.xml中就不需要对数据库连接参数硬编码。
将数据库连接参数(可能变化)只配置在db.properties中,
原因:方便对参数进行统一管理,其它xml可以共享引用该db.properties。
db.properties文件:
在sqlMapConfig.xml加载属性文件:
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
- 在 properties 元素体内指定的属性首先被读取。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
- 最后读取parameterType传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。
建议:
不要在properties元素体内添加任何属性值(优先级最低),只将属性值定义在properties文件中。
在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX比如jdbc.username
Settings配置
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
举几个例子
一个配置完整的 settings 元素的示例如下:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
typeAliases类型别名
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:
自定义别名
1、单个别名定义
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
当这样配置时,Blog可以用在任何使用domain.blog.Blog的地方。
2、批量别名定义(推荐)
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。
比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。看下面的例子:
@Alias("author")
public class Author {
...
}
3.举例说明
如果在SqlMapConfig.xml配置文件添加如下配置信息:
那么我们就可以在mapper.xml映射文件中使用这个别名了,如下:
常见的 Java 类型内建的相应的类型别名
它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
附上SqlMapConfig.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">
<configuration>
<!-- 外部配置db.properties动态替换 value-->
<properties resource="db.properties">
<!--properties中还可以配置一些属性名和属性值 -->
<!-- <property name="jdbc.driver" value=""/> -->
</properties>
<settings>
<!-- 开启延迟加载,注意必须写在前面 -->
<!-- 打开延迟加载开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消极加载即是按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 别名定义 -->
<typeAliases>
<!-- 针对单个别名定义
type:类型的路径; alias:别名 -->
<!-- <typeAlias type="cn.itcast.mybatis.pojo.User" alias="user"/> -->
<!-- 批量别名定义
指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)-->
<package name="cn.itcast.mybatis.pojo"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池,由mybatis管理-->
<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>
<!-- 加载映射文件 -->
<mappers>
<!-- 1、通过resource加载单个映射文件 -->
<mapper resource="sqlmap/User.xml" />
<!-- 2、通过mapper接口加载单个映射文件————class="mapper接口全限定名"
遵循规范:a)使用的是mapper代理方法
b)需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中 -->
<!--
<mapper class="cn.itcast.mybatis.mapper.UserMapper" />
-->
<!--3、批量加载mapper映射文件————name="mapper接口所在的包名",mybatis自动扫描包下边所有mapper接口进行加载
遵循规范:a)使用的是mapper代理方法
b)需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中-->
<package name="cn.itcast.mybatis.mapper"/>
</mappers>
</configuration>