1. 程式人生 > >hibernate和mybatis思想,區別,優缺點

hibernate和mybatis思想,區別,優缺點

Hibernate 簡介

Hibernate對資料庫結構提供了較為完整的封裝,HibernateO/R Mapping實現了POJO 和資料庫表之間的對映,以及SQL 的自動生成和執行。程式設計師往往只需定義好了POJO 到資料庫表的對映關係,即可通過Hibernate 提供的方法完成持久層操作。程式設計師甚至不需要對SQL 的熟練掌握, Hibernate/OJB 會根據制定的儲存邏輯,自動生成對應的SQL 並呼叫JDBC 介面加以執行。

MyBatis簡介

iBATIS 的著力點,則在於POJO SQL之間的對映關係。然後通過對映配置檔案,將SQL所需的引數,以及返回的結果欄位對映到指定POJO。 相對HibernateO/R”而言,iBATIS 是一種“Sql Mapping”的ORM實現。

Hibernate快取機制

Hibernate一級快取是Session快取,利用好一級快取就需要對Session的生命週期進行管理好。建議在一個Action操作中使用一個Session。一級快取需要對Session進行嚴格管理。

Hibernate二級快取是SessionFactory級的快取。 SessionFactory的快取分為內建快取和外接快取。內建快取中存放的是SessionFactory物件的一些集合屬性包含的資料(對映元素據及預定SQL語句等),對於應用程式來說,它是隻讀的。外接快取中存放的是資料庫資料的副本,其作用和一級快取類似.二級快取除了以記憶體作為儲存介質外,還可以選用硬碟等外部儲存裝置。二級快取稱為程序級快取或SessionFactory級快取,它可以被所有session共享,它的生命週期伴隨著SessionFactory的生命週期存在和消亡。

MyBatis快取

MyBatis 包含一個非常強大的查詢快取特性,它可以非常方便地配置和定製。MyBatis 3 中的快取實現的很多改進都已經實現了,使得它更加強大而且易於配置。

預設情況下是沒有開啟快取的,除了區域性的 session 快取,可以增強變現而且處理迴圈 依賴也是必須的。要開啟二級快取,你需要在你的 SQL 對映檔案中新增一行:  <cache/>

快取之間的優缺比較

相同點:

HibernateMybatis的二級快取除了採用系統預設的快取機制外,都可以通過實現你自己的快取或為其他第三方快取方案,建立介面卡來完全覆蓋快取行為。

不同點:

Hibernate的二級快取配置在SessionFactory生成的配置檔案中進行詳細配置,然後再在具體的表-物件對映中配置是那種快取。

MyBatis的二級快取配置都是在每個具體的表-物件對映中進行詳細配置,這樣針對不同的表可以自定義不同的快取機制。並且Mybatis可以在名稱空間中共享相同的快取配置和例項,通過Cache-ref來實現。

倆者比較

因為Hibernate對查詢物件有著良好的管理機制,使用者無需關心SQL。所以在使用二級快取時如果出現髒資料,系統會報出錯誤並提示。

MyBatis在這一方面,使用二級快取時需要特別小心。如果不能完全確定資料更新操作的波及範圍,避免Cache的盲目使用。否則,髒資料的出現會給系統的正常執行帶來很大的隱患。

整體比較兩者相同點

  • HibernateMyBatis都可以是通過SessionFactoryBuiderXML配置檔案生成SessionFactory,然後由SessionFactory 生成Session,最後由Session來開啟執行事務和SQL語句。其中SessionFactoryBuiderSessionFactorySession的生命週期都是差不多的。
  • HibernateMyBatis都支援JDBCJTA事務處理。

mybatis優勢

  • MyBatis可以進行更為細緻的SQL優化,可以減少查詢欄位。
  • MyBatis容易掌握,而Hibernate門檻較高。

Hibernate優勢

  • HibernateDAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果對映。
  • Hibernate對物件的維護和快取要比MyBatis好,對增刪改查的物件的維護要方便。
  • Hibernate資料庫移植性很好,MyBatis的資料庫移植性不好,不同的資料庫需要寫不同SQL
  • Hibernate有更好的二級快取機制,可以使用第三方快取。MyBatis本身提供的快取機制不佳。

網上其他大神的理解總結

  • Hibernate功能強大,資料庫無關性好,O/R對映能力強,如果你對Hibernate相當精通,而且對Hibernate進行了適當的封裝,那麼你的專案整個持久層程式碼會相當簡單,需要寫的程式碼很少,開發速度很快,非常爽。
  • Hibernate的缺點就是學習門檻不低,要精通門檻更高,而且怎麼設計O/R對映,在效能和物件模型之間如何權衡取得平衡,以及怎樣用好Hibernate方面需要你的經驗和能力都很強才行。
  • iBATIS入門簡單,即學即用,提供了資料庫查詢的自動物件繫結功能,而且延續了很好的SQL使用經驗,對於沒有那麼高的物件模型要求的專案來說,相當完美。
  • iBATIS的缺點就是框架還是比較簡陋,功能尚有缺失,雖然簡化了資料繫結程式碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。
  • http://www.oschina.net/question/2520906_2148853
  • https://www.zhihu.com/question/21104468
  • http://blog.csdn.net/wangpeng047/article/details/17039573

個人理解

hibernate在大資料量複雜查詢中的資料查詢優化非常難做,因為一般使用hibernate的都不是用原生sql

hibernate在快速建模以及中小型快速響應的應用中比較好用

mybatis配置開發相對複雜,但是帶來的好處是更加靈活,sql優化方便。如果公司有專門的dba,還可以將sql拿給dba去優化。

dba只會幫你優化慢查詢sql,所有的業務sql原型還是要自己寫。