Mybatis 系列 8:Mybatis 的 typeAlias 别名配置

Mybatis 系列 8:Mybatis 的 typeAlias 别名配置

Mybatis 中的 typeAlias 是什么?以及为什么要有 typeAlias?

先回忆一下,我们之前在 XML 映射文件写查询 SQL 语句的时候:

查询单个用户:

<select id="get" resultType="com.mxz.mybatis.domain.User">
    select id, name, salary from t_user where id = #{id}
</select>

查询多个用户:

<select id="ListAll" resultType="com.mxz.mybatis.domain.User">
    select id, name, salary from t_user
</select>

对于返回的结果集类型,我们用到的时候都是写的全限定名称,如:com.mxz.mybatis.domain.User,很长也很烦。

能不能只写 User 就可以了?

在没配置 typeAlias 别名之前,是不行的,会报 ClassNotFoundException 找不到对应类的错误,配置之后就可以了。

typeAlias 在 Mybatis 官方文档「XML 配置」模块中有如下介绍:

类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

在 Mybatis 全局配置文件 mybatis-config.xml 中配置:

<!-- 类型别名-->
<typeAliases>
    <typeAlias alias="User" type="com.mxz.mybatis.domain.User"/>
</typeAliases>

其中 type 为需要配置别名的类的全限定名称,alias 为对应的别名。

配置好后,可以在映射文件中直接使用别名了:

<select id="get" resultType="User">
    select id, name, salary from t_user where id = #{id}
</select>

resultType 中的 User 就是 User 类 全限定名称 com.mxz.mybatis.domain.User 的别名。

这里还有一个细节:

如果我们把别名写成 user 或者 uSer 时,运行也都是可以的,说明 Mybatis 中的别名是不区分大小写的。

文档中还介绍了为某一个包中的类配置别名:

<!-- 类型别名-->
<typeAliases>
    <package name="com.mxz.mybatis.domain"/>
</typeAliases>

这样在 domain 包下的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名(其实不区分大小写)。

那如果为多个包下的类配置类型别名,但是不同的包下有相同的类名,导致别名对应到的类不唯一,怎么办?

使用注解 @Alias("")

如:

@Alias("User1")
public class User {
    private Long id;
    private String name;
    private BigDecimal salary;
}

别名为其注解值,也就是 User1。

Mybatis 系统自带别名:

基本类型的别名:在前面加下划线_

包装类型(其他类型)别名:首字母小写

例如,使用系统自带的类型别名 int 来接收查询所有的用户量:

<!-- 使用系统自带别名 int -->
<select id="queryForCount" resultType="int">
    select count(1) from t_user
</select>

其中,int 为 Integer 的类型别名。

tips:查看官方文档是学习一门新语言最有效的方法。

系列预告:Mybatis 系列 9:Mybatis 的 properties 配置。

欢迎关注微信公众号「阿泽学长」。

发布于 2019-10-09 16:02