MyBatis框架之关联查询
概述:关联查询主要在<resultMap>元素中,用<association>配置一对一、用<collection> 配置一对多
一、一对一查询
1.使用扩展类实现一对一查询
<select id="queryById" parameter="int" resultType="User">
select * from user where userid=#{userid}
</select>
2.使用resulutMap实现一对一查询(association)
举例说明:将用户信息和用户权限放到不同的实体类中,每一个用户对应着相应的权限,如果要根据用户id查询他对应的属性,则需要在用户信息加入一个权限的属性,再通过SQL映 射文件中的resultMap属性,将查询的结果映射到用户类中的所有属性,包括权限信息
<select id="queryById" parameter="int" resultMap="User_privilige_map">
select *
from user
inner join privilige on user.privilige=privilige.privilige
where userid=#{userid}
</select> <resultMap type="org.zy.pojo.user" id="User_privilige_map">
<id property="userid" column="userid"/>
<result property="userName" column="userName"/>
<result property="userAge" column="userAge"/>
...
<association property="privilige" javaType="privilige">
<id property="priviligeid" column="priviligeid"/>
<result property="priviligeidName"column="priviligeidName"/>
...
</association>
</resultMap>
二、一对多查询
本章利用班级和学生之间的一对多举例:
(1)首先在班级类中添加学生属性 privaie List<Student> student;
(2)在学生类中增加表示班级的外键
(3)查询语句
<select id="queryById" parameter="int" resultMap="ClassAndStudent">
select * from Student s where inner join Class c on s.classid=c.classid where
s.id=#{userid}
</select> <resultMap type="studentClass" id="ClassAndStudent">
<id property="classid" column="classid"/>
<result property="className" column="className"/>
... //省略其他属性
<collection property="students" ofType="student">
<id peoperty="stuNo" column="stuNo"/>
<result property="stuName" column="stuName" />
...//省略其他属性
</collection>
</resultMap> 参数说明:普通的类型通过id,result 映射,List属性的students 通过<collection>映射,并通过ofType指定List元素中的类型,即List类型的属性,需要通过<resultMap>中的<collection>
元素来映射到数据表中的各个列
三、多对一查询
一个班级和多个学生之间的关系是一对多,反过来看,多个学生和班级之间的关系是多对一,本质是一样的,参照上面的内容即可
四、多对多查询
多对多的本质上就是两个或多个一对多
五、延迟加载
说明:在使用一对多查询时,很多时候只需要前面的信息,不需要后面的关联信息,即首次查询的是主要的班级信息,关联的学生信息在需要的时候再加载,
以减少不必要的数据库开销从而提升程序的效率,这就称为延迟加载
1.一对多延迟加载使用步骤
(1)打开Mybatis配置文件的延迟加载的开关
<configuration>
<properties resource="db.properties">
<settings>
<--将延迟加载设置为ture ,可省略,默认为true-->
<setting name="LazyLoadingEnabled" value="true"/>
<--将立即加载设置为false -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
</configuration>
(2)SQL映射文件
<select id="queryStudentLazyLoad" parameter="int" resultMap="ClassAndStudent">
select * from class
</select> <resultMap type="studentClass" id="ClassAndStudent">
<id property="classid" column="classid"/>
<result property="className" column="className"/>
... //省略其他属性
<collection property="students" ofType="student"
<--通过命名空间+id指定延迟加载执行sql语句-->
select="org.zy.mapper.StudentMapper.queryStudentByClassId" column="classid"/>
</collection>
</resultMap>
StudentMapper.xml配置文件
<mapper namespace="org.zy.mapper.StudentMapper">
//根据班级号码查询学生的信息
<select id="queryStudentByClassId" parmeterType="int" resultType="student">
select * from student where classid=#{classid}
</select>
(3)说明:即通过主查询查询班级信息,然后通过一对多元素映射关联student表,并通过select语句属性指定延迟加载的sql语句
select * from student where classid=#{classid}
(4)修改Mybatis配置文件
<mappers>
<mapper resource="org/zy/mapper/studentMapper.xml"/>
<mapper resource="org/zy/mapper/studentMapper.xml"/>
<mappers>
MyBatis框架之关联查询的更多相关文章
- mybatis一对多关联查询+pagehelper->分页错误
mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: ...
- 三、mybatis多表关联查询和分布查询
前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...
- MyBatis:一对一关联查询
MyBatis从入门到放弃三:一对一关联查询 前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是 ...
- 7.mybatis一对多关联查询
和第5节一对一查询类似,但是不同的是,一对一使用的是association,而一对多使用collection. 实例: 1个班级Class,对应1个老师Teacher,对应多个学生Student 1. ...
- 5.mybatis一对一表关联查询
方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据) SELECT * FROM class c,teacher t WHERE c.tid = t.t ...
- JAVA入门[9]-mybatis多表关联查询
概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...
- mybatis多表关联查询之resultMap单个对象
resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...
- mybatis一对多关联查询——(九)
1.需求: 查询所有订单信息及订单下的订单明细信息. 订单信息与订单明细为一对多关系. 2. sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关 ...
- mybatis多对多关联查询
多对多关系 一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系.所谓多对多关系,其实是由两个互反的一对多关系组成.即多对多关系都会通过一个中间表来建立,例如选课表.学 ...
随机推荐
- Go语言之从0到1实现一个简单的Redis连接池
Go语言之从0到1实现一个简单的Redis连接池 前言 最近学习了一些Go语言开发相关内容,但是苦于手头没有可以练手的项目,学的时候理解不清楚,学过容易忘. 结合之前组内分享时学到的Redis相关知识 ...
- 【MySQL插入更新重复值】ON DUPLICATE KEY UPDATE用法
要插入的数据 与表中记录数据的 惟一索引或主键中产生重复值,那么就会发生旧行的更新 弊端:造成主键自增不连续.适合数据量不大的表. ON DUPLICATE KEY UPDATE后面的条件 eg有如 ...
- oh-my-zsh自定义配置
oh-my-zsh主题配置 默认的zsh主题robbyrussell已经很棒了, 简洁高效, 能很好的显示git的相关信息, 比如branch信息, 修改, 删除, 添加等操作. 但是多用户的话就不能 ...
- python面试题(二)字符串常用函数
今天在微信的公众号上看到了一遍python学习开发的文章,里面有一些python的面试题,碰巧最近python不知道学什么了,索性学一下这篇文章啊!!先写一下一些字符串的常用函数.(ps:本人太菜,若 ...
- JAVA增强for循环
作用:简化数组和集合的遍历 格式:for(元素数据类型 变量 :数组或者集合) 例子: Map map=new HashMap; for(Object obj :map.keySet()){ Obj ...
- 关于c++中的Debug以及runtime_error之segment_fault
差不多每次编一些竞赛类的程序都会至少给我报一次runtime_error(运行时错误).这或许也是广大OIer心中永远的痛.~_~ 本文主要讨论如何对runtime_error以及其中的segment ...
- 如何使用 Docker 安装 Jenkins
说在前面 本篇内容非常简单,仅讲述了如何快速在 Docker 上部署一个 Jenkins 实例,不涉及其他. 本文实验环境: 操作系统:Centos 7.5 Docker Version:18.09. ...
- HDU 6060:RXD and dividing(DFS)
题目链接 题意 给出n个点,要把除1以外的点分成k个集合,然后对于每个集合要和1这个点一起求一个最小生成树,然后问这k个最小生成树的最大总和是多少. 思路 因为每个集合都包含1这个点,因此对于每个点都 ...
- XTOJ 1267:Highway(树的直径)***
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1267 题意:给出一棵树,每条树边有权值,现在要修建n-1条边,边的权值为边 ...
- ZOJ 3953:Intervals(优先队列+思维)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5572 题意:给出n个线段,问最少删除几个线段可以使得任意一个点不会被三个以上的 ...