標籤:class blog c java tar ext
Ibatis和Hibernate的比較分類: IBATIS HIBERNATE2010-11-19 17:58 341人閱讀 評論(0) 收藏 舉報hibernateibatis資料庫sqlcachetable
我在最初的選型的時候是打算選擇 Hibernate 的,在研究的過程中發現了 iBatis,經過 分析比較之後我選擇了 iBatis。現在我已經使用 iBatis 完成了一個中小型的 ... - 我在最初的選型的時候是打算選擇 Hibernate 的,在研究的過程中發現了 iBatis,經過
分析比較之後我選擇了 iBatis。現在我已經使用 iBatis 完成了一個中小型的項目。這個
項目在效能、可維護性、可擴充性方面都非常令我滿意。
在這個過程中我也不斷的與使用過或者正在使用 Hibernate 的人進行過探討。而且我本身
也在不斷的跟進 Hibernate 的發展。
最終,我的結論是 iBatis 的選擇非常正確,而且越用越喜歡它了。
當然了,我對 Hibernate 的理解還是非常有限的,所以這裡的關於 Hibernate 的一些觀
點的錯誤之處希望能夠得到 Hibernate 高手的指正。
1. iBatis 易於掌握。拿來文檔看半天到兩天就可以掌握了。
Hibernate 可能需要 3 倍以上的時間來掌握。
2. iBatis 更容易進行 sql 的 最佳化。
這個應該大家都有共識了。另外 Hibernate 產生的 sql 也實在是太難看了。鑒
於有的朋友提到了 sql 不太重要。我想在這裡強調一下我的經驗,一般系統效能
的瓶頸都在資料庫上。所以這一點是 iBatis 非常重要的一個優勢。
3. iBatis 可以進行細粒度的最佳化
3.1 比如說我有一個表,這個表有幾個或者幾十個欄位,我需要更新其中
的一個欄位,iBatis 很簡單,執行一個sql
UPDATE TABLE_A SET column_1=#column_1# WHERE id=#id#
但是用 Hibernate 的話就比較麻煩了,預設的情況下 hibernate 會更新所有欄位。
當然我記得 hibernate 有一個選項可以控制只儲存修改過的欄位,但是我不太確
定這個功能的負面效果。
3.2 我需要列出一個表的部分內容,用 iBatis 的時候,這裡面的好處是可以少從資料
庫讀很多資料,節省流量
SELECT ID, NAME FROM TABLE_WITH_A_LOT_OF_COLUMN WHERE ...
3.2.1 一般情況下
Hibernate 會把所有的欄位都選出來。比如說有一個上面表有8個欄位,
其中有一兩個比較大的欄位,varchar(255)/text。上面的情境中我為什麼要把他
們也選出來呢?
3.2.2 用 hibernate 的話,你又不能把這兩個不需要的欄位設定為 lazy load,因
為還有很多地方需要一次把整個 domain object 載入出來。這個時候就能顯現出
ibatis 的好處了
3.2.3 Hibernate 還有一個方案,就是產生 javabean/map/object[](感謝
leelun/cjmm),但是這樣的話就可能會產生大量的多餘 class。map/object[] 的方式
應該不錯,我比較喜歡這種方式。
3.3 如果我需要更新一條記錄(一個對象),如果使用 hibernate,需要現把對
象 select 出來,然後再做 update。這對資料庫來說就是兩條 sql。而 iBatis
只需要一條 update 的 sql 就可以了。減少一次與資料庫的互動,對於效能的
提升是非常重要。
4. 開發方面
4.1 開發效率上,我覺得兩者應該差不多
4.2 可維護性方面,我覺得 iBatis 更好一些。因為 iBatis 的 sql 都儲存到
單獨的檔案中。而 Hibernate 在有些情況下可能會在 java 代碼中儲存
sql/hql。
5. 運行效率
5.1 在不考慮 cache 的情況下,iBatis 應該會比hibernate 快一些或者很多
(根據實際情況會有所不同)。
當然 iBatis 也有比較大的缺點
1. 不同資料庫類型的支援不好,如果你要開發的系統是要在對中資料間移植,那可能用 hibernate 比較好。
2. 預設的 cache 支援不好,但是 hibernate 的 cache 支援其實也不是很好,而且很複雜。尤其是對於大並發量的應用。所以我更傾向於自己管理 cache。
轉至:http://www.itchinese.com/plus/view-152560-1.html