天天看点

一起来学习Mybatis(四)-配置文件之typeAliases 元素

前言

  上篇文章分析了MyBatis配置文件中的<properties>元素《一起来学习Mybatis(三)-配置文件之properties 属性》,今天再来了解一个简单却很有用的元素<typeAliases >

一起来学习Mybatis(四)-配置文件之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文档。