mybatis学习(55):延迟加载

MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推迟对关联对象的select查询。延迟加载可以有效的减少数据库压力。

    注意:MyBatis的延迟加载只是对关联对象的查询有延迟设置,对于主加载对象都是直接执行查询语句的。

一、关联对象加载时机

、关联对象加载时机

MyBatis根据对关联对象查询的select语句的执行时机,分为三种类型:直接加载、侵入式加载与深度延迟加载

    直接加载:执行完对主加载对象的select语句,马上执行对关联对象的select查询。
    侵入式延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情时,就会马上执行关联对象的select查询。即对关联对象的查询执行,侵入到了主加载对象的详情访问中。也可以这样理解:将关联对象的详情侵入到了主加载对象的详情中,即将关联对象的详情作为主加载对象的详情的一部分出现了。
    深度延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的select查询。

    注意:延迟加载的应用要求,关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能是使用多表连接所进行的select查询。因为,多表连接查询,其实质是对一张表的查询,对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来。

二、直接加载

1.主配置文件(Mybatis.xml)

全局属性lazyLoadingEnabled的值只要设置为false,那么,对于关联对象的查询,将采用直接加载。即在查询过主加载对象后,会马上查询关联对象。

lazyLoadingEnabled的默认值为false,即直接加载。

<settings><!-- 延迟加载总开关 --><setting name="lazyLoadingEnabled" value="false"/>
</settings>

2.mapper映射文件 

<mapper namespace="com.hcx.dao.IMinisterDao"><select id="selectCountryById" resultType="Country">select cid,cname from country where cid=#{cid}</select><resultMap type="Minister" id="ministerMapper"><id column="mid" property="mid"/><result column="mname" property="mname"/><association property="country"javaType="Country"select="selectCountryById"column="countryId"/></resultMap><select id="selectMinisterById" resultMap="ministerMapper">select mid,mname,countryId from minister where mid=#{mid}</select>
</mapper>

3.测试类:

当程序执行到断点处语句时,不仅对country表进行了查询,对minister表也同时进行了查询。

 

public class MyTest {private ICountryDao dao;private SqlSession session;@Beforepublic void setUp(){session = MyBatisUtils.getSqlSession();dao = session.getMapper(ICountryDao.class);}@Afterpublic void tearDown(){if(session!=null){session.close();}}@Testpublic void test01(){       Country country = dao.selectCountryById(2);//此处加断点System.out.println(country);System.out.println(country.getMinisters().size());}
}

三、深度延迟加载

修改主配置文件的,将延迟加载开关lazyLoadingEnabled开启(置为true),将侵入式延迟加载开关aggressiveLazyLoading关闭(置为false)。

 

<settings><!-- 延迟加载总开关 --><setting name="lazyLoadingEnabled" value="true"/><!-- 侵入式延迟加载开关 --><setting name="aggressiveLazyLoading" value="false"/>
</settings>

 此时,只有当代码执行到输出Minister对象详情时,底层才执行select语句对minister表进行查询。

四、侵入式延迟加载

修改主配置文件的,将延迟加载开关lazyLoadingEnabled开启(置为true),将侵入式延迟加载开关aggressiveLazyLoading也开启(置为true,默认为true)。

 

<settings><!-- 延迟加载总开关 --><setting name="lazyLoadingEnabled" value="true"/><!-- 侵入式延迟加载开关 --><setting name="aggressiveLazyLoading" value="true"/>
</settings>

 测试类

@Test
public void test01(){       Country country = dao.selectCountryById(2);//此处加断点System.out.println(country);System.out.println(country.getMinisters().size());
}

当代码执行断点处语句时会立即查询country表,但每查询minister表。说明现在的延迟加载已经启动。
当对country对象的详情进行访问时,对minister表也进行了查询。因为该延迟加载策略已经将主加载对象的关联属性也作为主加载对象的基本信息了,而前面已经查询出了主加载对象的基本信息,但其关联对象基本信息尚无。所以,马上进行对minister表的查询。
换个角度来说,该延迟策略使关联对象的数据侵入到了主加载对象的数据中,所以称为侵入式延迟加载。

