我的技术博客经常被流氓网站恶意爬取转载。请移步原文:http://www.cnblogs.com/hamhog/p/3959451.html,享受整齐的排版、有效的链接、正确的代码缩进、更好的阅读体验。

背景

我们知道,MyBatis可以很方便地把SQL select出来的数据直接映射为对象的属性,把对象取出来。

但是,有些对象的属性是集合类型,集合里保存的是数个其他类型的对象。如何用MyBatis把它取出来呢?

例子

以以下这个应用场景为例:一个教师对应多个课程。

数据结构如下:

public class Course{
int id;
String name;
} public class Tutor{
int id;
String name;
List<Course> courses;
}

这时,就需要分别写出两者的ResultMap:

    <resultMap type="Course" id="courseResult">
<result column="course_id" property="id" />
<result column="course_name" property="name" />
</resultMap> <resultMap type="Tutor" id="tutorResult">
<id column="tutor_id" property="id" />
<result column="tutor_name" property="name" />
<collection property="courses" resultMap="Course" />
</resultMap>

然后把select语句的resultMap设为tutorResult:

<select id="findTutorById" parameterType="int" resultMap="TutorResult">
SELECT TUTOR_ID, TUTOR_NAME, COURSE_ID, COURSE_NAME FROM TUTOR
</select>

这样就能把Tutor类的数据正确地读进来了。

实验

以上这个例子来自《Java Persistence with MyBatis3》。让我好奇的是,myBatis是如何判断,哪些course应该对应同一个tutor的呢?对于每个course,它是怎么寻找应该把它放进哪个tutor的List里呢?

用以上的例子,数据为:

tutor_id tutor_name course_id course_name
1 张三 1 语文
2 李四 2 数学

读进来的数据是,大概是这样的:

张三 : 语文
李四 : 数学

如果我们把数据改成这样:

tutor_id tutor_name course_id course_name
1 张三 1 语文
1 李四 2 数学

读进来的数据,就会变成这样:

张三:语文, 数学

“李四”没有了。数学归进了张三里。这是为什么呢?

原来,Tutor的ResultMap里,指定了id为tutor_id。一旦指定了id,myBatis就认定它是全局唯一的;李四的id与张三相同,因此会被认为是同一个对象,则李四的数据被直接忽略。

上面这个例子可以说明,如果有指定id,会去根据id判断是否为同一个对象。id相同,即使属性不同,还是认为是同一个对象。

而我们如果把id改为普通的result,把Tutor的ResultMap改成这样:

    <resultMap type="Tutor" id="tutorResult">
<result column="tutor_id" property="id" />
<result column="tutor_name" property="name" />
<collection property="courses" resultMap="Course" />
</resultMap>

此时,仍然用刚才的数据:

tutor_id tutor_name course_id course_name
1 张三 1 语文
1 李四 2 数学

则读进来的数据,就会变成这样了:

张三:语文
李四:数学

上面这个例子可以说明,如果没有指定id,会去根据所有属性去判断是否为同一个对象。只要有一个属性不同,就认为不是同一个对象。

如果把数据改为:

tutor_id tutor_name course_id course_name
1 张三 1 语文
1 张三 2 数学

则读进来的数据,就会变成:

张三:语文,数学

如果所有属性都相同,就会认为是同一个对象了。

写到这里,发现思路不太清晰。其实course按照什么去找tutor,主要看的是同一行的tutor,看是这个tutor是不是新的。

