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基礎———類與物件,成員變數和區域性變數,封裝及關鍵字static和this
類與物件,成員變數和區域性變數,封裝及關鍵字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