    注意:该延迟策略也是一种延迟加载,需要在延迟加载开关lazyLoadingEnabled开启时才会起作用。若lazyLoadingEnabled为false,则aggressiveLazyLoading无论取何值,均不起作用。

 

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

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

相关文章

sqoop操作之Oracle导入到HDFS

导入表的所有字段 sqoop import --connect jdbc:oracle:thin:192.168.1.100:1521:ORCL \ --username SCOTT --password tiger \ --table EMP -m 1; 查看执行结果&#xff1a; hadoop fs -cat /user/hadoop/EMP/part-m-00000 7369,SMITH,CLERK,7902,1980-12-17 00:00:00.0,800,n…

three20 TTTableViewController + TTActionSheetController

1. 首页要实现TTActionSheetControllerDelegate interface TSPublishViewController : TTTableViewController<TTActionSheetControllerDelegate> {CATETYPE _cateType; } property(nonatomic,assign)CATETYPE cateType;end 2. 在init中声明URLMAP规则 - (id)initWithNib…

如果没有,那么就去创造

上周末在回北京的路上&#xff0c;看到一个广告牌&#xff0c;上面有一句&#xff1a;“如果没有&#xff0c;那么就去创造”。 是啊&#xff0c;自己的生活只能靠自己创造&#xff0c;从无到有。转载于:https://www.cnblogs.com/skogkatt/archive/2008/09/10/4163277.html

Java枚举类型 enum

定义 An enum type is a special data type that enables for a variable to be a set of predefined constants. The variable must be equal to one of the values that have been predefined for it.枚举类型是一种特殊数据类型&#xff0c;能够为一个变量定义一组预定义的常…

ps学习1:去除图片上的文字

首先我们看到如图所示的图&#xff0c;这个时候我们要给他右上角的文字去除 首先打开我们的ps工具--我登陆的在线ps教程 https://www.uupoop.com/ 点击编辑---填充 保存 完成修改

Git学习(3)GitHub和SVN的区别

GitHub和SVN的区别 之前用的版本控制系统是SVN&#xff0c;但是最近因为流行使用GitHub&#xff0c;这篇文章认识一下Git和SVN的区别。 1&#xff09;Git是分布式的&#xff0c;SVN不是&#xff1a; 这 是git和其它非分布式的版本控制系统&#xff0c;例如SVN&#xff0c;CVS等…

位运算 中度难度 子集

怎样将一个字符串中的单词单独存放在一个单词数组里&#xff1f; #include <iostream> #include <cstdio> #include <vector> #include <sstream> #include <string> using namespace std; int main() {string str[100];string str1 "i lo…

python3获取两个日期之间所有日期,以及比较大小

原创 2017年10月09日 14:00:14标签&#xff1a;python 1370 [python] view plaincopy import datetime [python] view plaincopy #获取两个日期间的所有日期 def getEveryDay(begin_date,end_date): date_list [] begin_date datetime.datetime.strptime(be…

关于换行符

在正则表达式中&#xff0c;有一个\n是newline的意思&#xff0c;又有一个\r是carriage return(就是这个导致了白痴中文翻译"回车")的意思 在处理String或者console输出的时候&#xff0c;无论带上哪个都能换行。 但是偏偏在txt中&#xff0c;哪个都不是标准的换行&a…

Java面试题15牛客 以下关于Integer与int的区别错误的是

Java面试题15牛客 以下关于Integer与int的区别错误的是 A int是java提供的8种原始数据类型之一 B Integer是java为int提供的封装类 C int的默认值为0 D Integer的默认值为1 懵逼树上懵逼果&#xff0c;懵逼树下你和我&#xff0c;这题难度一般&#xff0c;很显然&#xff…

用示例说明BitMap索引的效率要优于B-Tree索引

一、实验说明&#xff1a; 操作系统&#xff1a;rhel 5.4 x86 数据库&#xff1a;Oracle 11g R2 二、操作步骤&#xff1a; 首先创建一张t_btree表&#xff0c;并建立B-Tree索引&#xff0c;索引键是status&#xff1a; 1 SQL> create table t_btree as select * from dba_o…

使用grep -v时候,想去除多个pattern

使用grep -v时候&#xff0c;想去除多个pattern 原创 2014年05月27日 14:01:033845 grep -v with multiple patternsgrep test somefile | grep -v -e error -e critical -e warninggrep test somefile | grep -vE (error|critical|warning)grep test somefile | grep -vE err…

ISA Server 2004 0x80004005错误

客户的一台ISA Server EE中文版&#xff0c;运行服务器管理出现如下问题&#xff1a; “ISA服务器无法加载属性页”详细信息“错误&#xff1a;0x80004005未指定的错误”点“继续”后提示“管理单元初始化失败”&#xff0c;“确定”后再次弹出“ISA服务器无法加载属性页”的提…

Java面试题16 牛客 以下java程序代码,执行后的结果是()

Java面试题16 牛客 以下java程序代码&#xff0c;执行后的结果是&#xff08;&#xff09; 1 2 3 4 5 6 7 8 9 10 public class Test { public static void main(String[] args) { Object o new Object() { public boolean equals(Object o…

Singularity 介绍

"...it is impossible to predict how a singularity will affect objects in its causal future." - NCSA Cyberia Glossary 一些有用的连接&#xff1a; Microsoft Research Singularity Project Singularity RDK Singularity: Rethinking Dependable System De…

Hive压缩说明

为什么要压缩 在Hive中对中间数据或最终数据做压缩&#xff0c;是提高数据吞吐量和性能的一种手段。对数据做压缩&#xff0c;可以大量减少磁盘的存储空间&#xff0c;比如基于文本的数据文件&#xff0c;可以将文件压缩40%或更多。同时压缩后的文件在磁盘间传输和I/O也会大大减…

Java面试题17 牛客 下面哪个选项正确创建socket连接?

Java面试题17 牛客 下面哪个选项正确创建socket连接&#xff1f; Socket s new Socket(8080); Socket s new Socket(“192.168.1.1”,8080) SocketServer s new Socket(8080); Socket s new SocketServer(“192.168.1.1”,8080) 懵逼树上懵逼果&#xff0c;懵逼树下你…

视频素材网站

http://soft.dvedit.cn/soft/05/down-2172.html 转载于:https://www.cnblogs.com/liuguanghuiyes/archive/2008/10/04/1303830.html

kubelet源码学习(一):kubelet工作原理、kubelet启动过程

本文基于Kubernetes v1.22.4版本进行源码学习 1、kubelet工作原理 1&#xff09;、kubelet核心工作 kubelet的工作核心就是一个控制循环&#xff0c;即&#xff1a;SyncLoop&#xff08;图中的大圆圈&#xff09;。而驱动这个控制循环运行的事件&#xff0c;包括&#xff1a;P…

算法导论课后习题解析 第四章 下

4.5-1a) $$a2,b4,f(n)\Theta(1),\log_b a \frac 12 \gt 0 $$ 符合情况1&#xff0c;$ T(n) \Theta (n^{1/2})$ b) $$a2,b4,f(n)\Theta(n^{1/2}),\log_b a \frac 12 $$ 符合情况2&#xff0c;$ T(n) \Theta (n^{1/2}\lg n)$ c) $$a2, b4, f(n)\Theta(n),\log_b a \frac 1…