XML 映射配置文件
MyBatis 的 XML 配置文件包含了影响 MyBatis 行为甚深的设置和属性信息。 XML 文档 的高层级结
构如下:
•构如下:
• configuration 配置
• properties 属性
• settings 设置
• typeAliases 类型命名
• typeHandlers类型处理器
• objectFactory 对象工厂
• plugins 插件
• environments 环境
• environment 环境变量
• transactionManager 事务管理器
• dataSource 数据源
• databaseIdProviderchinese ?
• mappers 映射器
这些是外部化的, 可替代的属性, 这些属性也可以配置在典型的 Java 属性配置文件中, 或者通过
properties 元素的子元素来传递。例如:
<propertiesresource="org/mybatis/example/config.properties">
<propertyname="username" value="dev_user"/>
<propertyname="password" value="F2Fa3!33TYyg"/>
</properties>
其中的属性就可以在整个配置文件中使用,使用可替换的属性来实现动态配置。比如:
<dataSourcetype="POOLED">
<propertyname="driver" value="${driver}"/>
<propertyname="url" value="${url}"/>
<propertyname="username" value="${username}"/>
<propertyname="password" value="${password}"/>
</dataSource>
如果在这些地方,属性多于一个的话,MyBatis 按照如下的顺序加载它们:
• 在 properties 元素体内指定的属性首先被读取。
• 从类路径下资源或 properties 元素的 url 属性中加载的属性第二被读取,它会 覆盖已经存在的完全一样的属性。
• 作为方法参数传递的属性最后被读取, 它也会覆盖任一已经存在的完全一样的 属性,这些属性可能是从 properties 元素体内和资源/url 属性中加载的。
因此, 最高优先级的属性是那些作为方法参数的, 然后是资源/url 属性, 最后是 properties 元素中指定的属性。
方法参数》》资源/url属性》》properties元素中的属性
这些是极其重要的调整, 它们会修改 MyBatis 在运行时的行为方式。 下面这个表格描述 了设置信息,它们的含义和默认值。
设置参数 |
描述 |
有效值 |
默认值 |
cacheEnabled |
这个配置使全局的映射器启用或禁用 缓存。 |
true | false |
true |
lazyLoadingEnabled |
全局启用或禁用延迟加载。当禁用时, 所有关联对象都会即时加载。 |
true | false |
true |
aggressiveLazyLoading |
当启用时, 有延迟加载属性的对象在被调用时将会完全加载任意属性。否则, 每种属性将会按需要加载。 |
true | false |
true |
multipleResultSetsEnabled |
允许或不允许多种结果集从一个单独 的语句中返回(需要适合的驱动) |
true | false |
true |
useColumnLabel |
使用列标签代替列名。不同的驱动在这表现不同。 参考驱动文档或充分测试两种方法来决定所使用的驱动。 |
true | false |
true |
useGeneratedKeys |
允许 JDBC 支持生成的键。 需要适合的驱动。 如果设置为true 则这个设置强制 生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如 Derby) |
true | false |
true |
autoMappingBehavior |
指定 MyBatis 如何自动映射列到字段/属性。PARTIAL 只NONE,PARTIAL,FULL会自动映射简单, 没有嵌套的结果。FULL会自动映射任 意复杂的结果(嵌套的或其他情况) 。 |
true | false |
true |
defaultExecutorType |
配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句 和批量更新 |
SIMPLE REUSE BATCH |
SIMPLE |
defaultStatementTimeout |
设置超时时间, 它决定驱动等待一个数据库响应的时间。 |
integer |
Null |
callSettersOnNulls |
当结果集中含有Null值时是否执行映射对象的setter或者Map对象的put方法。此设置对于原 始类型如 |
true | false |
false |
还有一些配置详见官方文档。 |
一个设置信息元素的示例,完全的配置如下所示:
<settings>
<settingname="cacheEnabled" value="true"/>
<settingname="lazyLoadingEnabled" value="true"/>
<settingname="multipleResultSetsEnabled" value="true"/>
<settingname="useColumnLabel" value="true"/>
<settingname="useGeneratedKeys" value="false"/>
<settingname="autoMappingBehavior" value="PARTIAL"/>
<settingname="defaultExecutorType" value="SIMPLE"/>
<settingname="defaultStatementTimeout" value="25"/>
<settingname="safeRowBoundsEnabled" value="false"/>
<settingname="mapUnderscoreToCamelCase" value="false"/>
<settingname="localCacheScope" value="SESSION"/>
<settingname="jdbcTypeForNull" value="OTHER"/>
<settingname="lazyLoadTriggerMethods"value="equals,clone,hashCode,toString"/>
</settings>
类型别名是为 Java 类型设置一个短的名字。它只和XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:
<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的地方。
也可以指定一个包名,MyBatis会在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean的首字母小写的非限定类名来作为它的别名。比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。看下面的例子:
@Alias("author")
public class Author {
...
}
已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。
无论是 MyBatis 在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成Java类型。下面这个表格描述了默认的类型处理器。详见官方文档:http://www.mybatis.org/mybatis-3/zh/configuration.html#settings
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
//ExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)
publicclass ExampleTypeHandler extends BaseTypeHandler<String> {
@Override
publicvoid setNonNullParameter(PreparedStatement ps, int i, String parameter,JdbcType
jdbcType)throws SQLException {
ps.setString(i,parameter);
}
@Override
publicString getNullableResult(ResultSet rs, String columnName) throws SQLException {
returnrs.getString(columnName);
}
@Override
publicString getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
returnrs.getString(columnIndex);
}
@Override
publicString getNullableResult(CallableStatement cs, int columnIndex) throwsSQLException {
returncs.getString(columnIndex);
}
}
<!--mybatis-config.xml -->
<typeHandlers>
<typeHandlerhandler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
MyBatis 每次创建结果对象新的实例时, 它使用一个 ObjectFactory 实例来完成。 如果参 数映射存在,默认的 ObjectFactory 不比使用默认构造方法或带参数的构造方法实例化目标 类做的工作多。如果你想重写默认的ObjectFactory,你可以创建你自己的。
ObjectFactory 接口很简单。它包含两个创建用的方法,一个是处理默认构造方法的,另 外一个是处理带参数构造方法的。最终,setProperties 方法可以被用来配置 ObjectFactory。 在 初 始化 你的 ObjectFactory 实例 后 , objectFactory 元素 体 中定 义的 属 性会 被传 递 给setProperties 方法。