mybatis 的加载与缓存
在这里我要说一下 我没有亲自去敲案例只是看了 我兄弟的文档 在这里和大家说一下
延迟加载:
所谓延迟加载是什么?
从字面意思理解到的是等一会再加载
从行为分析,他主要是缓解数据库压力,提高性能的意义
所谓延迟加载可以做到,我访问你的时候,我用到你的时候,你再做加载
延迟加载用在关联查询的多条SQL语句上
延迟加载的分类:
直接加载------------》(默认的)这个由于是默认的,所以这个可以不做配置
侵入式延迟加载------------》(需要配置)在执行完第一条sql时候,得到一个对象,没有访问这个对象的任何属性时,不会走第二条SQL,也就是不加载这个对象里包含的其他对象
深度延迟加载--------》(需要配置)在执行完第一条sql时候,得到一个对象,即使访问到这个对象的属性,只要不是那个关联的对象,也不会走第二条sql,当访问这个关联的对象时,走第二条sql,
给这个对象拿到值
下面我把实现延迟加载的方式放到下面,并做小实验,证明我上面说的话
实体类
//Dept类import java.util.ArrayList;
import java.util.List;
/**
* Created by Dawn on 2018/2/26.
*/public class Dept {
private Integer deptNo;
private String deptName;
private List<Emp> emps=new ArrayList<Emp>(); public Integer getDeptNo() {
return deptNo;
} public void setDeptNo(Integer deptNo) {
this.deptNo = deptNo;
} public String getDeptName() {
return deptName;
} public void setDeptName(String deptName) {
this.deptName = deptName;
} public List<Emp> getEmps() {
return emps;
} public void setEmps(List<Emp> emps) {
this.emps = emps;
}
}
//emp类package cn.dawn.demo04.entity; import cn.dawn.demo04.entity.Dept;
/**
* Created by Dawn on 2018/2/26.
*/public class Emp{
private Integer empNo;
private String empName;
private Integer deptNo;
private Dept dept; public Dept getDept() {
return dept;
} public void setDept(Dept dept) {
this.dept = dept;
} public Integer getEmpNo() {
return empNo;
} public void setEmpNo(Integer empNo) {
this.empNo = empNo;
} public String getEmpName() {
return empName;
} public void setEmpName(String empName) {
this.empName = empName;
} public Integer getDeptNo() {
return deptNo;
} public void setDeptNo(Integer deptNo) {
this.deptNo = deptNo;
}
}
接口中使用的方法也就是个简单的根据部门编号返回该部门下全部员工的信息
关注点不在这个方法,而在于一会怎么实现延迟加载和延迟加载的实际效果
/*一对多多条sql*//*延迟加载*/
public Dept findDeptnoALLEmpsMoreSql(Integer deptNo);
接口同名的xml小配置中的代码我也放上去
<!--一对多多条sql--><!--延迟加载--><!--缓存-->
<resultMap id="DeptMoreSqlMapper" type="Dept">
<id column="deptNo" property="deptNo"></id>
<result column="deptName" property="deptName"></result>
<collection property="emps" ofType="Emp" select="findDeptnoALLEmpsMoreSqlEmps" column="deptNo">
<id column="empNo" property="empNo"></id>
<result column="empName" property="empName"></result>
</collection>
</resultMap>
<!--一对多多条sql--><!--延迟加载-->
<select id="findDeptnoALLEmpsMoreSql" resultMap="DeptMoreSqlMapper">
SELECT deptNo,deptName FROM dept WHERE deptNo=#{deptNo}
</select>
<select id="findDeptnoALLEmpsMoreSqlEmps" resultType="Emp">
SELECT * FROM emp where deptNo=#{deptNo}
</select>
lazyLoadingEnabled是延迟加载的开关,默认值是false,不开启,也就是直接加载————————》不要提有些mybatis的api,他里面写错了,你可以去试试
aggressiveLazyLoading是侵入式的开关,默认值是true,开启,如果设置为false,则是深度加载的配置方法,侵入和深度使用有个前提,就是延迟加载的开关要开启,即lazyLoadingEnabled为true
测试方法,我会把对应的延迟加载的配置放开,并附上运行结果,然后解释它
直接加载略,简单讲述一下,就是大配置中的所有setting中的延迟配置都不用配,他只要调用该dao层的方法,就发送俩条sql,把所有查出来
侵入式延迟加载,首先把对应的配置打开(即上面我说的那处,你把我写的那个注释取消掉)
运行结果
用了logback日志监控sql语句,发现在分割线下还有sql在执行了一遍,这就是我上面说的,侵入式延迟加载,在访问这个对象的任何属性时,才会走第二条sql,加载出这个对象里面关联的实体类的
这结果印证了我上面说的一句话,深度延迟,不访问这个对象的关联的那个对象集合时候,不做关联查询操作,不发第二条sql,一旦用到关联的那个对象集合的时候,他就做了 加载操作(关联查询),即发第二条SQL
写在最后的话,使用延迟加载,只有多条sql的关联查询才可以可以,单条的不可以,因为单条做的是表连接,直接一张表一下子就出来数据了
缓存
很熟悉的一个词,什么是缓存?
好多人都不太能解释清楚缓存的概念,运用到缓存的地方大家都很清楚,像什么网站了,视频缓存啊,等等
我从百度百科copy一个缓存的概念,读一下,免得看完这篇博客都对缓存的概念一无所知
缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。
有了一定概念了把,MyBatis中有些实现不同,不过意思相似,不然也不会叫做缓存
MyBatis中一级缓存(他是默认开启的)
在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。
MyBatis缓存里面实则是个hashmap,key值为hashcode+selectId+sql语句,value为查询返回结果的内存地址的引用(指针),
是为了更好的理解编程的灵魂,深入它的全部,才会有所成
mabatis中一级缓存的存在性证明 (存在的),增删改对一级缓存的影响(会清空一级缓存)-----》
mybatis 的加载与缓存的更多相关文章
- 【代码笔记】iOS-实现网络图片的异步加载和缓存
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...
- BaseHttpListActivity,几行代码搞定Android Http列表请求、加载和缓存
Android开发中,向服务器请求一个列表并显示是非常常见的需求,但实现起来比较麻烦,代码繁杂. 随着应用的更新迭代,这种需求越来越多,我渐渐发现了实现这种需求的代码的共同点. 于是我将Activit ...
- js的动态加载、缓存、更新以及复用(四)
本来想一气呵成,把加载的过程都写了,但是卡着呢,所以只好在分成两份了. 1.页面里使用<script>来加载 boot.js . 2.然后在boot.js里面动态加载 bootLoad.j ...
- Android图片加载与缓存开源框架:Android Glide
<Android图片加载与缓存开源框架:Android Glide> Android Glide是一个开源的图片加载和缓存处理的第三方框架.和Android的Picasso库类似,个人感觉 ...
- iOS网络加载图片缓存策略之ASIDownloadCache缓存优化
iOS网络加载图片缓存策略之ASIDownloadCache缓存优化 在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...
- iOS网络编程(三) 异步加载及缓存图片---->SDWebImage
@SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https:// ...
- Android新浪微博客户端(七)——ListView中的图片异步加载、缓存
原文出自:方杰|http://fangjie.info/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54 该项目代码已经放到git ...
- Android 加载gif图片强大框架(支持预加载、缓存,还支持显示静态图片,一行代码全搞定)
之前项目中没有涉及到显示gif图片的功能,也没有着重研究过,最近项目中要用到显示gif图片,于是就在网上一顿搜,用过之后发现如下几个缺点. 1.加载大的gif图片会出现oom. 2.没有预加载和缓存功 ...
- Android艺术——Bitmap高效加载和缓存代码分析(2)
Bitmap的加载与缓存代码分析: 图片的压缩 比如有一张1024*768像素的图像要被载入内存,然而最终你要用到的图片大小其实只有128*96,那么我们会浪费很大一部分内存,这显然是没有必要的,下面 ...
随机推荐
- mac安装以及删除mysql5.7
关于msyql5.7,安装时最大的改变就是有了一个默认密码 我安装的是mysql-5.7.17-macos10.12-x86_64.dmg 和mysql-workbench-community-6.3 ...
- 1084 矩阵取数问题 V2
1084 矩阵取数问题 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下 ...
- SpringBoot使用H2内嵌数据库
1.驱动 我们知道,JDBC是JDK自带的接口规范,不同的数据库有不同的实现,只需要引入相应的驱动包即可. 在使用MySQL数据库时,引入的是MySQL驱动,相应的,使用H2数据库时,也需要引入H2驱 ...
- OC中nil、Nil、NULL、NSNull的区别
nil:指向OC中对象的空指针 e.g.: NSString *string = nil; Nil:指向OC中类的空指针 e.g.:Class class = Nil; NULL:指向其他类型的 ...
- 【python】-- Django Form
Django Form Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容(自定义样式) 一.F ...
- JVM 指令讲解
挺有意思的 转载记录下 转载自 https://www.cnblogs.com/f1194361820/p/8524666.html 原作者: 房继诺 JVM 指令 1.Demo 2.Clas ...
- MySQL中InnoDB脏页刷新机制Checkpoint
我们知道InnoDB采用Write Ahead Log策略来防止宕机数据丢失,即事务提交时,先写重做日志,再修改内存数据页,这样就产生了脏页.既然有重做日志保证数据持久性,查询时也可以直接从缓冲池页中 ...
- 000-mysql小技巧
1.使用Navicat 链接5.7版本出现 mysql 5.7.9 [Err] 1055报错解决,[Err] 1055 – Expression #1 of ORDER BY clause is no ...
- Windows.old
如果通过执行自定义安装来安装 Windows 7,而没有在安装过程中格式化分区,则以前版本的 Windows中使用的文件存储在 Windows.old文件夹中.此文件夹中文件的类型取决于您的电脑.使用 ...
- Python函数之—— 装饰器(Day13)
一.什么是装饰器 顾名思义,装饰器指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二.装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数 ...