MyBatis的延迟加载和缓存机制
延迟加载:
什么是延迟加载:
MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推迟对关联对象的select查询。延迟加载可以有效的减少数据库压力。
MyBatis根据对关联对象查询的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;
@Before
public void setUp(){
session = MyBatisUtils.getSqlSession();
dao = session.getMapper(ICountryDao.class);
}
@After
public void tearDown(){
if(session!=null){
session.close();
}
}
@Test
public void test01(){
Country country = dao.selectCountryById(2);
//此处加断点
System.out.println(country);
System.out.println(country.getMinisters().size());
}
}
深度延迟加载:
修改主配置文件的,将延迟加载开关lazyLoadingEnabled开启(置为true),将侵入式延迟加载开关aggressiveLazyLoading关闭(值为false)。
此时,只有当代码执行到输出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无论取何值,均不起作用。
原文链接:https://blog.csdn.net/qq_35242910/article/details/78136435
MyBatis缓存:
使用缓存可以使应用更快地获取数据,避免和数据库的频繁地交互,尤其是在查询越多、缓存命中率越高的情况下,使用缓存的作用也就越明显。MyBatis作为持久性的ORM框架,提供了非常强大的查询缓存特性,可以非常方便的配置和使用。
MyBatis查询缓存机制。根据缓存区的作用域与生命周期,可划分两种
一级缓存
二级缓存
MyBatis查询缓存的作用域是根据映射文件的namespace去划分的,相同的namespace的mapper查询放在同一个缓存区域。不同的namespace下的数据互不干扰。
无论是一级缓存还是二级缓存,都是按照namespace进行分别存放的。
一级、二级缓存的不同之处在于,SqlSession对象一旦关闭,则SqlSession中的数据将不存在,即一级缓存就不复存在。
而二级缓存的生命周期与整个应用同步,与SqlSession是否关闭无关。
换句话说,一级缓存是在同一个线程(同一SqlSession)间共享数据,而二级缓存是在不同线程(不同的SqlSession)间共享数据。
一级缓存:
- 一级缓存真实存在,无需配置
- 一级缓存的依据是ID+SQL字句
- 增删改会清空一级缓存
二级缓存:
- 二级缓存不比一级缓存,需要在configuration.xml中手动开启。
- 二级缓存是全局应用级别的缓存,即使关闭了session仍能使用。
- 如果一个select标签想要局部关闭二级缓存,需要设置useCache=false
- 二级缓存不能使用注解方法配置
- 如果在执行增删改操作的过程中不刷新缓存,须设置flushCache=false
MyBatis的延迟加载和缓存机制的更多相关文章
- Mybatis(五) 延迟加载和缓存机制(一级二级缓存)
踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮. --WH 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的 ...
- Mybatis学习(五)————— 延迟加载和缓存机制(一级二级缓存)
一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的数据的话,就不查询从表的信息.所以这就是突出了懒这个特点.真是懒啊. Mybati ...
- Mybatis的延迟加载和缓存
1. MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力. 注意:MyBatis的延迟加 ...
- MyBatis --- 动态SQL、缓存机制
有的时候需要根据要查询的参数动态的拼接SQL语句 常用标签: - if:字符判断 - choose[when...otherwise]:分支选择 - trim[where,set]:字符串截取,其中w ...
- Mybatis 事务管理和缓存机制
一级缓存--SqlSession级别 数据库表tb_user User package com.example.demo.domain; public class User { private Int ...
- mybatis 配置延迟加载 和 缓存
<!-- MyBatis延迟加载时,创建代理类 --> <dependency> <groupId>cglib</groupId> <artifa ...
- 《深入理解mybatis原理4》 MyBatis缓存机制的设计与实现
<深入理解mybatis原理> MyBatis缓存机制的设计与实现 本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存 ...
- 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现
本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存 ...
- Spring Boot2(二):使用Spring Boot2集成Mybatis缓存机制
前言 学习SpringBoot集成Mybatis的第二章,了解到Mybatis自带的缓存机制,在部署的时候踩过了一些坑.在此记录和分享一下Mybatis的缓存作用. 本文章的源码再文章末尾 什么是查询 ...
随机推荐
- Github第三方登陆详细流程
一. 流程图 二.具体实现步骤 Ⅰ.创建OAuth App 我们首先需要创建一个OAuth App,根据下图的步骤点击即可 依次填写信息,然后点Register application 然后我们可以看 ...
- 配置 Docker 加速器
Linux curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io ...
- MySQL必知必会官方提供的数据库和表
创建表 Create customers table CREATE TABLE customers ( cust_id int NOT NULL AUTO_INCREMENT, cust_name c ...
- MySQL优化---主从复制
主机所有写的数据都会生成二进制SQL日志执行文件,从机只需要将SQL日志执行文件获取到,然后进行数据同步即可 一.MySQL环境搭建(一主一从相同操作) MySQL-master:192.168.33 ...
- JVM性能优化系列-(4) 编写高效Java程序
4. 编写高效Java程序 4.1 面向对象 构造器参数太多怎么办? 正常情况下,如果构造器参数过多,可能会考虑重写多个不同参数的构造函数,如下面的例子所示: public class FoodNor ...
- 学习Sparql
一 . gstore--一种开源图数据库系统 https://www.docin.com/p-1951514687.html 二 . 使用 SPARQL 查询 RDF 数据 https://www.i ...
- docker 修改 bridge网桥网段
首先停止正在使用的 Docker 服务: $ sudo service docker stop 接着删除 Docker 默认网桥 docker0 : $ sudo ip link set dev do ...
- 为什么Linux 实例执行 df 和 du 查看磁盘时结果不一致
问题现象 执行 df -h 查看 ECS Linux 实例文件系统使用率,可以看到 /dev/xvdb1 磁盘占用了约27G,挂载目录为 /opt . 进入到 /opt 目录执行 du -sh ,显示 ...
- 第三篇 SpringBoot整合log4j2详解
源代码:https://pan.baidu.com/s/1d1Lwv1gIvVNltIKVWeEseA 提取码:wff0 SpringBoot整合Log4j2步骤: 1.删除spring-boot-s ...
- Happycorp:1 Vulnhub Walkthrough
靶机链接: https://www.vulnhub.com/entry/happycorp-1,296/ 网络主机扫描::: 主机端口扫描: NFS文件系统,尝试挂载试试 mount -t nfs 1 ...