Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MyBatis之级联小结

MyBatis之级联小结

作者头像
用户1148394
发布于 2018-01-09 09:13:07
发布于 2018-01-09 09:13:07
75700
代码可运行
举报
文章被收录于专栏:余林丰余林丰
运行总次数:0
代码可运行

在这之前我们知道了MyBatis为我们提供了三种级联:一对一关系(assocation)、一对多关系(collection)、鉴别器(discriminator)。在最后一个鉴别器例子中,看到了当层级关系比较负责时,我们似乎已经难以应对和维护各种级联关系,在对数据库进行查询是否应用MyBatis为我们提供的级联这需要在实际中去斟酌和取舍。在我们通过级联来查询信息时会发现有一个问题,当我们只想查询出学生的普通信息(姓名、性别),而不想查询出他的成绩、课程、体检表时,之前的三个例子不管你是否需要成绩、课程等信息它都会去执行,只要有一个关联。这并不是我们所想要的,我们所想要的是,我需要时才去执行这条sql,我需要成绩时才将此条sql发送到数据库查询出结果,不需要时就不需要发送到数据库进行查询。很高兴的是,MyBatis为我们提供了这一需求,即:lazyLoadingEnabled。

我们在mybatis-config.xml配置文件中做一下配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<settings>
    <setting name="lazyLoadingEnabled" value="true"/><!-- 开启懒加载模式(按需加载),默认情况下是即时加载 -->
</settings>

这句话的意思就是我们上面所要想达到的效果——按需加载。但其实只有这么一句话是不够的,MyBatis的延迟加载方式是按层级延迟加载。

image.png
image.png

当我们在查询学生的基本信息时,MyBatis会根据鉴别器去找到健康情况。而在当我们访问课程成绩时,由于学生证和课程成绩出于同一层级,所以学生证也会跟着被加载。只有课程不是和课程成绩出于同一层级,所以它不会被加载。这还没有达到我们想要的“按需加载”效果,我们所想要达到的按需加载是真正只有用到的时候才会去加载。这个时候就需要在刚刚的配置文件中再做以下的配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<settings>
    <setting name="lazyLoadingEnabled" value="true"/><!-- 开启懒加载模式(按需加载),默认情况下是即时加载 -->
    <setting name="aggressiveLazyLoading" value="false"/></settings>

attressiveLazyLoading配置项,意思就是这个意思——侵略性延迟加载。

这实际上是在mybatis-config.xml文件中做的全局配置,当想要针对某些属性进行延迟加载,对某些属性进行立即加载时,我们可以细化到具体的mapper映射配置文件中去。例如StudentMapper.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper  
 3   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
 4   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="day_8_mybatis.mapper.StudentMapper">
 6     <resultMap type="day_8_mybatis.pojo.Student" id="studentMap">
 7         <id property="id" column="id"/>
 8         <result property="name" column="name"/>
 9         <result property="sex" column="sex"/>
10         <association property="selfCard" column="id" select="day_8_mybatis.mapper.SelfCardMapper.findSelfCardByStudentId" fetchType="lazy"/>
11         <collection property="courseScoreList" column="id" select="day_8_mybatis.mapper.CourseScoreMapper.findCourseScoreByStudentId" fetchType="eager"/>
12         <discriminator javaType="string" column="sex">
13             <case value="男" resultMap="maleStudentMap"/>
14             <case value="女" resultMap="femaleStudentMap"/>
15         </discriminator>
16     </resultMap>
17 <!--以下省略-->

在第10行中我们对查询出学生的学生证信息配置为延迟加载,第11行中我们对查询出学生的课程成绩做了立即加载配置。

以上几乎就是MyBatis级联的全部内容,至于用级联还是用sql的join语句只有在实际中去认真仔细考量和权衡。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-11-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入浅出MyBatis:「映射器」全了解
上一篇总结了MyBatis的配置,详细说明了各个配置项,其中提到了映射器,它是MyBatis最强大的工具,也是使用最多的工具。
情情说
2018/04/27
9740
深入浅出MyBatis:「映射器」全了解
MyBatis之级联——鉴别器
鉴别器(discriminator)是MyBatis为我们提供的第三个级联也是最后一个。基于之前两篇级联中的场景,现增加学生们去体检,但男女体检项目不一样,我们把男女体检表做成两张表,当然我想也可以设计为一张表,只有女生的项目男生不填就行了,为了讲解鉴别器就把男女体检表分开。鉴别器的作用在这里就是根据性别的不同去不同的表里进行查询体检情况,例如是男生就在男生体检表里查询,是女生就在女生体检表里查询。 POJO类我们也分为了男生、女生,他们分别继承之前的Student类。 MaleStudent类: 1 p
用户1148394
2018/01/09
6270
MyBatis之级联——一对一关系
在学数据库概论的时候会听到这么几个词:数据库的关系分为一对一、一对多、多对多。对于在学校里学的知识已经忘得差不多了,在这里简单的提一下数据库的关系。此篇是介绍MyBatis是如何实现数据库中一对一关系的,我们就暂且先介绍一对一关系。所谓一对一关系其实在生活中很常见,比如一个学生有且只对应一个属于他的学生证。下面就是我们的所假设的数据库物理模型。 image.png 在这个数据库模型中,学生证和学生表是1对1的关系。那么基于此,我们会在Java代码的POJO包中就会有两个POJO对象,Student和Sel
用户1148394
2018/01/09
6360
MyBatis之级联——一对一关系
【MyBatis框架点滴】——MyBatis延迟加载
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/51590638
DannyHoo
2018/09/13
4180
【MyBatis框架点滴】——MyBatis延迟加载
MyBatis之级联——一对多关系
上次我们讲到了MyBatis的一对一关系的表示,简单回顾一下一对一关系就是一个学生只有一个学生证。那么什么是一对多关系呢?一个学生有多个课程这就是一对多的关系。我们结合上一章中的学生和学生证,在此基础
用户1148394
2018/01/09
8300
MyBatis之级联——一对多关系
MyBatis-延迟加载与MyBatis缓存(面试题)
 resultMap中的association(has a)和collection(has some)标签具有延迟加载的功能。  延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。需要关联信息时再去按需加载关联信息。这样会大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
