Mybatis配置文件之<typeAliases>别名配置元素解析

Mybatis配置文件之别名配置元素解析

1. 概述

别名是一个指代的名称,因为我们遇到类型全限定名过长时希望用一个简短的名称去指代它,而这个名称可以在mybatis上下文中使用。别名在mybatis里面分为系统定义别名和自定义别名两类,注意,在mybatis中别名是不区分大小写的。一个typeAliases的实例是在解析配置文件时生成的,然后长期保存在Configuration对象中,当我们使用它时,再把它取出来,这样就没必要运行的时候再次生成它的实例了。如下是配置一个别名:

    <typeAliases>
        <typeAlias type="com.yhl.mybatis.model.User" alias="user"/>
    </typeAliases>

2. 系统定义别名

mybatis系统的定义了一些经常使用的类型的别名,如数值、字符串、日期和集合等,我们在使用mybatis的时候可以直接使用它们,如下所示:

2.1 常见的内建类型别名

这是一些为常见的 Java 类型内建的相应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。

别名映射的类型
_bytebyte
_long long
_shortshort
_intint
_integerint
_double double
_floatfloat
_booleanboolean
stringString
byte Byte
long Long
shortShort
intInteger
integerInteger
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmapHashMap
list List
arraylist ArrayList
collectionCollection
iteratorIterator

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值