ibatis 物件關係實現

2021-06-02 10:10:01 字數 1541 閱讀 8833

hibernate 的強大在於完全的物件化,對於物件之間的關係解決的比較好,如1對1,1對多,多對1,以及多對多。當然也包括繼承關係。

而ibatis這方面就比較遜色了,不過對於也支援簡單的關連查詢,如1對1,和1對多。對於一般的情況來說,這兩種已經足夠了,當然不能層疊更新是乙個缺陷,看了半天文件,也沒有找到物件之間的層疊更新,估計是不支援。

以前的版本ibatis處理關連是通過執行兩次sql來實現的,如下的例項:

一對多關聯:

這裡通過在resultmap 中定義巢狀查詢getaddressbyuserid,我們實現了關聯資料的讀取。

需要注意的是,這裡有乙個潛在的效能問題,也就是所謂「n+1」select問題。

一對一關聯:

對於這種情況,我們可以採用一次select兩張表的方式,避免這樣的效能開銷(假設上面示例中,每個user 只有乙個對應的address記錄):

這裡通過在resultmap 中定義巢狀查詢getaddressbyuserid,我們實現了關聯資料的讀取。

需要注意的是,這裡有乙個潛在的效能問題,也就是所謂「n+1」select問題。

一對一關聯:

對於這種情況,我們可以採用一次select兩張表的方式,避免這樣的效能開銷(假設上面示例中,每個user 只有乙個對應的address記錄):

在現在的版本中,對於n+1問題,ibatis已經很好的解決了。如下的配置:

一對一

select *

from product, category

where prd_cat_id=cat_id

and prd_id = #value#

可以使用內在的resultmap來解決此問題。

同樣一對多如下:

select c.cat_id, c.cat_description, p.prd_id, p.prd_description

from category c left outer join product p

on c.cat_id = p.prd_cat_id

where cat_id = #value#

注意,需要使用增加groupby屬性來分類

如果想實現,延遲載入的情況:

在日誌中顯示sql語句 

log4j.logger.com.ibatis=debug

log4j.logger.com.ibatis.common.jdbc.******datasource=debug

log4j.logger.com.ibatis.common.jdbc.scriptrunner=debug

log4j.logger.com.ibatis.sqlmap.engine.impl.sqlmapclientdelegate=debug

ibatis 物件關係實現

hibernate 的強大在於完全的物件化,對於物件之間的關係解決的比較好,如1對1,1對多,多對1,以及多對多。當然也包括繼承關係。而ibatis這方面就比較遜色了,不過對於也支援簡單的關連查詢,如1對1,和1對多。對於一般的情況來說,這兩種已經足夠了,當然不能層疊更新是乙個缺陷,看了半天文件,也...

ibatis 物件關係實現,一對多,多對一

hibernate 的強大在於完全的物件化,對於物件之間的關係解決的比較好,如1對1,1對多,多對1,以及多對多。當然也包括繼承關係。而ibatis這方面就比較遜色了,不過對於也支援簡單的關連查詢,如1對1,和1對多。對於一般的情況來說,這兩種已經足夠了,當然不能層疊更新是乙個缺陷,看了半天文件,也...

IBatis 利用對映檔案描述物件間的關係

對映兩表之間的關係通過兩個和兩個元素來完成,用vo來描述兩表之間的關係在ibatis框架中,其實仍然是通過sql來完成的。怎樣用sql來表達 一對多 和 多對一 的關係呢?可以利用主表的主鍵作為從表的外來鍵對從表查詢,得到的結果就是 一對多 的關係。那麼 多對一 呢?可以利用從表的外來鍵對主表進行查...