前言 |
上篇文章分析了MyBatis配置文件中的<properties>元素《一起来学习Mybatis(三)-配置文件之properties 属性》,今天再来了解一个简单却很有用的元素<typeAliases >
分析 |
typeAliases即是类型别名,是为 Java 类型设置一个短的名字。它只在 XML 配置文件中起作用,来缩减长长的类型名称。比如:
<select id="selectUserByID" resultType="com.test.entity.UserEntity">
这里的resultType需要使用包含完全路径的类名,如果使用typeAliases申明类型别名,会非常简单、方便。
<typeAliases>
<typeAlias alias="User" type="com.test.entity.UserEntity"/>
</typeAliases>
SQL Mapper只需要:
<select id="selectUserByID" resultType="User">
看到这里,肯定会有疑问:难道类型别名只能一个一个的进行申明吗?如果有很多个岂不是很麻烦。MyBatis为了解决这个问题,还允许指定报名。
<typeAliases>
<package name="com.test.entity"/>
</typeAliases>
MyBatis 会在 com.test.entity 包名下面搜索需要的实体类,默认会使用首字母小写的类名来作为它的别名。SQL Mapper可以这样用:
<select id="selectUserByID" resultType="userEntity">
当然,除了在XML配置文件中配置别名,还可以使用注解的方式为POJO设置别名(在使用了package元素的情况下,注解方式配置的别名优先):
import org.apache.ibatis.type.Alias;
@Alias("User")
public class UserEntity {}
源码 |
XML文件中的typeAliases元素是由 typeAliasesElement方法来解析的。
typeAliasesElement(root.evalNode("typeAliases"));
进入typeAliasesElement方法体:
private void typeAliasesElement(XNode parent) {
if (parent != null) {
for (XNode child : parent.getChildren()) {
//解析package元素
if ("package".equals(child.getName())) {
String typeAliasPackage = child.getStringAttribute("name");
configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);
} else {
//解析typeAlias元素
String alias = child.getStringAttribute("alias");
String type = child.getStringAttribute("type");
try {
Class<?> clazz = Resources.classForName(type);
if (alias == null) {
typeAliasRegistry.registerAlias(clazz);
} else {
typeAliasRegistry.registerAlias(alias, clazz);
}
} catch (ClassNotFoundException e) {
throw new BuilderException("Error registering typeAlias for '" + alias + "'. Cause: " + e, e);
}
}
}
}
}
小结 |
MyBatis已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,具体列表可以查看MyBatis文档。