1. 程式人生 > >MyBatis延遲載入,分層載入和區域性延遲載入

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的情況下,可以指明及時在延遲載入情況下也可以立即載入某個級聯關係

相關推薦

MyBatis延遲載入分層載入區域性延遲載入

延遲載入,玩過hibernate的都知道那玩意叫懶載入。 在最新官方MyBatis文件裡,有上面這2個屬性,一個是延遲載入,一個是分層載入。 lazyLoadingEnabled 預設值為false,那麼在有級聯關係的resultMap裡,查詢後會加載出所有的級聯關係,當

cesium載入飛機模型entity方式primitive方式載入縮放至模型處

<!DOCTYPE html> <html lang="en"> <head> <!-- Use correct character set. --> <meta charset="utf-8"> <!-- T

什麼是hibernate的延遲載入什麼時候使用延時載入為什麼要用延時載入

所謂懶載入(lazy)就是延時載入,延遲載入。 什麼時候用懶載入呢,我只能回答要用懶載入的時候就用懶載入。 至於為什麼要用懶載入呢,就是當我們要訪問的資料量過大時,明顯用快取不太合適, 因為記憶體容量有限 ,為了減少併發量,減少系統資源的消耗, 我們讓資料在需要的時候才進行載入,這時我們就用到了懶載入。 比

pdfjs優化實現按需載入節省流量記憶體

1 問題   當使用pdfjs來實現預覽功能的時候,遇到了2個問題:   一是頻寬佔用過大,會下載整個pdf檔案,這對部署在公網的應用來說,成本壓力很大,因為雲服務頻寬是很貴的。   二是記憶體佔用過大,一個80M的pdf,在預覽時佔用記憶體高達600M,在一些記憶體較小的手機上容易發生崩潰。   pdfjs

SSM-MyBatis-05:Mybatis中別名sql片段模糊查詢加getMapper

接口 過程 ase exce bat -c 多次 nts log ------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑------------- 簡單概述一下本講 別名,sql片段簡單寫一下,模糊查詢多寫一點 一。別名    <typeAliases&

Java中ThreadLocal成員變數區域性變數。

一.成員變數和區域性變數 1.程式例子: public class HelloThreadTest { public static void main(String[] args) { HelloThread r = new HelloThread();

java基礎———類與物件成員變數區域性變數封裝及關鍵字staticthis

類與物件,成員變數和區域性變數,封裝及關鍵字static和this 面向物件的思想 類與物件及其應用 物件的記憶體圖 成員變數和區域性變數的區別 匿名物件 封裝(private) this關鍵字 構造方法 物件的建立步驟

Hibernate中的即時載入(get)延時載入(load)

一,即時載入     Student student = session.get(Student.class, 22);     System.out.println(student);       &nb

java 基礎之成員變數成員方法區域性變數例項方法

以下都是總結的簡單說法,定義上可能沒那麼嚴謹。 成員變數:類裡定義的變數。 區域性變數:方法裡定義的變數。 其中成員變數又分為:例項變數和類變數(靜態變數) 類變數:static修飾的變數 注:如果區域性變數和成員變數的名稱相同,那麼成員變數被隱藏,即方法內失效,方法中如需

mybatis開啟二級快取載入類型別名類都簡稱

SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "ht

Mybatis的一對多多對一以及延遲載入

一對多查詢 實體類 package com.zucc.model; import java.util.List; public class District{     private Integer did;     private String dname;

mybatis 一對多多對多等關係xml檔案中sql的寫法以及快取、延遲載入的配置寫法

高階功能https://blog.csdn.net/dfsaggsd/article/details/50555583 對映關係 一對一對映 SQL語句:使用者訂單查詢 SELECT  orders.*,   USER.username,  

MyBatis 延遲載入一級快取(sqlsession級別)、二級快取(mapper級別)設定

什麼是延遲載入          resultMap中的association和collection標籤具有延遲載入的功能。         延遲載入的意思是說,在關聯查詢時,利用延遲載入,先載入主資訊。使用關聯資訊時再去載入關聯資訊。 設定延遲載入      

mybatis級聯查詢分步查詢延遲加載

enabled 4.2 res 標簽 mapper last pac mes 方式 級聯查詢: 1.Employee表: id;lastName;email; gender;d_id(外鍵關聯Department的ID) 2.Department表: id;deptNa

web工程啟動時在一個類中延遲載入Bean因為該Bean類可能還沒被JVM載入

   問題描述: (1)javaWeb專案啟動中,還沒啟動完成,在下面這個類載入另一個Bean類, (2)通過getBean方法獲取到該Bean,可以獲取到,不為null (3)但是,呼叫該Bean的方法insertSelective()方法,進不去該方法   &nb

HTML5全屏頁面可見性訪問攝像頭麥克風檢測電池載入網頁功能

1,全屏 // 找到適合瀏覽器的全屏方法 function launchFullScreen(element) { if(element.requestFullScreen) { element.requestFullScreen(); } else if(e

大資料之Spark(八)--- Spark閉包處理部署模式叢集模式SparkOnYarn模式高可用Spark整合Hive訪問hbase類載入等異常解決使用spark下的thriftserv

一、Spark閉包處理 ------------------------------------------------------------ RDD,resilient distributed dataset,彈性(容錯)分散式資料集。 分割槽列表,function,dep Op

延遲載入的一些知識誤區

原文地址www.hcyhj.cn/2018/11/21/… 最近開始看《java併發程式設計的藝術》一書,從裡面get到了好些知識上的盲點,下面就延遲載入這個問題來分析一波~~ 首先咱們來看一段簡單的程式碼: public class DelayLoad { private Delay

靜態連結庫(LIB)動態連結庫(DLL)DLL的靜態載入動態載入兩種LIB檔案。

靜態連結庫(LIB)和動態連結庫(DLL),DLL的靜態載入和動態載入,兩種LIB檔案。 一、 靜態連結庫(LIB,也簡稱“靜態庫”)與動態連結庫(DLL,也簡稱“動態庫”)的區別 靜態連結庫與動態連結庫都是共享程式碼的方式,如果採用靜態連結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最

[OpenCV3程式設計入門讀書筆記]影象的載入顯示輸出(1)

#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> using namespace cv; int main(){ Mat image = imread("C:\\Users\\tho