MyBatis延迟加载,分层加载和局部延迟加载

延迟加载,玩过hibernate的都知道那玩意叫懒加载。

在最新官方MyBatis文档里,有上面这2个属性,一个是延迟加载,一个是分层加载。

lazyLoadingEnabled 默认值为false,那么在有级联关系的resultMap里,查询后会加载出所有的级联关系,当然有时候我们并不需要这些所有的时候,我们就可以应用到延迟加载给我们带来的好处了。

aggressiveLazyLoading默认值是true,这里我称之为分层加载,大概意思是如果它为true,那么当我使用了延迟加载,要么所有级联都不记载,要么如果我加载一个,其他都得加载

fetchType是可以注明在association 和 collection里的,选值为eager和lazy,就是为了方便我们结合aggressiveLazyLoading(false)来配合使用的,让延迟加载发挥到极致,即只加载我需要的!


以下是我做得一个demo

这是实验要用到的3个表模型

以下是resultMap对应的POJO

package Model;

import java.io.Serializable;
import java.util.List;

public class Student implements Serializable{
	private Integer id;
	private String studentName;
	private String studentAge;
	private List
   
   
    
     studentHealthCards;
	private ParentOfStudent parentOfStudent;
	public List
    
    
     
      getStudentHealthCards() {
		return studentHealthCards;
	}
	public void setStudentHealthCards(List
     
     
      
       studentHealthCards) {
		this.studentHealthCards = studentHealthCards;
	}
	public ParentOfStudent getParentOfStudent() {
		return parentOfStudent;
	}
	public void setParentOfStudent(ParentOfStudent parentOfStudent) {
		this.parentOfStudent = parentOfStudent;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}
	public String getStudentAge() {
		return studentAge;
	}
	public void setStudentAge(String studentAge) {
		this.studentAge = studentAge;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", studentName=" + studentName + ", studentAge=" + studentAge
				+ ", studentHealthCards=" + studentHealthCards + ", parentOfStudent=" + parentOfStudent + "]";
	}
	
}



package Model;

import java.io.Serializable;

public class StudentHealthCard implements Serializable{
	private Integer id;
	private Integer stu_id;
	private String name;
	private String message;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Integer getStu_id() {
		return stu_id;
	}
	public void setStu_id(Integer stu_id) {
		this.stu_id = stu_id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	@Override
	public String toString() {
		return "StudentHealthCard [id=" + id + ", stu_id=" + stu_id + ", name=" + name + ", message=" + message + "]";
	}
	
}


package Model;

import java.io.Serializable;

public class ParentOfStudent implements Serializable{
	private Integer id;
	private Integer stu_id;
	private String name;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Integer getStu_id() {
		return stu_id;
	}
	public void setStu_id(Integer stu_id) {
		this.stu_id = stu_id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "ParentOfStudent [id=" + id + ", stu_id=" + stu_id + ", name=" + name + "]";
	}
	
}

     
     
    
    
   
   

<resultMap type="Model.Student" id="stu">
		  	<id property="id" column="id"/>
		  	<result property="studentName" column="student_name"/>
		  	<result property="studentAge" column="student_age"/>
		  	<association property="parentOfStudent" column="id" select="selectOneParentOfStudent"></association>
		  	<collection property="studentHealthCards" column="id" ofType="Model.StudentHealthCard" select="selectOneStudentHealthCard" fetchType="eager"></collection>
		  </resultMap>
		  
		  <select id="selectOneStudent" resultMap="stu">
				select * from student where id = #{id}
		  </select>
		  
		  <select id="selectOneParentOfStudent" resultType="Model.ParentOfStudent">
		  	select * from parentofstudent where stu_id = #{id}
		  </select>
		  
		  <select id="selectOneStudentHealthCard" resultType="Model.StudentHealthCard">
		  	select * from studenthealthcard where stu_id = #{id}
		  </select>


情况1:开启延迟加载,默认分层加载,不开启局部加载

执行语句 Student student = sm.selectOneStudent(1);

以下是运行结果:


执行语句:Student student = sm.selectOneStudent(1);
student.getParentOfStudent();

运行结果:

这就是默认分层加载的后果,好的那么现在我把分层加载设置为false

即情况2:开启延迟加载,分层加载false,不适用局部加载

执行以上相同语句:



好了 3条sql变成了2条

情况3:不列出来了,就是使用fetchType的情况下,可以指明及时在延迟加载情况下也可以立即加载某个级联关系

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值