Mybatis——TypeAliasRegistry 类型别名注册

简介:typeAlias即类型别名,mybatis配置xml映射器时,parameterType和resultType经常使用类的别而不是类的全限定名,TypeAliasRegistry就负责别名到全限定名的映射。

xml映射文件:

全限定名:parameterType="java.lang.Integer"
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
别名:parameterType="integer"
<select id="selectByPrimaryKey" parameterType="integer" resultMap="BaseResultMap">

一、TypeAliasRegistry 源码分析

public class TypeAliasRegistry {
	private final Map<String, Class<?>> TYPE_ALIASES = new HashMap();	//记录类型的别名
	public TypeAliasRegistry() {
		this.registerAlias("string", String.class);
        this.registerAlias("byte", Byte.class);
        this.registerAlias("long", Long.class);
        this.registerAlias("short", Short.class);
        this.registerAlias("int", Integer.class);
        this.registerAlias("integer", Integer.class);
        this.registerAlias("double", Double.class);
        //初始化别名映射见下表
        ......
    }
	/*
    * resolveAlias(String string)解析别名
    * */
	public <T> Class<T> resolveAlias(String string) {
        try {
            if (string == null) {
                return null;
            } else {
                String key = string.toLowerCase(Locale.ENGLISH);
                Class value;
                if (this.TYPE_ALIASES.containsKey(key)) {
                    value = (Class)this.TYPE_ALIASES.get(key);
                } else {
                    value = Resources.classForName(string);
                }

                return value;
            }
        } catch (ClassNotFoundException var4) {
            throw new TypeException("Could not resolve type alias '" + string + "'.  Cause: " + var4, var4);
        }
    }
	
	/*
    * 注册别名(包扫描),通常对应mybatis中配置:
    * <typeAliases>
    *  <package name="packageName"/>
  	* </typeAliases>
    * */
	public void registerAliases(String packageName) {
        this.registerAliases(packageName, Object.class);
    }
	/*
    * 注册别名(包扫描),
    * */
    public void registerAliases(String packageName, Class<?> superType) {
        ResolverUtil<Class<?>> resolverUtil = new ResolverUtil();
        //查找“packageName”包下所有的superType的子类
        resolverUtil.find(new IsA(superType), packageName);
        //获取所有类的Class,
        Set<Class<? extends Class<?>>> typeSet = resolverUtil.getClasses();
        Iterator var5 = typeSet.iterator();
		
        while(var5.hasNext()) {
            Class<?> type = (Class)var5.next();
        	//判断是否已注册
            if (!type.isAnonymousClass() && !type.isInterface() && !type.isMemberClass()) {
            	//调用注册方法(类型)
                this.registerAlias(type);
            }
        }

    }	
	
	/*
    * 注册别名(类型),通常对应mybatis中配置:
    * <typeAliases>
    *  <package type="classType"/>
  	* </typeAliases>
    * */
	public void registerAlias(Class<?> type) {
		//得到类的简写名称,即不含报名的类名称
        String alias = type.getSimpleName();
        //获取@Alias注解修饰并指定的别名
        Alias aliasAnnotation = (Alias)type.getAnnotation(Alias.class);
        if (aliasAnnotation != null) {
            alias = aliasAnnotation.value();
        }

        this.registerAlias(alias, type);
    }

    public void registerAlias(String alias, Class<?> value) {
        if (alias == null) {
            throw new TypeException("The parameter alias cannot be null");
        } else {
        	//别名统一转为小写应为字母,然后作为map中的键查找
            String key = alias.toLowerCase(Locale.ENGLISH);
            //判断hashmap中是否已包含别名
            if (this.TYPE_ALIASES.containsKey(key) && this.TYPE_ALIASES.get(key) != null && !((Class)this.TYPE_ALIASES.get(key)).equals(value)) {
                throw new TypeException("The alias '" + alias + "' is already mapped to the value '" + ((Class)this.TYPE_ALIASES.get(key)).getName() + "'.");
            } else {
            	//注册别名:放入到TYPE_ALIASES中
                this.TYPE_ALIASES.put(key, value);
            }
        }
    }
	

	/*
    * 注册别名(最核心的方法)
    * */
	public void registerAlias(String alias, Class<?> value) {
		//别名不能为null
        if (alias == null) {
            throw new TypeException("The parameter alias cannot be null");
        } else {
        	//别名转化为全小写的的英文字母
            String key = alias.toLowerCase(Locale.ENGLISH);
            //hashmap中查找是否存在该别名
            if (this.TYPE_ALIASES.containsKey(key) && this.TYPE_ALIASES.get(key) != null && !((Class)this.TYPE_ALIASES.get(key)).equals(value)) {
                throw new TypeException("The alias '" + alias + "' is already mapped to the value '" + ((Class)this.TYPE_ALIASES.get(key)).getName() + "'.");
            } else {
            	//以全小写的别名英文为key,Class为value保存到TYPE_ALIASES中
                this.TYPE_ALIASES.put(key, value);
            }
        }
    }

	

类全限名别名
String.classstring
Byte.classbyte
Long.classlong
Short.classshort
Integer.classint
Integer.classinteger
Double.classdouble
Float.classfloat
Boolean.classboolean
Byte[].classbyte[]
Long[].classlong[]
Short[].classshort[]
Integer[].classint[]
Integer[].classinteger[]
Double[].classdouble[]
Float[].classfloat[]
Boolean[].classboolean[]
Byte.TYPE_byte
Long.TYPE_long
Short.TYPE_short
Integer.TYPE_int
Integer.TYPE_integer
Double.TYPE_double
Float.TYPE_float
Boolean.TYPE_boolean
byte[].class_byte[]
long[].class_long[]
short[].class_short[]
int[].class_int[]
int[].class_integer[]
double[].class_double[]
float[].class_float[]
boolean[].class_boolean[]
Date.classdate
BigDecimal.classdecimal
BigDecimal.classbigdecimal
BigInteger.classbiginteger
Object.classobject
Date[].classdate[]
BigDecimal[].classdecimal[]
BigDecimal[].classbigdecimal[]
BigInteger[].classbiginteger[]
Object[].classobject[]
Map.classmap
HashMap.classhashmap
List.classlist
ArrayList.classarraylist
Collection.classcollection
Iterator.classiterator
ResultSet.classResultSet
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值