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

延迟加载:

  所谓延迟加载是什么?

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

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

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

  延迟加载用在关联查询的多条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的关联查询才可以可以,单条的不可以,因为单条做的是表连接,直接一张表一下子就出来数据了

最新文章

  1. HTML中一些基本的标签用法
  2. CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\f834824f\75776659\xxx.dll”--“拒绝访问。 ”
  3. 编写高质量代码改善C#程序的157个建议[IEnumerable&lt;T&gt;和IQueryable&lt;T&gt;、LINQ避免迭代、LINQ替代迭代]
  4. PHP中PDO的配置与说明
  5. Eclipse代码提示功能是不是利用反射
  6. Nexus4铃声目录
  7. jQuery easyui 提示框
  8. PHP 解压zip文件的函数封装
  9. CodeForce---Educational Codeforces Round 3 USB Flash Drives (水题)解题报告
  10. ROHS無鉛問題解答!ROHS IPC SGS
  11. CodeForces 398B 概率DP 记忆化搜索
  12. ecshop下启用QQ在线服务,并能实时更新QQ在线状态
  13. iOS 面试大全从简单到复杂(简单篇)
  14. 深入浅出分析MySQL索引设计背后的数据结构
  15. Kruskal和Prim算法求最小生成树
  16. kubernetes入门(02)kubernetes的架构
  17. linux线程 join/detach
  18. 转载:让Windows Server 2012r2 IIS8 ASP.NET 支持10万并发请求
  19. [转帖]再次提醒Google Chrome用户应尽快升级浏览器到72.0.3626.121
  20. SQL Server 2005详细安装过程及配置

热门文章

  1. TCP的核心系列 — SACK和DSACK的实现(五)
  2. SpriteBuilder中锚点的一般用法
  3. iOS监听模式系列之iOS开发证书、秘钥
  4. BMP 转 YUV (BMP2YUV)
  5. Leetcode_263_Ugly Number
  6. java finalize方法总结、GC执行finalize的过程
  7. mongodb3.6 (五)net 客户端访问mongodb设置超时时间踩过的“坑”
  8. 春天aopframework实现
  9. 在Redis Sentinel环境下,jedis该如何配置
  10. 实现CString的Format功能,支持跨平台