• MyBatis源码基础-常用类-别名注册器


    别名注册器

    mybatis提供了TypeAliasRegistry作为别名注册器,同时默认注入了大量的基础类型的别名,是配置类的一个成员变量

    public class TypeAliasRegistry {
    
        private final Map<String, Class<?>> typeAliases = new HashMap<>();
    
        // 构造方法中默认注册了大量的别名
        public TypeAliasRegistry() {
            registerAlias("string", String.class);
    
            registerAlias("byte", Byte.class);
            registerAlias("char", Character.class);
            registerAlias("character", Character.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("char[]", Character[].class);
            registerAlias("character[]", Character[].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("_char", char.class);
            registerAlias("_character", char.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("_char[]", char[].class);
            registerAlias("_character[]", char[].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);
        }
        //.....
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    关于别名注册器的使用:

    @Test
    public void testTypeAliasRegistry() {
        TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();
        typeAliasRegistry.registerAlias("employee", Employee.class);
        typeAliasRegistry.registerAliases("com.dcy.entity");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    a.批量注册

    public void registerAliases(String packageName) {
        registerAliases(packageName, Object.class);
    }
    
    public void registerAliases(String packageName, Class<?> superType) {
        // ResolverUtil找到所有Object的子类
        ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<>();
        resolverUtil.find(new ResolverUtil.IsA(superType), packageName);
        Set<Class<? extends Class<?>>> typeSet = resolverUtil.getClasses();
        for (Class<?> type : typeSet) {
            // 不是匿名类 | 不是接口 | 不是内部类
            if (!type.isAnonymousClass() && !type.isInterface() && !type.isMemberClass()) {
                registerAlias(type);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    b.单个别名的注册

    public void registerAlias(Class<?> type) {
        String alias = type.getSimpleName();
        Alias aliasAnnotation = type.getAnnotation(Alias.class);
        if (aliasAnnotation != null) {
            alias = aliasAnnotation.value();
        }
        registerAlias(alias, type);
    }
    
    public void registerAlias(String alias, Class<?> value) {
        if (alias == null) {
            throw new TypeException("The parameter alias cannot be null");
        }
        // issue #748
        String key = alias.toLowerCase(Locale.ENGLISH);
        if (typeAliases.containsKey(key) && typeAliases.get(key) != null && !typeAliases.get(key).equals(value)) {
            throw new TypeException("The alias '" + alias + "' is already mapped to the value '" + typeAliases.get(key).getName() + "'.");
        }
        typeAliases.put(key, value);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    Git 入门使用 —— 建库、代码上下传、常用命令
    LeetCode770之基本计算器IV(相关话题:波兰表达式,多项式运算)
    React组件化开发
    数据结构·堆·完全二叉树
    正则表达式基础语法
    论文阅读:GPT-too- A language-model-first approach for AMR-to-text generation Manuel
    冒泡算法,leetcode第一题
    六月集训(第30天) —— 拓扑排序
    vue3组件的通信方式
    P8352-[SDOI/SXOI2022]小N的独立集【dp套dp】
  • 原文地址:https://blog.csdn.net/weixin_46926189/article/details/134019147