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
,如下图。