ibatis的延遲載入機制
在Domain
Moudel中,經常會碰到一個域物件中包含另外一個域物件的列表,例如:一個blog的文章會有多個回覆。我們就拿blog來做例項說明,情形一:獲取
blog的文章資訊展示給使用者,此內容只包括Article物件的資訊;情形二:獲取單個文章Article的資訊,包括使用者對這個文章的回覆資訊。
//文章物件 Article
public class Article{
public String articleId;
public String title;
public String content;
public String userId;
public Date createTime;
public List<Review> reviewList;//Review域物件list
……//其他屬性,get,set方法;
}
//回覆物件 Review
public String reviewId;
public String title;
public String content;
public String articleId;
public String userId;
……//其他屬性,get,set方法;
}
ibatis的一對多的配置檔案如下:
<sqlMap namespace=”Article”>
<typeAlias alias=”article” type=”com.ibatis.eg.Article”/>
<typeAlias alias=”review” type=”com.ibatis.eg.Review”/>
<resultMap id=”article_result” class=”article”>
<result property=”articleId” column=”articleId”/>
<result property=”title” column=”title”/>
<result property=”content” column=”content”/>
<result property=”userId” column=”userId”/>
<result property=”createTime” column=”createTime”/>
<result property=”review” column=”articleId” select = “getReviewByArticleId”/>
……
</resultMap>
<select id=”findArticle” resultMap=”article_result” parameterClass=”article”>
SELECT
articleId,
content,
……
FROM article
<dynamic prepend=”where”>
<isNotEmpty prepend=”and” property = “articleId”>
articleId = #articleId#
</isNotEmpty>
<isNotEmpty prepend=”and” property = “content”>
content = #content#
</isNotEmpty>
……
</dynamic>
</select>
<!–此處的resultClass的類和資料庫中的欄位需要保持一致,否則需要 as 一下或者在此檔案中配置一個resultMap–>
<!–例如:如果資料庫中是review_Id需要 select review_Id as reviewId ……–>
<select id=”getReviewByArticleId” resultClass=”review” parameterClass=”String”>
SELECT
reviewId,
articleId,
content,
……
FROM review where articleId = #articleId#
</select>
</sqlMap>
如果我們要實現延遲載入(lazy loadding)的功能,僅僅配置上述xml檔案還是不夠的,在ibatis的主配置檔案sql-map-config.xml中,需要把ibatis的兩項配置做一下修改。
<settings
……
lazyLoadingEnabled=”true”
enhancementEnabled=”true”
……/>
lazyLoadingEnabled設定系統是否實現延遲載入機制,enhancementEnabled設定是否用位元組碼強制機制,通過位元組碼強制機
制可以為lazy loadding帶來效能方面的改進;當用戶
getSqlMapClientTemplate().queryForList(”findArticle”,article)的時候,實際上只是執行
了查詢article表的資訊,而在Article物件中getReview()的時候,才會執行後面的查詢Review物件的語句;這樣在首頁訪問
Article列表的時候就不用載入Review的資訊,而在點選單個文章(Article)瀏覽的時候需要回復物件Review的時候,則會執行
getReviewByArticleId的查詢操作,把列表資訊給出來。這樣做明顯的減少了程式碼的負責程度,按需提取資訊也提升了系統的效能!
如果是settings中配置useStatementNamespaces =
“true”(是否使用Statement名稱空間)的話,上面的xml配置resultMap中的延遲載入資訊應該寫成:select =
“Article.getReviewByArticleId”,同時dao中也要寫
成:getSqlMapClientTemplate().queryForList(”Article.findArticle”,article);
下面是做一下簡單的測試程式碼
public void testListLazyLoading() {
ArticleDao articleDao = (ArticleDao) this.getApplicationContext().getBean(”articleDao”);
Article article = new Article();
article.setArticleId(”00000005″);
List<Article> list = articleDao.listLazyLoading(article);
for (int i = 0; i < list.size(); i++) {
Article articleTmp = (Article) list.get(i);
//List<Review> reviewList = articleTmp.getReviewList();
System.out.println(i + “———ArticleId=” + articleTmp.getArticleId());
//for(Review review:reviewList){
//System.out.println( “———reviewId=” + review.getReviewId());
//}
}
}
執行上面測試語句的時候,僅僅查詢acticle表,只有去掉註釋的時候,才會把review表中的資訊查詢出來。
參考資料:
1:夏昕 xiaxin(at)gmail.com ibatis開發指南
2:Clinton Begin iBATIS SQL Maps2
3:Owen Cline DB2 UDB、WebSphere 和 iBATIS
卓望java工程師郭經幹對完成本文亦有貢獻!原創文章,轉載請註明原文地址!
相關推薦
ibatis的延遲載入機制
在Domain Moudel中,經常會碰到一個域物件中包含另外一個域物件的列表,例如:一個blog的文章會有多個回覆。我們就拿blog來做例項說明,情形一:獲取 blog的文章資訊展示給使用者,此內容只包括Article物件的資訊;情形二:獲取單個文章Arti
Hibernate的延遲載入機制&&在實際應用中,延遲載入與Session關閉的矛盾是如何處理的?
Hibernate的延遲載入機制&&在實際應用中,延遲載入與Session關閉的矛盾是如何處理的? 延遲載入就是並不是在讀取的時候就把資料載入進來,而是等到使用時再載入。Hibernate使用了虛擬代理機制實現延遲載入,我們使用Session的load()方法載
延遲載入機制
延遲載入機制是為了避免一些無謂的效能開銷而提出來的,所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。在Hibernate中提供了對實體物件的延遲載入以及對集合的延遲載入,另外在Hibernate3中還提供了對屬性的延遲載入。下面我們就分別介紹這些種類的延遲載入的細節。A、實體物件的
PHP類延遲載入機制原理
PHP中載入一個類,必須使用require 或者 include把類檔案包含進來,才可以例項化類,我們比較傳統的方法在使用的時候就是一次性的把所需要的類檔案全部進行require,PHP5之前
hibernate延遲載入機制——get和load原理
在hibernate中我們知道如果要從資料庫中得到一個物件,通常有兩種方式,一種是通過session.get()方法,另一種就是通過session.load()方法,然後其實這兩種方法在獲得一個實體物件時是有區別的,在查詢效能上兩者是不同的。 一.load載入方式 當
Hibernate——(6)延遲載入機制
什麼是動態生成一個類? 一般情況下,我們想建立並使用一個類的流程如下: a. 編譯 Java 原始檔 -> 在硬碟上生成一個二迚制.class 檔案 b. JVM 載入.class 檔案,將類讀入一塊記憶體(方法區)中 c. 應用程式呼叫方法區中的類及其方法。 而勱態生成技術,是應用程式直接在記憶體中建
Ibatis的延遲載入
我們知道Hibernate中有get()和load()兩種方法,load()採用的是延遲載入的機制,同樣的對於Ibatis也有著自己的延遲載入機制, 什麼是延遲載入呢,就是將暫時不需要的物件不真正的載入記憶體,而是在記憶體中為該物件建立一個代理物件,當我們使用到該物件的時候
Mybatis學習(五)————— 延遲載入和快取機制(一級二級快取)
一、延遲載入 延遲載入就是懶載入,先去查詢主表資訊,如果用到從表的資料的話,再去查詢從表的資訊,也就是如果沒用到從表的資料的話,就不查詢從表的資訊。所以這就是突出了懶這個特點。真是懶啊。 Mybatis中resultMap可以實現延遲載入 1.1、查詢訂單資訊,延遲載入使用者資訊
DexClassLoader和PathClassLoader類載入機制
分析 sbin 分享 return bject _id ise 否則 nts 0x00 在DexClassLoader和PathClassLoader載入Dex流程一文中,我們分析了dex文件怎樣形成了DexFile結構體。本文中解說類載入機制,實際上就是生
hibernate之4.延遲載入
pop not in 異常 .get pos pan 實體對象 content except 延遲載入: 僅僅有當使用以實體對象的屬性(除主鍵屬性外)時,才會發送查詢語句到數據庫 get不支持延遲載入 @Test public void getTes
TCP Nagle算法&&延遲確認機制
column tencent 需要 end 產生方式 啟用 明顯 list abs TCP Nagle算法&&延遲確認機制 收藏 秋風醉了 發表於 3年前 閱讀 1367 收藏 0 點贊 0 評論 0 【騰
《深入理解Java虛擬機器》個人讀書總結——虛擬機器類載入機制
我們都知道Java虛擬機器是用來執行我們編譯好的.class檔案的,class檔案中夾帶類的各種資訊,虛擬機器要執行這些檔案,第一件事就是要載入到虛擬機器中,這就引出了這次總結的問題——虛擬機器是如何載入這些class檔案的?載入後虛擬機器是怎麼處理檔案中夾帶的資訊的? 類載入機制
tomcat執行載入機制,dns地址解析,tcp/ip三握四揮(全)
一.瞭解從輸入url到顯示頁面過程中都發生了什麼: 1.通過url並利用DNS解析出目的主機的ip地址; 2.找到目標主機,建立TCP/IP連線; 3.Tomcat監聽
JVM的虛擬機器類載入機制
首先,我們要知道為什麼會存在類的載入機制。Java語言編寫的.java在經過編譯器編譯後會生成.class檔案,這個和C\C++語言是不一樣的。 C語言它們是會被編譯生成為本地機器碼,然後在被執行。這種做法的缺點就是無法完成編寫程式碼的跨平臺使用。想想就知道,windows下編譯好的程式碼在li
【筆記】Mybatis高階查詢(小結)--巢狀查詢及延遲載入
<association>與<collection>標籤一對一、一對多,多對多查詢時用到的屬性 property:對應實體類中的屬性名,必填項。 javaType:屬性對應的型別。 resultMap:可以直接使用現有
【筆記】Mybatis高階查詢(五)--使用resultMap的<collection>進行巢狀查詢及延遲載入
下面例子通過<collection>實現一個通過使用者編號查詢使用者下面的角色及許可權的需求,支援延遲載入。下面以自下而上的過程來實現這樣的巢狀查詢功能。並且這個自下而上的過程中每一個方法都是獨立可用的方法。上層的結果都以下層方法為基礎。所有物件都設定為延遲載入。
【筆記】Mybatis高階查詢(三)--使用<association>標籤實現巢狀查詢及延遲載入
<association>標籤實現巢狀查詢,需要用到以下屬性: select:另一個對映查詢的ID,Mybatis會額外執行這個查詢獲取巢狀物件的結果。 column:列名或別名,將主查詢中列的結果作為巢狀查詢的引數,配置方式如column=
Java框架-mybatis延遲載入、快取和註解開發
1. 延遲載入 1.1 概念 在需要用到資料時才進行載入,不需要用到資料時就不載入資料。也稱作懶載入 好處:先從單表查詢,需要時再從關聯表去關聯查詢,大大提高資料庫效能 缺點:在大批量資料查詢時,由於查詢會耗時,可能導致使用者等待時間變長,影響使用者體驗
關於Class物件、類載入機制、虛擬機器執行時記憶體佈局的全面解析和推測
簡介: 本文是對Java的類載入機制,Class物件,反射原理等相關概念的理解、驗證和Java虛擬機器中記憶體佈局的一些推測。本文重點講述瞭如何理解Class物件以及Class物件的作用。 歡迎探討,如有錯誤敬請指正 如需轉載,請註明出處 http://www.cnblogs.com/nul
JVM原理(二)類載入機制與GC演算法
一. 類的載入機制 過程 將.class的二進位制資料讀入記憶體,放入方法區中 在堆中建立一個java.lang.Class物件,封裝類在方法區中的資料結構,並提供訪問方法區資料結構的介面 類的生命週期 類的載入過程