MyBatis用嵌套ResultMap实现一对多映射的更多相关文章

  1. MyBatis - (二) 一对一映射和一对多映射

    1. 一对一映射 例子表: 学生表 地址表 POJO类 public class Address { private Integer addrId; private String street; pr ...

  2. mybatis bug之resultmap缺少object-relation匹配参数password,造成设置密码不成功

    1.mybatis bug之resultmap缺少object-relation匹配参数password,造成设置密码不成功 在resultmap里没有设置user类中password属性和数据库表t ...

  3. MyBatis从入门到精通(十一):MyBatis高级结果映射之一对多映射

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中如何使 ...

  4. mybatis一对一嵌套查询

    要求:查询一个员工的时候,把他对应的部门也查询出来 实现(其他配置这里不作说明,框架基于spring_springMVC_mybatis_oracle): 如有不对或不适的地方,请多多指教. 1.新建 ...

  5. mybatis的嵌套查询(嵌套查询nested select和嵌套结果nested results查询)区别

    (转自:http://blog.csdn.net/canot/article/details/51485955) Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-man ...

  6. mybatis的嵌套查询与嵌套结果查询的不同

    原文:https://blog.csdn.net/qq_39706071/article/details/85156840 实体类: 嵌套查询mapper方法:嵌套查询的弊端:即嵌套查询的N+1问题尽 ...

  7. mybatis中的resultMap

    resultMap <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBL ...

  8. Mybatis 入门之resultMap与resultType解说实例

    resultMap:适合使用返回值是自己定义实体类的情况 resultType:适合使用返回值得数据类型是非自己定义的,即jdk的提供的类型 resultMap : type:映射实体类的数据类型 i ...

  9. Mybatis复杂嵌套关联一例

    Mybatis  three entity relation:association in collection PatentMapper.xml <resultMap id="Bas ...

随机推荐

  1. 配置yii访问远程数据库

    1.将hdp002的数据库放到hdp004后,发现yii出现找不到表messages的迹象.用hdp002远程登录hdp004后发现,原来是hdp004没有授权给hdp002,用下面的sql语句即可: ...

  2. RMI、RPC、SOAP通讯技术介绍及比对 - XML/SOAP

    RMI.RPC.SOAP通信技术介绍及比对 1.RMI 使用java的程序员,对于RMI(RemoteMethod Invoke,远程方法调用)一定不陌生,在java中,为了在分布式应用开发时,能够方 ...

  3. 用Systemtap探索MySQL

    http://www.actionsky.com/docs/archives/168#Systemtap 目录 1 Systemtap 2 Systemtap 观测点的支持程度 2.1 官方编译的My ...

  4. php内核探索

    http://www.nowamagic.net/librarys/veda/special/PHP%E5%86%85%E6%A0%B8%E6%8E%A2%E7%B4%A2 关注PHP 源代码 Zen ...

  5. 浅析SkipList跳跃表原理及代码实现

    本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈“跳跃表”的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代 ...

  6. 史上最全的 UIWebview 的 JS 与 OC 交互

    来源:伯乐在线 - 键盘风筝 链接:http://ios.jobbole.com/89330/ 点击 → 申请加入伯乐在线专栏作者 其实一直想给大家整理一下JS与OC的交互,但是没有合适的机会,今天借 ...

  7. Windows 7 IIS HTTP 错误 500.21 – Internal Server Error 解决方法

    错误状况: 下面内容来自网络,自己也另有补充 原因:在安装Framework v4.0之后,再启用IIS,导致Framework没有完全安装 解决办法:开始->所有程序->附件->鼠 ...

  8. [Oracle] Oracle和SQLServer的数据类型比较

    类型名称 Oracle SQLServer 比较 字符数据类型 CHAR CHAR 都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb 变长字符数据类型 VA ...

  9. 10个实用的但偏执的Java编程技术

    在沉浸于编码一段时间以后,你会渐渐对这些东西习以为常.因为,你知道的-- 任何事情有可能出错,没错,的确如此. 这就是为什么我们要采用"防御性编程",即一些偏执习惯的原因.下面是我 ...

  10. Oracle 基础 数据库备份与恢复

    一.为什么需要数据备份 造成数据丢失的主要原因: 1.介质故障. 2.用户的错误操作. 3.服务器的彻底崩溃. 4.计算机病毒. 5.不可预料的因素. Oracle中故障类型分为以下4种. 1.语句故 ...