Mybatis配置文件之别名配置元素解析
1. 概述
别名是一个指代的名称,因为我们遇到类型全限定名过长时希望用一个简短的名称去指代它,而这个名称可以在mybatis上下文中使用。别名在mybatis里面分为系统定义别名和自定义别名两类,注意,在mybatis中别名是不区分大小写的。一个typeAliases的实例是在解析配置文件时生成的,然后长期保存在Configuration对象中,当我们使用它时,再把它取出来,这样就没必要运行的时候再次生成它的实例了。如下是配置一个别名:
<typeAliases>
<typeAlias type="com.yhl.mybatis.model.User" alias="user"/>
</typeAliases>
2. 系统定义别名
mybatis系统的定义了一些经常使用的类型的别名,如数值、字符串、日期和集合等,我们在使用mybatis的时候可以直接使用它们,如下所示:
2.1 常见的内建类型别名
这是一些为常见的 Java 类型内建的相应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。
别名 | 映射的类型 |
---|---|
_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 |
2.2. 内建别名源码
我们通过mybatis源码可以了解到,系统内建的别名是在TypeAliasRegistry类中,如下
public TypeAliasRegistry() {
registerAlias("string", String.class);
registerAlias("byte", Byte.class);
registerAlias("long", Long.class);
registerAlias("short", Short.class);
registerAlias("int", Integer.class);
registerAlias("integer", Integer.class);
registerAlias("double", Double.class);
registerAlias("float", Float.class);
registerAlias("boolean", Boolean.class);
registerAlias("byte[]", Byte[].class);
registerAlias("long[]", Long[].class);
registerAlias("short[]", Short[].class);
registerAlias("int[]", Integer[].class);
registerAlias("integer[]", Integer[].class);
registerAlias("double[]", Double[].class);
registerAlias("float[]", Float[].class);
registerAlias("boolean[]", Boolean[].class);
registerAlias("_byte", byte.class);
registerAlias("_long", long.class);
registerAlias("_short", short.class);
registerAlias("_int", int.class);
registerAlias("_integer", int.class);
registerAlias("_double", double.class);
registerAlias("_float", float.class);
registerAlias("_boolean", boolean.class);
registerAlias("_byte[]", byte[].class);
registerAlias("_long[]", long[].class);
registerAlias("_short[]", short[].class);
registerAlias("_int[]", int[].class);
registerAlias("_integer[]", int[].class);
registerAlias("_double[]", double[].class);
registerAlias("_float[]", float[].class);
registerAlias("_boolean[]", boolean[].class);
registerAlias("date", Date.class);
registerAlias("decimal", BigDecimal.class);
registerAlias("bigdecimal", BigDecimal.class);
registerAlias("biginteger", BigInteger.class);
registerAlias("object", Object.class);
registerAlias("date[]", Date[].class);
registerAlias("decimal[]", BigDecimal[].class);
registerAlias("bigdecimal[]", BigDecimal[].class);
registerAlias("biginteger[]", BigInteger[].class);
registerAlias("object[]", Object[].class);
registerAlias("map", Map.class);
registerAlias("hashmap", HashMap.class);
registerAlias("list", List.class);
registerAlias("arraylist", ArrayList.class);
registerAlias("collection", Collection.class);
registerAlias("iterator", Iterator.class);
registerAlias("ResultSet", ResultSet.class);
}
3. 自定义别名
mybatis系统定义的别名往往是不够用的,因为不同的应用有着不同的需求,因此mybatis提供了自定义别名的方法,就是在配置文件中通过使用元素来配置别名,如下所示:
<typeAliases>
<typeAlias type="com.yhl.mybatis.model.User" alias="user"/>
</typeAliases>
这样我们就可以在mybatis的的上下文中使用user来代替全路径名了,减少配置的复杂度。
如果在POJO特别多的时候,要配置别名的话那配置会非常多,这种情况下mybatis允许我们使用自动扫描的方式来配置别名,如下:
<typeAliases>
<package name="com.yhl.mybatis.model"/>
</typeAliases>
这种情况下需要我们在POJO上使用@Alias注解来定义别名,如下:
@Alias("user")
public class User {
private Long id;
private String userName;
private int age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}