Hibernate :Hibernate 是當前最流行的ORM框架,對數據庫結構提供了較為完整的封裝。
Mybatis:Mybatis同樣也是非常流行的ORM框架,主要着力點在於POJO 與SQL之間的映射關系。
Hibernate與MyBatis都可以是通過SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session來開啟執行事務和SQL語句。
而MyBatis的優勢是MyBatis可以進行更為細致的SQL優化,可以減少查詢字段,並且容易掌握。
Hibernate的優勢是DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果映射。Hibernate數據庫移植性很好,MyBatis的數據庫移植性不好,不同的數據庫需要寫不同SQL。有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。
mybatis:
1. 入門簡單,即學即用,提供了數據庫查詢的自動對象綁定功能,而且延續了很好的SQL使用經驗,對於沒有那么高的對象模型要求的項目來說,相當完美。
2. 可以進行更為細致的SQL優化,可以減少查詢字段。
3. 缺點就是框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層數據庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速數據庫修改。
4. 二級緩存機制不佳。
hibernate:
1. 功能強大,數據庫無關性好,O/R映射能力強,如果你對Hibernate相當精通,而且對Hibernate進行了適當的封裝,那么你的項目整個持久層代碼會相當簡單,需要寫的代碼很少,開發速度很快,非常爽。
2. 有更好的二級緩存機制,可以使用第三方緩存。
3. 缺點就是學習門檻不低,要精通門檻更高,而且怎么設計O/R映射,在性能和對象模型之間如何權衡取得平衡,以及怎樣用好Hibernate方面需要你的經驗和能力都很強才行。
具體從幾個方面說一下兩者的區別:
1.兩者最大的區別:
針對簡單邏輯,Hibernate和MyBatis都有相應的代碼生成工具,可以生成簡單基本的DAO層方法。
針對高級查詢,Mybatis需要手動編寫SQL語句,以及ResultMap。而Hibernate有良好的映射機制,開發者無需關心SQL的生成與結果映射,可以更專注於業務流程。
2.開發難度對比
Hibernate的開發難度要大於Mybatis。主要由於Hibernate比較復雜、龐大,學習周期較長。
而Mybatis則相對簡單一些,並且Mybatis主要依賴於sql的書寫,讓開發者感覺更熟悉。
3.sql書寫比較
Mybatis的SQL是手動編寫的,所以可以按需求指定查詢的字段。不過沒有自己的日志統計,所以要借助log4j來記錄日志。
Hibernate也可以自己寫SQL來指定需要查詢的字段,但這樣就破壞了Hibernate開發的簡潔性。不過Hibernate具有自己的日志統計。
4.數據庫擴展性比較
Mybatis由於所有SQL都是依賴數據庫書寫的,所以擴展性,遷移性比較差。
Hibernate與數據庫具體的關聯都在XML中,所以HQL對具體是用什么數據庫並不是很關心。
5.緩存機制比較
相同點:Hibernate和Mybatis的二級緩存除了采用系統默認的緩存機制外,都可以通過實現你自己的緩存或為其他第三方緩存方案,創建適配器來完全覆蓋緩存行為。
不同點:Hibernate的二級緩存配置在SessionFactory生成的配置文件中進行詳細配置,然后再在具體的表-對象映射中配置是那種緩存。
MyBatis的二級緩存配置都是在每個具體的表-對象映射中進行詳細配置,這樣針對不同的表可以自定義不同的緩存機制。並且Mybatis可以在命名空間中共享相同的緩存配置和實例,通過Cache-ref來實現。
兩者比較:因為Hibernate對查詢對象有着良好的管理機制,用戶無需關心SQL。所以在使用二級緩存時如果出現臟數據,系統會報出錯誤並提示。
而MyBatis在這一方面,使用二級緩存時需要特別小心。如果不能完全確定數據更新操作的波及范圍,避免Cache的盲目使用。否則,臟數據的出現會給系統的正常運行帶來很大的隱患。
6.總結:
mybatis:小巧、方便、高效、簡單、直接、半自動
hibernate:強大、方便、高效、復雜、繞彎子、全自動
1. hibernate是全自動,而mybatis是半自動
hibernate完全可以通過對象關系模型實現對數據庫的操作,擁有完整的JavaBean對象與數據庫的映射結構來自動生成sql。而mybatis僅有基本的字段映射,對象數據以及對象實際關系仍然需要通過手寫sql來實現和管理。
2. hibernate數據庫移植性遠大於mybatis
hibernate通過它強大的映射結構和hql語言,大大降低了對象與數據庫(oracle、mysql等)的耦合性,而mybatis由於需要手寫sql,因此與數據庫的耦合性直接取決於程序員寫sql的方法,如果sql不具通用性而用了很多某數據庫特性的sql語句的話,移植性也會隨之降低很多,成本很高。
3. hibernate擁有完整的日志系統,mybatis則欠缺一些
hibernate日志系統非常健全,涉及廣泛,包括:sql記錄、關系異常、優化警告、緩存提示、臟數據警告等;而mybatis則除了基本記錄功能外,功能薄弱很多。
4. mybatis相比hibernate需要關心很多細節
hibernate配置要比mybatis復雜的多,學習成本也比mybatis高。但也正因為mybatis使用簡單,才導致它要比hibernate關心很多技術細節。mybatis由於不用考慮很多細節,開發模式上與傳統jdbc區別很小,因此很容易上手並開發項目,但忽略細節會導致項目前期bug較多,因而開發出相對穩定的軟件很慢,而開發出軟件卻很快。hibernate則正好與之相反。但是如果使用hibernate很熟練的話,實際上開發效率絲毫不差於甚至超越mybatis。
5. sql直接優化上,mybatis要比hibernate方便很多
由於mybatis的sql都是寫在xml里,因此優化sql比hibernate方便很多。而hibernate的sql很多都是自動生成的,無法直接維護sql;雖有hql,但功能還是不及sql強大,見到報表等變態需求時,hql也歇菜,也就是說hql是有局限的;hibernate雖然也支持原生sql,但開發模式上卻與orm不同,需要轉換思維,因此使用上不是非常方便。總之寫sql的靈活度上hibernate不及mybatis。
Mybatis:
為了解決Hibernate的不足,Mybatis出現了,Mybatis是半自動的框架。之所以稱它為半自動,是因為它需要手工匹配提供POJO,sql和映射關系,而全表映射的Hibernate只需要提供pojo和映射關系即可。
Mybatis需要提供的映射文件包含了一下三個部分:sql,映射規則,pojo。在Mybatis里面你需要自己編寫sql,雖然比Hibernate配置多,但是Mybatis可以配置動態sql,解決了hibernate表名根據時間變化,不同條件下列不一樣的問題,同時你也可以對sql進行優化,通過配置決定你的sql映射規則,也能支持存儲過程,所以對於一些復雜和需要優化性能的sql查詢它就更加方便。Mybatis幾乎可以做到jdbc所有能做到的事情。
什么時候使用Hibernate,Mybatis
Hibernate作為留下的Java orm框架,它確實編程簡易,需要我們提供映射的規則,完全可以通過IDE生成,同時無需編寫sql確實開發效率優於Mybatis。此外Hibernate還提供了緩存,日志,級聯等強大的功能,但是Hibernate的缺陷也是十分明顯,多表關聯復雜sql,數據系統權限限制,根據條件變化的sql,存儲過程等場景使用Hibernate十分不方便,而性能又難以通過sql優化,所以注定了Hibernate只適用於在場景不太復雜,要求性能不太苛刻的時候使用。
如果你需要一個靈活的,可以動態生成映射關系的框架,那么Mybatis確實是一個最好的選擇。它幾乎可以替代jdbc,擁有動態列,動態表名,存儲過程支持,同時提供了簡易的緩存,日志,級聯。但是它的缺陷是需要你提供映射規則和sql,所以開發工作量比hibernate要大些。
1)從層次上看,JDBC是較底層的持久層操作方式,而Hibernate和MyBatis都是在JDBC的基礎上進行了封裝使其更加方便程序員對持久層的操作。
2)從功能上看,JDBC就是簡單的建立數據庫連接,然后創建statement,將sql語句傳給statement去執行,如果是有返回結果的查詢語句,會將查詢結果放到ResultSet對象中,通過對ResultSet對象的遍歷操作來獲取數據;Hibernate是將數據庫中的數據表映射為持久層的Java對象,對sql語句進行修改和優化比較困難;MyBatis是將sql語句中的輸入參數和輸出參數映射為java對象,sql修改和優化比較方便.
3)從使用上看,如果進行底層編程,而且對性能要求極高的話,應該采用JDBC的方式;如果要對數據庫進行完整性控制的話建議使用Hibernate;如果要靈活使用sql語句的話建議采用MyBatis框架。