SSM-MyBatis-16: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>
这个和之前用到的并没有什么不同,延迟加载在这儿并没有配置
接下来是大配置的配置,
<!--直接加载-->
<!--不用配置就是直接加载-->
<!--侵入式延迟-->
<!--<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
</settings>-->
<!--深度延迟-->
<!--<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>-->
我说一下这个怎么用,如果是你想要的方式,把他中文注释下的代码放开即可,
lazyLoadingEnabled是延迟加载的开关,默认值是false,不开启,也就是直接加载————————》不要提有些mybatis的api,他里面写错了,你可以去试试
aggressiveLazyLoading是侵入式的开关,默认值是true,开启,如果设置为false,则是深度加载的配置方法,侵入和深度使用有个前提,就是延迟加载的开关要开启,即lazyLoadingEnabled为true
=========================高贵的分割线=====================================================================================================================
测试方法,我会把对应的延迟加载的配置放开,并附上运行结果,然后解释它
直接加载略,简单讲述一下,就是大配置中的所有setting中的延迟配置都不用配,他只要调用该dao层的方法,就发送俩条sql,把所有查出来
侵入式延迟加载,首先把对应的配置打开(即上面我说的那处,你把我写的那个注释取消掉)
测试方法
/*一延迟加载*/
@Test
public void t1LongtimeLoad(){
SqlSession session= MyBatisUtils.getSession(); IDeptDAO mapper = session.getMapper(IDeptDAO.class);
Dept depts = mapper.findDeptnoALLEmpsMoreSql(); System.out.println("====================================分割线===============================");
/*侵入式延迟*/
System.out.println(depts.getDeptName()+"================"+depts.getDeptNo());
/*深度延迟*/
/*System.out.println(depts.getEmps().size());*/ session.close(); }
运行结果

用了logback日志监控sql语句,发现在分割线下还有sql在执行了一遍,这就是我上面说的,侵入式延迟加载,在访问这个对象的任何属性时,才会走第二条sql,加载出这个对象里面关联的实体类的
集合对象
下面是深度延迟-------》同样把大配置的深度延迟打开,把上面那个注释掉
测试方法
/*一延迟加载*/
@Test
public void t1LongtimeLoad(){
SqlSession session= MyBatisUtils.getSession(); IDeptDAO mapper = session.getMapper(IDeptDAO.class);
Dept depts = mapper.findDeptnoALLEmpsMoreSql(); System.out.println("====================================分割线111111==============================="); /*深度延迟*/
System.out.println(depts.getDeptName()+"================"+depts.getDeptNo());
System.out.println("====================================分割线222222===============================");
System.out.println(depts.getEmps().size()); /*侵入式延迟*/
/*System.out.println(depts.getDeptName()+"================"+depts.getDeptNo());*/
session.close(); }
运行结果

这结果印证了我上面说的一句话,深度延迟,不访问这个对象的关联的那个对象集合时候,不做关联查询操作,不发第二条sql,一旦用到关联的那个对象集合的时候,他就做了 加载操作(关联查询),即发第二条SQL
写在最后的话,使用延迟加载,只有多条sql的关联查询才可以可以,单条的不可以,因为单条做的是表连接,直接一张表一下子就出来数据了
SSM-MyBatis-16:Mybatis中延迟加载的更多相关文章
- SSM框架之Mybatis(7)延迟加载、缓存及注解
Mybatis(7)延迟加载.缓存及注解 1.延迟加载 延迟加载: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. **好处:**先从单表查询,需要时再从关联表去关 ...
- 后端分页神器,mybatis pagehelper 在SSM与springboot项目中的使用
mybatis pagehelper想必大家都耳熟能详了,是java后端用于做分页查询时一款非常好用的分页插件,同时也被人们称为mybatis三剑客之一,下面 就给大家讲讲如何在SSM项目和sprin ...
- SSM Spring+SpringMVC+mybatis+maven+mysql环境搭建
SSM Spring+SpringMVC+mybatis+maven环境搭建 1.首先右键点击项目区空白处,选择new->other..在弹出框中输入maven,选择Maven Project. ...
- SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,MyBatis)的区别
SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,M ...
- 使用intellij idea搭建MAVEN+SSM(Spring+SpringMVC+MyBatis)框架
基本概念 使用SSM(Spring,SpringMVC和Mybatis) 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod ...
- 使用SSM 或者 springboot +mybatis时,对数据库的认证信息(用户名,密码)进行加密。
通常情况下,为了提高安全性,我们需要对数据库的认证信息进行加密操作,然后在启动项目的时候,会自动解密来核对信息是否正确.下面介绍在SSM和springboot项目中分别是怎样实现的. 无论是使用SSM ...
- mybatis入门基础(七)----延迟加载
一.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: ...
- SSM(Spring + Springmvc + Mybatis)框架面试题
JAVA SSM框架基础面试题https://blog.csdn.net/qq_39031310/article/details/83050192 SSM(Spring + Springmvc + M ...
- mybatis基础(中)
数据模型分析思路 每张表记录的数据内容 分模块对每张表记录对内容进行熟悉,相当于学习系统需求(功能)的过程 每张表重要的字段设置 非空字段.外键字段 数据库级别表与表之间的关系 外键关系 表与表之间的 ...
- 【转】使用Mybatis时遇到的延迟加载造成返回异常的问题——HttpMessageConversionException: Type definition error
在使用Mybatis的过程中,使用了resultMap延迟加载. 延迟加载:association联表查询的过程中,查询另外两个表的对象.而延迟加载是指只有在使用这两个对象的时候才会进行查询. 问题的 ...
随机推荐
- 【Android 应用开发】Android - TabHost 选项卡功能用法详解
TabHost效果图 : 源码下载地址 : http://download.csdn.net/detail/han1202012/6845105 . 作者 :万境绝尘 转载请注明出处 ...
- 制药企业BI系统方案整体设计分享
制药企业全面预算系统蓝图 全面掌控企业的各种业务活动,及时准确的展现它们的状况与趋势,评估其达成的效果.存在的问题与风险.支持数据的导入,多级上报等多种特色功能,同时通过统一的报表平台实现精细话的权限 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Android开发概要记录
1..o文件. .ko和.so文件的路径 \kernel\out\mediatek---------------.o文件 .c/.cpp文件编译生成的目标文件 \out\target\product\ ...
- utl_file包的使用
首先看一下oracle 脚本 /* # $Header: HTMomse12.sql 12.0.4 20121015 Support $ #+============================= ...
- OPEN A PO ORDER OR SO ORDER
OPEN PO ORDER fnd_function.Execute(Function_Name => 'PO_POXPOEPO', Open_Flag => 'Y', Session_F ...
- 在Windows使用git工具将代码同步至github(作者:ying1989920)
[ps]git是一个分布式代码管理工具,类似于svn,方便协同开发,git里面有所谓的仓库(用来存放代码的),分为本地和线上,线上的你可以自己搭建,不想搭建的话github就给你提供了. [关于 ...
- RTMPdump(libRTMP) 源代码分析 9: 接收消息(Message)(接收视音频数据)
===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...
- 用Xstream时候遇到的两个小异常
第一个 com.thoughtworks.xstream.converters.ConversionException: Cannot construct ClassXXX as it does no ...
- break和continue的简单介绍
1.break break 用于完全结束一个循环,跳出循环体!不管是哪种循环,如果在程序中遇到Break,系统将完全结束该循环,开始执行循环之后的代码: public class TestBreak ...