MyBatis collection的两种形式——MyBatis学习笔记之九

 与association一样,collection元素也有两种形式,现介绍如下:

一、嵌套的resultMap

      实际上以前的示例使用的就是这种方法,今天介绍它的另一种写法。还是以教师映射为例,修改映射文件TeacherMapper.xml如下(点击此处进入嵌套resultMap形式的示例源码下载页面。注:本示例代码是在修改本系列的上篇博文示例代码的基础上完成的,用到了MapperScannerConfigurer和注解等知识。对这些知识不熟悉的读者,可参考上篇博文:http://legend2011.blog.51cto.com/3018495/980150):

<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--与以前一样,namespace的值是对应的映射器接口的完整名称-->
<mapper namespace="com.abc.mapper.TeacherMapper">
<!--TeacherMapper接口中getById方法对应的SQL语句。
查询教师及其指导的学生的信息。由于教师、学生都有
id、name、gender等属性,因此给教师的字段都起了别名-->
<select id="getById" parameterType="int" resultMap="supervisorResultMap">
select t.id t_id, t.name t_name, t.gender t_gender,
t.research_area t_research_area, t.title t_title,
s.id,s.name, s.gender,s.major,s.grade
from teacher t,student s where t.id=#{id}
and s.supervisor_id = t.id
</select>
<!--教师实体映射-->
<resultMap id="supervisorResultMap" type="Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
<result property="gender" column="t_gender"/>
<result property="researchArea" column="t_research_area"/>
<result property="title" column="t_title"/>
<!--需要注意的是,上面的select语句中学生的字段名/别名应与
下面的column属性一致。ofType指collection包含的元素的类型,
此属性不可少-->
<collection property="supStudents"ofType="Student">
<id property="id" column="id"/>
<result property="name"   column="name"/>
<result property="gender" column="gender"/>
<result property="major"  column="major"/>
<result property="grade"  column="grade"/>
<!--映射学生的指导教师属性,用到了
supervisorResultMap本身-->
<association property="supervisor"
resultMap="supervisorResultMap"/>
</collection>
</resultMap>
</mapper>

    运行程序结果如下: 

       与以前的写法相比,这种写法的缺点是学生实体映射被嵌入到教师实体映射中,因此学生实体映射不能被重用。

二、嵌套的select语句

      这种方式是使用一条单独的select语句来加载关联的实体(在本例中就是学生实体),然后在collection元素中引用此select语句(注:此方法会产生N+1问题,关于这个问题可参考本系列博客中的“MyBatis中的N+1问题”)。首先修改TeacherMapper.xml如下(点击此处进入嵌套select语句形式示例源码下载页面):

<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--与以前一样,namespace的值是对应的映射器接口的完整名称-->
<mapper namespace="com.abc.mapper.TeacherMapper">
<!--TeacherMapper接口中getById方法对应的SQL语句。
查询教师的信息。-->
<select id="getById" parameterType="int" resultMap="supervisorResultMap">
select * from teacher where id=#{id}
</select>
<!--教师实体映射-->
<resultMap id="supervisorResultMap" type="Teacher">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="gender" column="gender"/>
<result property="researchArea" column="research_area"/>
<result property="title" column="title"/>
<!--ofType指collection包含的元素的类型,此属性不可少。
column属性指把上述的getById的select语句中的教师id列的值作为参数
传递给将要引用到的下述的getStudents的select语句,此属性不可少。
引用的形式为:命名空间.select语句id-->
<collection property="supStudents" column="id" ofType="Student"
select="com.abc.mapper.StudentMapper.getStudents"/>
</resultMap>
</mapper>

 

     在这里把根据指导教师id查询学生信息的SQL语句写在StudentMapper.xml中,并引用其中的学生实体映射studentResultMap。修改StudentMapper.xml如下:

<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.abc.mapper.StudentMapper">
<resultMap id="studentResultMap" type="Student">
<id property="id" column="id"/>
<result property="name"   column="name"/>
<result property="gender" column="gender"/>
<result property="major"  column="major"/>
<result property="grade"  column="grade"/>
<!--在这里引用supervisorResultMap和getById,
亦采用命名空间名.相关元素id的形式。
column="supervisor_id"属性不可少-->
<association property="supervisor"
resultMap="com.abc.mapper.TeacherMapper.supervisorResultMap"
select="com.abc.mapper.TeacherMapper.getById"
column="supervisor_id"/>
</resultMap>
<!--根据指导教师id查询学生信息-->
<select id="getStudents" parameterType="int"
resultMap="studentResultMap">
select * from student where supervisor_id = #{id}
</select>
</mapper>

 

 执行结果如下:

      从以上可看出,collection的这两种形式与association的两种形式非常相似。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

int linux 原子操作_linux c++编程之多线程:原子操作如何解决线程冲突

在多线程中操作全局变量一般都会引起线程冲突&#xff0c;为了解决线程冲突&#xff0c;引入原子操作。1.线程冲突#include #include #include #include int g_count 0;void count(void *p){Sleep(100); //do some work//每个线程把g_count加1共10次for (int i 0; i < …

python查询斐波那契数列通项公式_分享一个神奇的操作系统——斐波那契+MACD,每一波都有20%以上的收益!...

斐波那契数列&#xff0c;又称兔子数列&#xff0c;或者黄金分割数列。指的是这样一个数列&#xff1a;0、1、1、2、3、5、8、13、21……从第三项起&#xff0c;它的每一项都等于前两项的和。为什么是兔子数列?我们假设兔子在出生两个月后&#xff0c;就有繁殖能力&#xff0c…

FPGA 状态机设计

数字系统有两大类有限状态机&#xff08;Finite State Machine&#xff0c;FSM&#xff09;&#xff1a;Moore状态机和Mealy状态机。 Moore状态机 其最大特点是输出只由当前状态确定&#xff0c;与输入无关。Moore状态机的状态图中的每一个状态都包含一个输出信号。这是一个典型…

WCF 初识(一)

WCF的前世今生 在.NETFramework 2.0以及前版本中&#xff0c;微软发展了Web Service&#xff08;SOAP with HTTP communication&#xff09;&#xff0c;.NET Remoting&#xff08;TCP/HTTP/Pipeline communication&#xff09;以及基础的Winsock等通信支持。 由于各个通信方法…

C/C++关键字解析

2、C/C分别有多少个关键字&#xff1f; 假如别人问某一个关键字是否属于C/C&#xff0c;要能正确的答出来。 1&#xff09;由ANSI标准定义的C语言关键字共32个 auto double int struct break else long switch case enum register typedef char extern return union const flo…

Linux系统:软链接与硬链接的原理分析

1、相关概念 1、索引节点inode(index node)&#xff1a;inode就是索引节点&#xff0c;它用来存放档案及目录的基本信息&#xff0c;包含时间、档名、使用者及群组等。 inode 是 UNIX/Linux 操作系统中的一种数据结构&#xff0c;其本质是结构体它包含了与文件系统中各个文件相…

操作系统:虚拟页式存储管理(缺页中断、页面置换算法)

1、基本工作原理 1、基本工作原理 在进程开始运行之前&#xff0c;不是全部装入页面&#xff0c;而是装入一个或者零个页面&#xff0c;之后根据进程运行的需要&#xff0c;动态装入其他页面&#xff1b;当内存已满&#xff0c;而又需要装入 新的页面时&#xff0c;则根据某种…

小程序 长按api_高质量的微信小程序样式模板应该长什么样?

现在不懂技术的小白若想快速制作自己的小程序&#xff0c;一般是通过小程序模板来实现。通过在模板上添加自己的图片、文字、商品等等&#xff0c;可以很简单地生成一个小程序。不过要想把小程序做得好看&#xff0c;你得找高质量的小程序样式模板才行。那么高质量的微信小程序…

web安全测试-AppScan使用分享

这里主要分享如何使用AppScan对一大项目的部分功能进行安全扫描。 ------------------------------------------------------------------------ 其实&#xff0c;对于安全方面的测试知道的甚少。因为那公司每个月要求对产品进行安全扫描。掌握了一人点使用技巧&#xff0c;所…

ros 开源物体检测_ROS kinetic + Realsens D435i + ORK + LINEMOD 物体识别

1. ORKORK (Object Recognition Kitchen) 是 ROS 集成的物体识别库&#xff0c;当前 Kinetic 版本的 ROS 只集成了部分功能包的二进制安装文件&#xff0c;所以需通过源码编译安装。安装依赖库sudo apt-get installmeshlabsudo apt-get install libosmesa6-devsudo apt-get ins…

华为荣耀6 H60-L02/L12(联通版)救砖包【适用于无限重启】

本帖最后由 HOT米粒 于 2014-11-16 20:43 编辑 华为荣耀6 H60-L02/L12&#xff08;联通版&#xff09;救砖包【适用于无限重启】说明&#xff1a; 1、本工具包用于华为荣耀6 H60-L02&#xff08;联通版&#xff09;&#xff1b; 2、本工具适用于在Honor Logo 无限重启的童鞋恢复…

Mysql存储引擎中InnoDB与Myisam的区别

为什么80%的码农都做不了架构师&#xff1f;>>> 1. 事务处理 innodb 支持事务功能&#xff0c;myisam 不支持。 Myisam 的执行速度更快&#xff0c;性能更好。 2. select ,update ,insert ,delete 操作 MyISAM&#xff1a;如果执行大量的SELECT&#xff0c;MyISA…

一步步学习javascript基础篇(8):细说事件

终于学到事件了&#xff0c;不知道为何听到“事件”就有一种莫名的兴奋。可能是之前的那些知识点过于枯燥无味吧&#xff0c;说起事件感觉顿时高大上了。今天我们就来好好分析下这个高大上的东西。 可以说&#xff0c;如果没有事件我们的页面就只能阅读了。有了事件&#xff0c…

求1到n ,这n个整数的二进制表示比特1的个数(时间复杂度:O(n))

题目描述&#xff1a; 给定一个数字n&#xff0c;统计1&#xff5e;n之间的n个数字的二进制的1的个数 int Nums_Of_Bit_1(int num) { int* number new int[num]; int pow 1,before 1; int count 0; for(int i1; i<num; i){ if (i pow){ …

mysql支持cube_mysql聚合函数rollup和cube

一、with rollup&#xff1a;with rollup通常和group by语句一起使用&#xff0c;是根据维度在分组的结果集中进行聚合操作。——对group by的分组进行汇总。假设用户需要对N个纬度进行聚合查询操作&#xff0c;普通的groupby语句需要N个查询和N次group by操作。而rollup的有点…

域名详解

定义 是由一串用 “.” 分割的字符组成的Internet上某一台计算机或计算机组的名称&#xff0c;域名的本质是IP地址的一个映射&#xff0c;域名的目的是便于记忆和沟通的一组服务器的地址。 域名解析 域名解析的过程实际上是将域名还原为IP地址的过程 &#xff08;1&#xf…

navicat远程mysql_navicat 远程连接mysql

一、修改用户权限&#xff1a;需要手动增加可以远程访问数据库的用户。方法一(不推荐)、本地登入mysql&#xff0c;更改 "mysql" 数据库里的 "user" 表里的 "host" 项&#xff0c;将"localhost"改为"%"#mysql -u root -proo…

应用层协议:HTTP与HTTPS协议详解、二者的区别

http协议详解 1、HTTP协议&#xff1a;超文本传输协议 是一种分布式、合作式、多媒体信息系统服务&#xff0c;面向应用层的协议。是一种通用的&#xff0c;不分状态的协议。是一种请求/应答协议。1.1、HTTP/1.0和HTTP/1.1的比较 RFC 1945定义了HTTP/1.0版本。其中最著名的就…

[POJ 1330] Nearest Common Ancestors (倍增法)

题目同上篇&#xff0c;最近公共祖先。 因为没有清零tot&#xff0c;RE了好多次TAT 一定要初始化啊&#xff01;&#xff01; 1 #include<cstdio>2 #include<cstring>3 #include<queue>4 #include<iostream>5 using namespace std;6 int root,head[100…

javascript console 函数详解 js开发调试的利器 浏览:3201|更新:2014-05-30 09:27

引用地址&#xff1a;http://jingyan.baidu.com/article/e75aca855c6419142edac6c1.html一键约师傅百度师傅最快的到家服务&#xff0c;最优质的电脑清灰&#xff01;Console 是用于显示 JS和 DOM 对象信息的单独窗口。并且向 JS 中注入1个 console 对象&#xff0c;使用该对象…