0
点赞
收藏
分享

微信扫一扫

MyBatis XML 标签类型说明


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

MyBatis XML 标签类型说明_javaType


举报

相关推荐

0 条评论