MyBatis XML 标签类型说明

版权声明:版权归博主所有,转载请带上本文链接!联系方式:abel533@gmail.com https://blog.csdn.net/isea533/article/details/76229571

MyBatis XML 标签类型说明

  • resultMap 标签的类型属性为 type(必填)。

  • id, result 标签的类型属性为javaType(可选)。

  • idArg, arg 标签和上面两个类似,也都是 javaType(可选)。

  • association 标签的类型属性为 javaType(可选)。

  • discriminator 标签的类型属性为 javaType(可选)。

  • collection 这个标签最特殊,有两个类型属性,分别为 javaType(可选) 和 ofType(结果映射时必填)。

上面除collection外都只有一个类型的属性,所以设置他们的类型时没有任何问题。

可以看到上面所有的 javaType 属性都是可选的,这是因为在resultMap标签typecollection标签ofType)类型已知的情况下是可以推断该类型中其他字段的javaType。自动推断类型的代码如下:

private Class<?> resolveResultJavaType(Class<?> resultType, String property, Class<?> javaType) {
    if (javaType == null && property != null) {
        try {
            MetaClass metaResultType = MetaClass.forClass(resultType,
                    configuration.getReflectorFactory());
            javaType = metaResultType.getSetterType(property);
        } catch (Exception e) {
            //ignore, following null check statement will deal with the situation
        }
    }
    if (javaType == null) {
        javaType = Object.class;
    }
    return javaType;
}

点击查看完整源码

上面通过反射获取到该属性的 setterType,如果属性没有对应的 setter,会直接通过属性名查找字段得到该类型。

例如 resultType=”User” property=”userName”

如果设置了 javaType,就返回该值。

如果没有设置,就会通过反射获取到 userName 的属性为 java.lang.String。

了解javaType后,还剩下 resultMaptypecollectionofType 属性。

这两个属性是意义相同的两个属性,并且都是必填项。使用嵌套的时候,collection 只会推断出 javaType,可能是个List类型,但是无法推断出这个集合的泛型类型是什么,因此 ofType 需要手动设置。在使用嵌套结果映射时,这个值必填,因为 MyBatis 映射结果时,需要知道collection的类型,后续还会根据这个类型推断 collectionid,result等标签的javaType

其他注意事项

对于 association,collection,case 标签,select 属性优先级最高。

同时配置时,嵌套查询优先级高于结果映射。

勘误

在《MyBatis 从入门到精通》第141页中,由于直接从association直接替换为了collection,这里的javaType没有修改为ofType,因此会导致SysRole无法转换为List类型的错误。

这里应该将javaType修改为ofType,如下图。

这里写图片描述

阅读更多

扫码向博主提问

isea533

博客专家

MyBatis相关答疑
  • 擅长领域:
  • MyBatis
  • Spring Boo
  • Spring
去开通我的Chat快问
换一批

没有更多推荐了,返回首页