MyBatis用嵌套ResultMap实现一对多映射
我的技术博客经常被流氓网站恶意爬取转载。请移步原文: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实现一对多映射的更多相关文章
- MyBatis - (二) 一对一映射和一对多映射
1. 一对一映射 例子表: 学生表 地址表 POJO类 public class Address { private Integer addrId; private String street; pr ...
- mybatis bug之resultmap缺少object-relation匹配参数password,造成设置密码不成功
1.mybatis bug之resultmap缺少object-relation匹配参数password,造成设置密码不成功 在resultmap里没有设置user类中password属性和数据库表t ...
- MyBatis从入门到精通(十一):MyBatis高级结果映射之一对多映射
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中如何使 ...
- mybatis一对一嵌套查询
要求:查询一个员工的时候,把他对应的部门也查询出来 实现(其他配置这里不作说明,框架基于spring_springMVC_mybatis_oracle): 如有不对或不适的地方,请多多指教. 1.新建 ...
- mybatis的嵌套查询(嵌套查询nested select和嵌套结果nested results查询)区别
(转自:http://blog.csdn.net/canot/article/details/51485955) Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-man ...
- mybatis的嵌套查询与嵌套结果查询的不同
原文:https://blog.csdn.net/qq_39706071/article/details/85156840 实体类: 嵌套查询mapper方法:嵌套查询的弊端:即嵌套查询的N+1问题尽 ...
- mybatis中的resultMap
resultMap <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBL ...
- Mybatis 入门之resultMap与resultType解说实例
resultMap:适合使用返回值是自己定义实体类的情况 resultType:适合使用返回值得数据类型是非自己定义的,即jdk的提供的类型 resultMap : type:映射实体类的数据类型 i ...
- Mybatis复杂嵌套关联一例
Mybatis three entity relation:association in collection PatentMapper.xml <resultMap id="Bas ...
随机推荐
- 配置yii访问远程数据库
1.将hdp002的数据库放到hdp004后,发现yii出现找不到表messages的迹象.用hdp002远程登录hdp004后发现,原来是hdp004没有授权给hdp002,用下面的sql语句即可: ...
- Quartz.Net实现定时任务调度
Quartz.Net介绍: Quartz一个开源的作业调度框架,OpenSymphony的开源项目.Quartz.Net 是Quartz的C#移植版本. 它一些很好的特性: 1:支持集群,作业分组,作 ...
- V8::Arguments中This和Holder的区别
## v8::Arguments namespace v8 { class Arguments { public: inline int Length() const; inline Local& ...
- VS 之 InstallShield Limited Edition for Visual Studio 2015 图文教程
从Visual Studio 2012开始,微软就把自家原来的安装与部署工具彻底废掉了,转而让大家去安装使用第三方的打包工具“InstallShield Limited Edition for Vis ...
- PopupWindow使用
PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的. PopupWindow使用Demo 这 ...
- IOS 读取本地的Json/plist 文件
一.一般本地可以存储轻量级数据存储 plist 这个主要是操作字典 方法如下: NSString * sampleFile= [[[NSBundle mainBundle] bundlePath] ...
- Git_Windows 系统下Git安装图解
Windows 系统下Git安装图解 心得 :很成功~ 简单来说Git是一个免费的.开源的版本控制软件,从功能上讲,跟我们比较熟悉的Subversion(SVN)这类版本控制软件没什么两样.由于工 ...
- Oracle基础 数据泵导出/导入Expdp/impdp(转)
一.EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2 ...
- Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
执行远程shell,启动远程机器的tomat时遇到次错误.后来发现原来是远程机器的.profile被人改掉了! 在.profile里加入 export JAVA_HOME=/home/evans/jd ...
- springmvc(1)--配置
最近把spring的使用整理下,版本4.1.1.RELEASE SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求先访问的都是DispatcherServlet,D ...