全栈程序员站长
2022/08/31
3270
MyBatis-延迟加载与MyBatis缓存(面试题)
Mybatis深入了解(七)----延迟加载
resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。resultType无法实现延迟加载。 延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快。
令仔很忙
2018/09/14
3500
Mybatis 入门 (二)
resultMap:当查询字段名与Bean对象属性名不一致时,需要配置resultMap与Bean属性的对应关系,才能映射
晚上没宵夜
2020/03/11
3520
MyBatis框架:第八章:自定义结果集,一对一,一对多,延迟加载,赖加载
13.1、自定义结果集介绍 自定义结果集,可以给复杂的对象使用。也就是对象内又嵌套一个对象。或者一个集合。 在这种情况下。前面学过的知识点,已经无法直接获取出对象内对象的信息。 这个时候就需要使用resultMap自定义结果集来返回需要的数据。
Java廖志伟
2022/09/28
3550
MyBatis框架:第八章:自定义结果集,一对一,一对多,延迟加载,赖加载
Mybatis系列第9篇:延迟加载、鉴别器、继承怎么玩?
Mybatis系列目标:从入门开始开始掌握一个高级开发所需要的Mybatis技能。
路人甲Java
2020/02/11
6290
mybatis 详解(八)------ 懒加载
IT可乐
2018/01/04
1.3K1
mybatis 详解(八)------ 懒加载
MyBatis 延迟加载(懒加载)一篇入门
前面一篇文章,介绍了多表查询,在实际使用中,我们会经常性的涉及到多表联合查询,但是有时候,并不会立即用到所有的查询结果,我来举两个例子:
BWH_Steven
2020/02/20
6.7K4
MyBatis结果集映射
1.typeAliases标签,该标签用于配置全局的别名,配置别名后则不再需要写全名,在映射文件中只需要写配置的别名即可,例如:
端碗吹水
2020/09/23
8350
MyBatis结果集映射
八、(了解即可)MyBatis懒加载(或者叫延迟加载)
比如user表和role表有关联关系,有这样一条语句:查询uesr的同时将user的某一列数据作为参数一并查询role表符合条件的数据,mybatis里叫做级联。只要执行这条语句,就会将这两张表符合需求的信息一起加载出来。而懒加载只会加载uesr表的数据出来不加载role表的数据。
刘大猫
2025/02/28
1170
mybatis的延迟加载
OrderMapper.xml文件的配置: <!-- 2 延迟加载resultMap的配置 --> <resultMap type="com.shi.pojo.Order" id="selectOrderLazyLodingFindUser"> <!-- 对订单信息进行映射配置 --> <id column="id" property="id"/> <result column="user_id" property="user_id"/> <result column="number"
用户5927264
2019/07/31
1.2K0
MyBatis中表的映射关系
此时已经根据员工的id 查询出了相关的员工信息 , 接下来就是根据员工信息中的dept_id字段来查询出对应的部门的信息
用户11097514
2024/05/30
1770
MyBatis(2)——MyBatis 深入学习
编写日志输出环境配置文件 在开发过程中,最重要的就是在控制台查看程序输出的日志信息,在这里我们选择使用 log4j 工具来输出: 准备工作: 将【MyBatis】文件夹下【lib】中的 log4j 开头的 jar 包都导入工程并添加依赖。 在【src】下新建一个文件 log4j.properties 资源: # Global logging configuration # 在开发环境下日志级别要设置成 DEBUG ,生产环境设为 INFO 或 ERROR log4j.rootLogger=DEBUG
我没有三颗心脏
2018/04/26
8960
MyBatis(2)——MyBatis 深入学习
_Mybatis分解式查询
也可以使用分解式查询,即将一个连接Sql语句分解为多条Sql语句,如: # 查询班级时关联查询出学生
会洗碗的CV工程师
2023/11/20
1430
_Mybatis分解式查询
Mybatis分解式查询
一、Mybatis一对多分解式查询 分解式查询就是将一条Sql语句拆分成多条 在MyBatis多表查询中,使用连接查询时一个Sql语句就可以查询出所有的数据。如: # 查询班级时关联查询出学生 select *    from classes    left join student    on student.classId = classes.cid 也可以使用分解式查询,即将一个连接Sql语句分解为多条Sql语句,如: # 查询班级时关联查询出学生 select * from
会洗碗的CV工程师
2023/04/12
3900
Mybatis分解式查询
XML 映射文件
官方文档:insert、update、delete (opens new window)
用户9615083
2022/12/25
1.9K0
XML 映射文件
相关推荐
深入浅出MyBatis:「映射器」全了解
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档