閱讀739 返回首頁    go 阿裏雲 go 技術社區[雲棲]


iBatis和Hibernate的對比

 

我在最初的選型的時候是打算選擇 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。

 

原帖地址:https://moonsee.iteye.com/blog/253226

最後更新:2017-04-02 15:15:37

  上一篇:go Android開發7——android.database.CursorIndexOutOfBoundsException:Index -1 requested, with a size of 1
  下一篇:go C#委托基礎3——泛型委托