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 配置。
欢迎关注微信公众号「阿泽学长」。