欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 10:30:05
...

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;
    }
}