博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
九.延迟加载
阅读量:4919 次
发布时间:2019-06-11

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

什么是延迟加载?

  所谓延迟加载就是先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

 

延迟加载的分类

  直接加载: 执行完主加载立刻执行对关联对象的加载    

  侵入式延迟:执行一条SQL语句返回一个对象,如果访问这个对象的属性,则会走第二条SQL语句,否则反之

  深度延迟:执行一条SQL语句返回一个对象,如果访问这个对象的属性,并且访问关联对象的属性,则会走第二条SQL,否则反之

 

实体类

 

package cn.happy.entity;import java.io.Serializable;import java.util.ArrayList;import java.util.List;/** * Created by Administrator on 2018/2/26. *///所属部门类public class Dept implements Serializable{    public Integer deptNo;    public String deptName;    public 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; }}

 

  

package cn.happy.entity;import java.io.Serializable;/** * Created by Administrator on 2018/2/26. *///员工类public class Emp implements Serializable{    public Integer empNo;    public String empName;    public Integer deptNo;    public 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 getDeptByIdMultSQL(int id);

  注意: 使用延迟加载和深度加载时必须把延迟加载开启,在大配置文件中配置如下。实现延迟加载必须使用多条SQL才行,因为使用单条就会直接加载!!!

  

  

 

xml文件配置

  

 

直接加载

  MyBatis默认开启 ,如果在大配置文件中没有设置延迟加载就会直接执行两条SQL

实体类实现代码

//3.直接加载    @org.junit.Test    public void t1LazyLodingEanbled(){        SqlSession sqlsession= MyBatisUtil.getOpenSession();        IDeptDao mapper = sqlsession.getMapper(IDeptDao.class);        Dept deptById = mapper.getDeptByIdMultSQL(1);        System.out.println(deptById.getDeptName());        sqlsession.close();    }

  结果

 

侵入式延迟

  使用侵入式延迟需要在大配置文件中配置以下节点

  

  测试

   

//4.侵入式延迟    @org.junit.Test    public void t2LazyLodingEanbled(){        SqlSession sqlsession= MyBatisUtil.getOpenSession();        IDeptDao mapper = sqlsession.getMapper(IDeptDao.class);        Dept deptById = mapper.getDeptByIdMultSQL(1);        System.out.println("---------分割线-------------");      //调用该对象的属性        System.out.println(deptById.getDeptName());        sqlsession.close();    }

  结果

 

分析:在返回结果对象前查询了一条SQL,然后在调用该对象的属性时又查询了一条SQL

 

深度延迟

  修改大配置文件

  

  测试

  

//4.深度延迟    @org.junit.Test    public void t3LazyLodingEanbled(){        SqlSession sqlsession= MyBatisUtil.getOpenSession();        IDeptDao mapper = sqlsession.getMapper(IDeptDao.class);        Dept deptById = mapper.getDeptByIdMultSQL(1);        System.out.println("---------分割线-------------");        //调用该对象的关联对象的属性        for (Emp emp:deptById.getEmps()) {            System.out.println( emp.getDeptNo());        }        sqlsession.close();    }

  结果

 

 

延迟加载策略总结

 

本次分享就到这 谢谢观看!

 

转载于:https://www.cnblogs.com/xuchangqi1/p/8483461.html

你可能感兴趣的文章
操作系统实验一:并发程序设计
查看>>
Java常用的系统类
查看>>
XPO to Database Connectivity: Mastering Fork Etiquett
查看>>
ADO实现单条记录的刷新《转》
查看>>
python列表和循环判断
查看>>
Spring各jar包的作用(转载)
查看>>
Windows10 +Ubuntu 18.04双系统安装详细教程
查看>>
ecmall 别人做好的商城
查看>>
《数据结构教程》(李春葆 主编)课后习题【练习题7】
查看>>
What do cryptic Github comments mean?
查看>>
DAY73-Django框架(四)
查看>>
报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost...
查看>>
Java EE应用的组件
查看>>
Hive记录-Sqoop常用命令
查看>>
手写事件代理函数 (Delegated function)
查看>>
test1
查看>>
(转载)面试题收集——Java基础部分(一)
查看>>
Java泛型中的? super T语法
查看>>
SSH框架学习步骤
查看>>
react config test env with jest and create-react-app 1
查看>>