Mybatis技术内幕:初始化之<typeAliases>标签

本文详细解析了MyBatis中&lt;typeAliases&gt;标签的使用方法,包括如何通过typeAliasesElement方法将配置类注册到typeAliasRegistry中,以及如何通过指定包或类来注册别名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<typeAliases>标签读取

typeAliasesElement(XNode parent)方法解析<typeAliases>标签,将配置类注册到typeAliasRegistry

配置文件mybatis-config.xml如下:

<typeAliases>
    <typeAlias alias="BlogAuthor" type="org.apache.ibatis.domain.blog.Author"/>
    <typeAlias type="org.apache.ibatis.domain.blog.Blog"/>
    <typeAlias type="org.apache.ibatis.domain.blog.Post"/>
    <package name="org.apache.ibatis.domain.jpetstore"/>
 </typeAliases>
复制代码

代码如下:

// XMLConfigBuilder.java

private void typeAliasesElement(XNode parent) {
    if (parent != null) {
        // 遍历子节点
        for (XNode child : parent.getChildren()) {
            // 指定为包的情况下,注册包下的每个类
            if ("package".equals(child.getName())) {
                String typeAliasPackage = child.getStringAttribute("name");
                configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);
            // 指定为类的情况下,直接注册类和别名
            } else {
                String alias = child.getStringAttribute("alias");
                String type = child.getStringAttribute("type");
                try {
                    Class<?> clazz = Resources.classForName(type); // 获得类是否存在
                    // 注册到 typeAliasRegistry 中
                    if (alias == null) {
                        typeAliasRegistry.registerAlias(clazz);
                    } else {
                        typeAliasRegistry.registerAlias(alias, clazz);
                    }
                } catch (ClassNotFoundException e) { // 若类不存在,则抛出 BuilderException 异常
                    throw new BuilderException("Error registering typeAlias for '" + alias + "'. Cause: " + e, e);
                }
            }
        }
    }
}

//TypeAliasRegistry.java
public void registerAlias(Class<?> type) {
    //1.得到类的简写名称
    String alias = type.getSimpleName();
    //2.类上是否有@Alias注解 有取定义的属性值
    Alias aliasAnnotation = type.getAnnotation(Alias.class);
    if (aliasAnnotation != null) {
      alias = aliasAnnotation.value();
    }
    registerAlias(alias, type);
  }

public void registerAlias(String alias, Class<?> value) {
    if (alias == null) {
      throw new TypeException("The parameter alias cannot be null");
    }
    // 3.别名小写
    String key = alias.toLowerCase(Locale.ENGLISH);
    // 4.重复别名,且类不同 报异常
    if (TYPE_ALIASES.containsKey(key) && TYPE_ALIASES.get(key) != null && !TYPE_ALIASES.get(key).equals(value)) {
      throw new TypeException("The alias '" + alias + "' is already mapped to the value '" + TYPE_ALIASES.get(key).getName() + "'.");
    }
    TYPE_ALIASES.put(key, value);
}

复制代码

指定 package 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。看下面的例子:

@Alias("author")
public class Author {
    ...
}
复制代码

失控的阿甘,乐于分享,记录点滴

<think>嗯,用户问的是MyBatis中typeAliases的配置和用法。首先,我需要回顾一下MyBatis的基本知识,确保自己理解正确。typeAliases是MyBatis配置文件中的一个标签,用来给Java类型设置别名,这样在映射文件中就可以用短名字代替全限定类名,提高可读性。 根据用户提供的引用内容,引用[2]和[3]详细说明了typeAliases的作用和用法。引用[2]里举了具体的配置例子,用type属性指定类,alias指定别名。而引用[3]可能更深入地解释了标签的使用场景和注意事项。另外,引用[4]中的例子需要注意,同一个alias如果被多次定义可能会有问题,比如例子中两个不同的类型都用了alias="role",这可能会导致冲突,应该指出这是错误示范。 接下来要整理typeAliases的两种配置方式:逐个定义和使用包扫描。逐个定义使用<typeAlias>标签,而包扫描用<package>,这样MyBatis会自动为包下的类注册别名,默认是类名首字母小写,或者通过@Alias注解指定。引用[5]可能提到如何结合mappers使用,但用户的问题集中在typeAliases,所以重点还是配置方法。 然后要考虑用户可能的潜在问题,比如别名的优先级,如果有多个同名的类怎么办,或者如何覆盖默认别名。此外,需要提到MyBatis内置的一些常见类型的别名,比如String对应string,这样用户不需要重复配置。 可能用户在实际配置时遇到的错误,比如拼写错误、包路径错误,或者别名冲突,这些也需要在注意事项里说明。同时,要提醒用户如果在配置时遇到问题,应该检查日志或配置是否正确。 最后,生成相关问题时要围绕typeAliases展开,比如别名的优先级、与XML配置的对比、如何自定义别名等。确保问题能够覆盖用户可能进一步查询的方向。</think>### MyBatis typeAliases 配置及用法详解 #### 1. 基本概念 `typeAliases` 是 MyBatis 核心配置文件(`mybatis-config.xml`)中的标签,**用于为 Java 类型定义简称(别名)**。通过别名可简化 XML 映射文件中参数类型(`parameterType`)或结果类型(`resultType`)的冗长类名[^2][^3]。 --- #### 2. 配置方式 ##### 方式一:逐个定义别名 通过 `<typeAlias>` 标签指定类的全限定名和别名: ```xml <typeAliases> <typeAlias type="com.example.model.User" alias="User"/> <typeAlias type="com.example.model.Order" alias="Order"/> </typeAliases> ``` - `type`: Java 类的全限定名 - `alias`: 自定义的简短名称[^2][^4] ##### 方式二:包扫描自动注册 通过 `<package>` 标签扫描整个包下的类,**自动以类名首字母小写作为别名**: ```xml <typeAliases> <package name="com.example.model"/> </typeAliases> ``` 若需自定义别名,可在类上添加 `@Alias("别名")` 注解[^3][^5]。 --- #### 3. 使用示例 在映射文件中直接使用别名替代全类名: ```xml <select id="getUser" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> ``` --- #### 4. 注意事项 1. **内置别名**:MyBatis 已为常见类型(如 `String` → `string`)预定义别名 2. **冲突处理**:若多个包中存在同名类,需显式定义别名或使用全限定名 3. **优先级**:显式定义的别名优先级高于自动扫描生成的别名[^3] --- #### 5. 常见错误示例 错误配置(重复别名会导致覆盖): ```xml <typeAliases> <typeAlias alias="role" type="com.mybatis.po.Role"/> <typeAlias alias="role" type="com.mybatis.po.User"/> </typeAliases> ``` 此处两个不同类使用了相同别名 `role`,实际运行时后者会覆盖前者。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值