MyBatis之级联小结

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

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

<settings>
    <setting name="lazyLoadingEnabled" value="true"/><!-- 开启懒加载模式(按需加载),默认情况下是即时加载 -->
</settings>

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

image.png

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

<settings>
    <setting name="lazyLoadingEnabled" value="true"/><!-- 开启懒加载模式(按需加载),默认情况下是即时加载 -->
    <setting name="aggressiveLazyLoading" value="false"/></settings>

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

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

 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语句只有在实际中去认真仔细考量和权衡。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Brian

Effective Debugging-高效调试

概述 最近在看《Effective Debugging》,作者(Diomidis Spinellis)将30多年的系统开发和调试的经验融入到书中,从策略、方法以...

36580
来自专栏ThoughtWorks

2015.5 技术雷达 | 工具篇

(点击图片可以查看大图) 尽管依赖管理的概念并不新奇,在很多技术栈下它甚至已经被作为一种基础开发实践,但在PHP 社区却并非如此。Composer(getcom...

38550
来自专栏欧阳大哥的轮子

关于Windows编程系列

接触Windows编程大概是从2000年左右开始,一直持续到2008年。这中间在学习的过程中也留下了不少的笔记,在网络资源不是那么发达的情况下很多资料都是从MS...

11730
来自专栏互联网高可用架构

如何设计一款多场景分布式发号器(Vesta)

46230
来自专栏CSDN技术头条

高性能智能日志实践

本文作者是 Archanaa Panda ,从 2000 以来一直在软件开发(构架、设计和编程)团队担任 Java / JavaEE 构架师,目前立志于做一个与...

264100
来自专栏FreeBuf

关于Fuzz工具的那些事儿

前段时间一直在研究fuzz工具,这里就写篇文章总结一下下。 在安全测试中,模糊测试(fuzz testing)是一种介于完全的手工渗透测试与完全的自动化测试之间...

1.6K50
来自专栏北京马哥教育

15个NoSql数据库

随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站,特别是...

42180
来自专栏程序人生

如何使用一门新的语言

在去年的文章里,我谈了 如何学习一门新的技术。那篇文章通篇形而上,讲大道理,读者颔首称赞,但回过头来在应用层面还是懵懵懂懂,不明就里。今天,我就我过去三周的经验...

29560
来自专栏CSDN技术头条

服务端接口自动化测试工具大全及适配环境解析

在互联网时代,服务端测试已经成为一个重要的产品保障手段,各对此公司实施的方法和技术也不同,本文我们就来讨论一下。 互联网服务端接口自动化是各个公司都需要一部分业...

72860
来自专栏EAWorld

微服务模式系列之八:第三方注册

译者自序: 熟悉我的朋友都知道,我很不喜欢翻译东西,因为在两种语言的思维方式之间做频繁切换对我来说是件很痛苦的事情。但是这次不一样,公司和同事的大力支持降低了我...

28180

扫码关注云+社区

领取腾讯云代金券