博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSM-MyBatis-16:Mybatis中延迟加载
阅读量:6029 次
发布时间:2019-06-20

本文共 4664 字,大约阅读时间需要 15 分钟。

 

 

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

 

 

延迟加载:

  所谓延迟加载是什么?

  从字面意思理解到的是等一会再加载

  从行为分析,他主要是缓解数据库压力,提高性能的意义

  所谓延迟加载可以做到,我访问你的时候,我用到你的时候,你再做加载

  延迟加载用在关联查询的多条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
emps=new ArrayList
(); 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
getEmps() { return emps; } public void setEmps(List
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小配置中的代码我也放上去

 

 

  这个和之前用到的并没有什么不同,延迟加载在这儿并没有配置

  接下来是大配置的配置,

 

 

  我说一下这个怎么用,如果是你想要的方式,把他中文注释下的代码放开即可,

  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(1);        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(1);        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的关联查询才可以可以,单条的不可以,因为单条做的是表连接,直接一张表一下子就出来数据了

 

转载于:https://www.cnblogs.com/DawnCHENXI/p/8480603.html

你可能感兴趣的文章
[深入理解Android卷一全文-第五章]深入理解常见类
查看>>
我的友情链接
查看>>
MIMO系统ML检测(最大似然检测)
查看>>
lvm实现快速备份文件及数据库,lvm快照原理
查看>>
BGP的状态机制
查看>>
Apache 超详细编译参数解析
查看>>
浅析制造业物料编码在ERP系统中的实施
查看>>
Windows phone应从Android吸取四点教训
查看>>
13款经典JavaScript图形和图表绘制工具
查看>>
【AD】破解WindowsServer2008R2 AD域控目录还原模式密码及域管理员账号密码
查看>>
【php】php编译pcntl以支持多进程
查看>>
我的友情链接
查看>>
TP获取服务器mysql版本
查看>>
差异分析定位Ring 3保护模块
查看>>
2013年7月12日“修复 Migration 测试发现的 Bug”
查看>>
vim文本编辑器详解
查看>>
学习vue中遇到的报错,特此记录下来
查看>>
CentOS7 编译安装 Mariadb
查看>>
MySQL主从库--同步异常
查看>>
32位系统和64位系统的选择
查看>>