类型别名是为 Java 类型设置一个短的名字。 它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
示例如下:
修改resultType测试
<select id="selectById" resultType="com.pss.mybatis_spring.model.SysUser">
select * from sys_user where user_id = #{userId}
</select>
改成
<select id="selectById" resultType="sysUser">
select * from sys_user where user_id = #{userId}
</select>
Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias 'SysUser'. Cause: java.lang.ClassNotFoundException: Cannot find class: SysUser
at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:120) ~[mybatis-3.4.4.jar:3.4.4]
at org.apache.ibatis.builder.BaseBuilder.resolveAlias(BaseBuilder.java:149) ~[mybatis-3.4.4.jar:3.4.4]
at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:116) ~[mybatis-3.4.4.jar:3.4.4]
... 89 common frames omitted
Caused by: java.lang.ClassNotFoundException: Cannot find class: SysUser
at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:200) ~[mybatis-3.4.4.jar:3.4.4]
at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:89) ~[mybatis-3.4.4.jar:3.4.4]
at org.apache.ibatis.io.Resources.classForName(Resources.java:261) ~[mybatis-3.4.4.jar:3.4.4]
at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:116) ~[mybatis-3.4.4.jar:3.4.4]
... 91 common frames omitted
报错了说明SysUser没有生效,接下来再<configuration>中加入别名标签
<typeAliases>
<typeAlias alias="sysUser" type="com.pss.mybatis_spring.model.SysUser"/>
</typeAliases>
再次运行,运行成功
DEBUG [http-nio-8080-exec-1] - JDBC Connection [com.mysql.jdbc.JDBC4Connection@5436cb7d] will not be managed by Spring
DEBUG [http-nio-8080-exec-1] - ==> Preparing: select * from sys_user where user_id = ?
DEBUG [http-nio-8080-exec-1] - ==> Parameters: 10001(Long)
DEBUG [http-nio-8080-exec-1] - <== Total: 1
DEBUG [http-nio-8080-exec-1] - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4d0ace18]
还有另一种写法是使用package,每一个在 com.pss.mybatis_spring.model 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。比如 com.pss.mybatis_spring.model.SysUser 的别名为 sysUser;若有注解,则别名为其注解值。
// 添加实体包名路径
<typeAliases>
<package name="com.pss.mybatis_spring.model"/>
</typeAliases>
再次运行,运行成功
经过我的重复测试,官方文档给出的是“首字母小写的非限定类名来作为它的别名”,而我测试SYSUSEr字母不区分大小写都是可以识别的。但是实际开发中还是按照官方文档的规则来。
<select id="selectById" resultType="SYSUSEr">
select * from sys_user where user_id = #{userId}
</select>
修改别名再次测试,这次识别不了sysUser2。
<select id="selectById" resultType="sysUser2">
select * from sys_user where user_id = #{userId}
</select>
在实体加上@Alias注解别名后 ,执行成功
// 在实体添加注解@Alias
@Data
@Alias("sysUser2")
public class SysUser {
private Long userId;
}
mybatis已给出的默认别名如下:
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |