MyBatis XML 标签类型说明
-
resultMap 标签的类型属性为 type(必填)。 -
id, result 标签的类型属性为javaType(可选)。 -
idArg, arg 标签和上面两个类似,也都是 javaType(可选)。 -
association 标签的类型属性为 javaType(可选)。 -
discriminator 标签的类型属性为 javaType(可选)。 -
collection 这个标签最特殊,有两个类型属性,分别为 javaType(可选) 和 ofType(结果映射时必填)。
上面除collection外都只有一个类型的属性,所以设置他们的类型时没有任何问题。
可以看到上面所有的 javaType 属性都是可选的,这是因为在resultMap标签type(collection标签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
点击查看完整源码。
上面通过反射获取到该属性的 setterType,如果属性没有对应的 setter,会直接通过属性名查找字段得到该类型。
例如 resultType=”User” property=”userName”
如果设置了 javaType,就返回该值。
如果没有设置,就会通过反射获取到 userName 的属性为 java.lang.String。
了解javaType后,还剩下 resultMap 的 type 和 collection 的 ofType 属性。
这两个属性是意义相同的两个属性,并且都是必填项。使用嵌套的时候,collection 只会推断出 javaType,可能是个List类型,但是无法推断出这个集合的泛型类型是什么,因此 ofType 需要手动设置。在使用嵌套结果映射时,这个值必填,因为 MyBatis 映射结果时,需要知道collection的类型,后续还会根据这个类型推断 collection 中id,result等标签的javaType。
其他注意事项
对于 association,collection,case 标签,select 属性优先级最高。
同时配置时,嵌套查询优先级高于结果映射。
勘误
在《MyBatis 从入门到精通》第141页中,由于直接从association直接替换为了collection,这里的javaType没有修改为ofType,因此会导致SysRole无法转换为List类型的错误。
这里应该将javaType修改为ofType,如下图。










