MyBatis用嵌套ResultMap实现一对多映射
来源:互联网 发布:ubuntu磁盘空间查看 编辑:程序博客网 时间:2024/05/16 15:56
背景
我们知道,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_idtutor_namecourse_idcourse_name1张三1语文2李四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_idtutor_namecourse_idcourse_name1张三1语文1李四2数学则读进来的数据,就会变成这样了:
张三:语文李四:数学
上面这个例子可以说明,如果没有指定id,会去根据所有属性去判断是否为同一个对象。只要有一个属性不同,就认为不是同一个对象。
如果把数据改为:
tutor_idtutor_namecourse_idcourse_name1张三1语文1张三2数学则读进来的数据,就会变成:
张三:语文,数学
如果所有属性都相同,就会认为是同一个对象了。
写到这里,发现思路不太清晰。其实course按照什么去找tutor,主要看的是同一行的tutor,看是这个tutor是不是新的。
- MyBatis用嵌套ResultMap实现一对多映射
- MyBatis映射文件的resultMap一对一一对多关联
- MyBatis一对多映射实现方式
- mybatis实现一对多关系映射
- JavaEE_Mybatis_SpringMVC_Mybatis_lesson12_一对多关联映射(ResultMap)
- MyBatis框架的 resultMap(自连接,一对多,多对多)映射
- Mybatis一对多查询resultMap示例
- MyBatis之使用resultMap实现高级映射
- mybatis 嵌套查询,一对多
- mybatis 一对多,嵌套查询
- mybatis使用resultMap实现一对多查询 (需求:查询订单以及订单明细)
- Mybaits利用resultMap实现一对多
- MyBatis 一对多映射配置
- 06. mybatis 映射: 一对多
- Mybatis 一对多关系映射
- MyBatis-高级映射:一对多
- MyBatis一对多关系映射
- MyBatis映射关系一对多
- Oracle 11gR2中针对备份恢复功能的增强
- LCD设备驱动(二)
- 1、初识scrapy
- 数据事务四种隔离机制和七种传播行为
- mysql的事务的隔离级别
- MyBatis用嵌套ResultMap实现一对多映射
- linux 的重定向、管道、xargs 命令
- DI【理解】【应用】【重点】
- 8.learningAction(行为库)3
- hadoop资料收集
- Vue2中的键盘事件
- Android指纹识别
- ConfigReader
- 2、scrapy使用步骤