当前使用版本(必填,否则不予处理)

3.4.1

您好,在初始化每个表的ResultMapping的时候,为什么不对该表使用的TypeHandler进行注册呢,是出于什么考虑?我看到了TableFieldInfo类中的一段代码,如下:

    ResultMapping getResultMapping(final Configuration configuration) {
       ...
        if (typeHandler != null && typeHandler != UnknownTypeHandler.class) {
            TypeHandler<?> typeHandler = registry.getMappingTypeHandler(this.typeHandler);
            if (typeHandler == null) {
                typeHandler = registry.getInstance(propertyType, this.typeHandler);
                // todo 这会有影响 registry.register(typeHandler);
            }
            builder.typeHandler(typeHandler);
        }
        return builder.build();
    }

注册进去应该更好吧。

Comment From: miemieYaho

注册有注册的口子,你自己在xml写resultmap也不会给你注册

Comment From: jymot

@miemieYaho 不好意思,可能是我没说清楚。我自己测试,比如上面那段代码,把注释打开,这样再执行BaseBuilder.resolveTypeHandler方法的时候,就不会再获取新的TypeHandler了。其实我的期望就是BaseBuilder.resolveTypeHandler方法返回的是typeHandlerRegistry.getMappingTypeHandler中已缓存的TypeHandler,而不是每次typeHandlerRegistry.getInstance返回的新实例。

class: org.apache.ibatis.builder.BaseBuilder

    protected TypeHandler<?> resolveTypeHandler(Class<?> javaType, Class<? extends TypeHandler<?>> typeHandlerType) {
        if (typeHandlerType == null) {
            return null;
        } else {
            TypeHandler<?> handler = this.typeHandlerRegistry.getMappingTypeHandler(typeHandlerType);
            if (handler == null) {
                handler = this.typeHandlerRegistry.getInstance(javaType, typeHandlerType);
            }

            return handler;
        }
    }

所以我没理解咱们代码中注释里面写的这会有影响,不知道会有什么影响。


关的也太草率了。