MyBatis和Hibernate的區別

首先簡單介紹下兩者的概念:

Hibernate Hibernate 是當前最流行的ORM框架對數據庫結構提供了較爲完整的封裝

Mybatis:Mybatis同樣也是非常流行的ORM框架,主要着力點在於POJO 與SQL之間的映射關係

Hibernate簡介 

Hibernate是一個開放源代碼的對象關係映射框架,它對JDB進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。

Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSPWeb應用中使用,最具革命意義的是,Hibernate可以在應用EJBJ2EE架構中取代CMP,完成數據持久化的重任。

一、基本功能

Hibernate作爲數據持久化的中間件,足以讓數據庫在業務邏輯層開發中去冬眠。它通過可擴展標記語言(XML)實現了類和數據表之間的映射,使程序員在業務邏輯的開發中面向數據庫而改爲面向對象開發。使整個項目開發分工更加明確,提高了程序開發的效率。 

configuration對象:

Configuration類負責管理Hibernate的配置信息。Hibernate 運行時需要獲取一些底層實現的基本信息,其中幾個關鍵屬性包括:

1.數據庫URL 

2.數據庫用戶 

3.數據庫用戶密碼 

4.數據庫JDBC驅動類

5.數據庫dialect,用於對特定數據庫提供支持,其中包含了針對特定數據庫特性的實現,如Hibernate數據類型到特定數據庫數據類型的映射等。 

以上信息一般情況下由hibernate.cfg.xml或者hibernate.properties文件來配置,實現與不同數據庫的連接。

Session對象:

Session是持久層操作的基礎,相當於JDBC中的Connection: 實例通過SessionFactory實例構建

Configuration config = new Configuration().configure(); 

SessionFactorysessionFactory = config.buildSessionFactory(); 

Session session = sessionFactory.openSession(); 

之後我們就可以調用Session所提供的savefindflush等方法完成持久層操作。因此Session對象也封裝了所有對數據庫的操作來實現Hibernate對數據庫的操縱功能,如: 

Save()方法實現增加和保存; 

Delete()方法實現數據的刪除; 

Update()方法實現數據更新和修改;

Find()方法實現數據的檢索;

Hibernate會根據不同的操作自動生成相應的SQL語句,從而實現了程序員PO對象的操作轉化爲對數據庫關係表的操作。

 

二、使用步驟

1.編寫Hibernate配置文件

Hibernate配置文件有兩種,分別是hibernate.cfg.xml文件和hibernate.properties,推薦使用hibernate.cfg.xml。 

2.PO和映射文件

使用middlegenhibernate-extensions從數據庫導出PO的映射文件,並在hibernate.cfg.xml當中聲明。

3.編寫DAO

對每一張關係表編寫一個DAO,提供一組增、刪、改、查方法供業務邏輯對數據庫操作使用。

更多的細節請大家參閱hibernate的網站獲取詳細的信息。並在各自的實踐和開發中加深體會。

Ibatis簡介

相對HibernateApache OJB "一站式"ORM解決方案而言,ibatis是一種"半自動化"ORM實現。所謂"半自動",可能理解上有點生澀。縱觀目前主流的ORM,無論Hibernate 還是Apache OJB,都對數據庫結構提供了較爲完整的封裝,提供了從POJO 到數據庫表的全套映射機制。程序員往往只需定義好了POJO到數據庫表的映射關係,即可通過Hibernate或者OJB提供的方法完成持久層操作。程序員甚至不需要對SQL的熟練掌握,Hibernate/OJB 會根據制定的存儲邏輯,自動生成對應的SQL並調用JDBC 接口加以執行。

Ibatis最直接的好處就是不但爲程序員提供了對象與關係數據庫之間的映射,同時提供操作方法與SQL間的直接影射,設計者可以直接爲一個方法指定一條SQL語句,從而取得更加準確的數據,同時爲優化查詢、連接查詢提供了方便。

一、基本功能

作爲又一個輕量級的ORM中間件,ibatis除了提供了對數據庫基本的增、刪、改、查外還提供了連接管理,緩存支持,線程支持,(分佈式)事物管理等一套教爲完整的數據庫管理功能。

SqlMapClient對象是ibatis持久層操作的基礎,相當於hibernate中的session,提供對SQL映射的方法。

insert()方法實現對插入SQL語句的映射;

delete()方法實現對刪除SQL語句的映射;

update()方法實現對更新SQL語句的影射;

queryForList()queryForMap()queryForObject()

queryForPaginatedList()等方法提供了一組查詢SQL語句的影射;

二、使用步驟

1ibatis SQL Map 配置文件

文件中對所用數據庫的連接做了基本配置,包括數據庫驅動類型、用戶名、密碼,以及連接池的相關管理數據。

2.PO和映射文件

hibernate一樣,PO作爲數據庫關係表的影射,也需要響應的映射配置文件,可以手寫,也可以藉助hibernate的相關工具生成PO,不會影響POibatis中的使用。與hibernate不同的是,ibatis的映射文件中沒有對PO中每個屬性做響應的描述,而是指定了一系列與PO有關的SQL相關操作,也體現了ibatis良好的靈活性與可擴展性。

3.編寫DAO

DAO中,可以使用SqlMapClient提供的方法來對應的指定對PO操作的SQL語句,從而使業務邏輯層的開發仍然是面向對象的操作。


選擇Hibernate還是iBATIS都有它的道理:

Hibernate的特點:

Hibernate功能強大,數據庫無關性好,O/R映射能力強,如果你對Hibernate相當精通,而且對Hibernate進行了適當的封裝,那麼你的項目整個持久層代碼會相當簡單,需要寫的代碼很少,開發速度很快,非常爽。以數據庫字段一一對應映射得到的POHibernte這種對象化映射得到的PO是截然不同的,本質區別在於這種PO是扁平化的,不像Hibernate映射的PO是可以表達立體的對象繼承,聚合等等關係的,這將會直接影響到你的整個軟件系統的設計思路。Hibernate對數據庫結構提供了較爲完整的封裝,HibernateO/R Mapping實現了POJO 和數據庫表之間的映射,以及SQL 的自動生成和執行。程序員往往只需定義好了POJO 到數據庫表的映射關係,即可通過Hibernate提供的方法完成持久層操作。程序員甚至不需要對SQL的熟練掌握,Hibernate/OJB 會根據制定的存儲邏輯,自動生成對應的SQL 並調用JDBC 接口加以執行。Hibernate的缺點就是學習門檻不低,要精通門檻更高,而且怎麼設計O/R映射,在性能和對象模型之間如何權衡取得平衡,以及怎樣用好Hibernate方面需要你的經驗和能力都很強才行,但是Hibernate現在已經是主流O/R Mapping框架,從文檔的豐富性,產品的完善性,版本的開發速度都要強於iBATIS

iBATIS的特點:

iBATIS入門簡單,即學即用,提供了數據庫查詢的自動對象綁定功能,而且延續了很好的SQL使用經驗,對於沒有那麼高的對象模型要求的項目來說,相當完美。iBATIS的缺點就是框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層數據庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速數據庫修改。當系統屬於二次開發,無法對數據庫結構做到控制和修改,iBATIS的靈活性將比Hibernate更適合。系統數據處理量巨大,性能要求極爲苛刻,這往往意味着我們必須通過經過高度優化的SQL語句(或存儲過程)才能達到系統性能設計指標。在這種情況下iBATIS會有更好的可控性和表現。對於實際的開發進行的比較:

1iBATIS需要手寫sql語句,也可以生成一部分,Hibernate則基本上可以自動生成,偶爾會寫一些Hql。同樣的需求,iBATIS的工作量比Hibernate要大很多。類似的,如果涉及到數據庫字段的修改,Hibernate修改的地方很少,而iBATIS要把那些sql mapping的地方一一修改。

2. iBatis可以進行細粒度的優化

比如說我有一個表,這個表有幾個或者幾十個字段,我需要更新其中的一個字段,iBatis很簡單,執行一個sql UPDATE TABLE_A SET column_1=#column_1# WHERE id=#id# 但是用Hibernate 的話就比較麻煩了,缺省的情況下hibernate 會更新所有字段。當然我記得hibernate 有一個選項可以控制只保存修改過的字段,但是我不太確定這個功能的負面效果。

例如:我需要列出一個表的部分內容,用iBatis的時候,這裏面的好處是可以少從數據庫讀很多數據,節省流量

SELECT ID, NAME 

FROM 

TABLE_WITH_A_LOT_OF_COLUMN 

WHERE 

...

一般情況下Hibernate 會把所有的字段都選出來。比如說有一個上面表有8個字段,其中有一兩個比較大的字段,varchar(255)/text。上面的場景中我爲什麼要把他們也選出來呢?用hibernate 的話,你又不能把這兩個不需要的字段設置爲lazy load,因爲還有很多地方需要一次把整個domain object 加載出來。這個時候就能顯現出ibatis的好處了。如果我需要更新一條記錄(一個對象),如果使用hibernate,需要現把對象select 出來,然後再做update。這對數據庫來說就是兩條sql。而iBatis只需要一條updatesql就可以了。減少一次與數據庫的交互,對於性能的提升是非常重要。

3. 開發方面:

開發效率上,我覺得兩者應該差不多。可維護性方面,我覺得iBatis更好一些。因爲iBatissql都保存到單獨的文件中。而Hibernate 在有些情況下可能會在java 代碼中保sql/hql。相對HibernateO/R”而言,iBATIS是一種“Sql Mapping”的ORM實現。而iBATIS的着力點,則在於POJO SQL之間的映射關係。也就是說,iBATIS並不會爲程序員在運行期自動生成SQL 執行。具體的SQL 需要程序員編寫,然後通過映射配置文件,將SQL所需的參數,以及返回的結果字段映射到指定POJO。使用iBATIS提供的ORM機制,對業務邏輯實現人員而言,面對的是純粹的Java對象,這一層與通過Hibernate 實現ORM 而言基本一致,而對於具體的數據操作,Hibernate會自動生成SQL語句,而iBATIS則要求開發者編寫具體的SQL 語句。相對Hibernate而言,iBATISSQL開發的工作量和數據庫移植性上的讓步,爲系統設計提供了更大的自由空間。

4. 運行效率

在不考慮cache 的情況下,iBatis應該會比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.總結:

Hibernate與MyBatis都可以是通過SessionFactoryBuider由XML配置文件生成SessionFactory,然後由SessionFactory 生成Session,最後由Session來開啓執行事務和SQL語句。

而MyBatis的優勢是MyBatis可以進行更爲細緻的SQL優化,可以減少查詢字段,並且容易掌握。

Hibernate的優勢是DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果映射。數據庫移植性很好,MyBatis的數據庫移植性不好,不同的數據庫需要寫不同SQL。有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章