我麼都知道Hibernate的關聯對象查詢、級聯刪除、級聯保存等特性,那麼iBATIS是否提供同樣的功能呢?這是大部分人會關心的內容。
答案也許是另人失望的。iBATIS可以關聯查詢,卻沒有提供級聯保存和級聯刪除的特性。
關聯查詢
iBatis爲我們提供了兩種方式關聯查詢,第一種N+1次查詢,第二種新支持的查詢方式。兩種方式需要根據具體的應用環境,作出合適的選擇。前一種由於多了一次和數據庫的讀取操作,所以讀取速度慢了些,但是可以使用延遲加載減少內存的消耗。而後一種方式多了些內存消耗,但是讀取速度要快了。
定義一個需求:我們在查詢訂單的同時希望查詢出其關聯的訂單項。
-
採用N+1次查詢
-
首先看看我們的SQL Mapped配置文件如何配置的:
我們可以看到,RESULT的select屬性指向一個新的查詢語句。
說明:這個很好的解決了關聯查詢的問題,而且如果我們配置了全局的延遲加載,當真正用到訂單項的時候,iBatis才爲我們做查詢的動作。
但是這卻帶來了另外一個問題,N+1次查詢的問題。也就是多了一次數據庫的讀操作,有一定的性能損失。
-
新查詢方式
-
首先看看我們的SQL Mapped配置文件如何配置的:
-
我們可以看到,RESULT的resultMap屬性指向一個resultMap標籤定義。
說明:與前面N+1次查詢方式比較,由於只讀取數據庫一次,的確讀取速度更快了,但是由於存在更多的內存消耗(N+1方式可以通過延遲加載來減少內存的消耗),所以我們該根據具體的應用情況而選擇合適的方式。