Hibernate和Ibatis區別和比較

未來的你,在未來等你發表於2014-03-21

Hibernate簡介

Hibernate是當前最流行的o/r mapping框架,它出身於sf.net,現在已經成為jboss的一部分了,是一個開放原始碼的物件關係對映框架,它對JDBC進行了非常輕量級的物件封裝,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程式使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成資料持久化的重任。 hibernate 對資料庫結構提供了較為完整的封裝,hibernate的o/r mapping實現了pojo 和資料庫表之間的對映,以及sql 的自動生成和執行。程式設計師往往只需定義好了pojo 到資料庫表的對映關係,即可通過hibernate 提供的方法完成持久層操作。程式設計師甚至不需要對sql 的熟練掌握, hibernate/ojb 會根據制定的儲存邏輯,自動生成對應的sql 並呼叫jdbc 介面加以執行。

一、基本功能 Hibernate作為資料持久化的中介軟體,足以讓資料庫在業務邏輯層開發中去冬眠。它通過可擴充套件標記語言(XML)實現了類和資料表之間的對映,使程式設計師在業務邏輯的開發中面向資料庫而改為物件導向開發。使整個專案開發分工更加明確,提高了程式開發的效率。

configuration物件: Configuration 類負責管理Hibernate 的配置資訊。Hibernate 執行時需要 獲取一些底層實現的基本資訊,其中幾個關鍵屬性包括: 資料庫URL 資料庫使用者 資料庫使用者密碼 資料庫JDBC驅動類 資料庫dialect,用於對特定資料庫提供支援,其中包含了針對特定資料庫特性的實現,如Hibernate資料型別到特定資料庫資料型別的對映等。 以上資訊一般情況下由hibernate.cfg.xml或者hibernate.properties檔案來配置,實現與不同資料庫的連線。

Session物件: Session是持久層操作的基礎,相當於JDBC中的Connection: 例項通過SessionFactory例項構建: Configuration config = new Configuration().configure();

SessionFactory sessionFactory = config.buildSessionFactory();

Session session = sessionFactory.openSession();

之後我們就可以呼叫Session所提供的save、find、flush等方法完成持久層操作。因此Session物件也封裝了所有對資料庫的操作來實現

Hibernate對資料庫的操縱功能,如: Save()方法實現增加和儲存;

Delete()方法實現資料的刪除;

Update()方法實現資料更新和修改;

Find()方法實現資料的檢索;

Hibernate會根據不同的操作自動生成相應的SQL語句,從而實現了程式設計師對PO物件的操作轉化為對資料庫關係表的操作。

二、使用步驟 1.編寫Hibernate配置檔案

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

2.PO和對映檔案

使用middlegen和hibernate-extensions從資料庫匯出PO的對映檔案,並在hibernate.cfg.xml當中宣告。

3.編寫DAO

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

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

Ibatis簡介

Ibatis是另外一種優秀的o/r mapping框架,目前屬於apache的一個子專案了。

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

Ibatis最直接的好處就是不但為程式設計師提供了物件與關聯式資料庫之間的對映,同時提供操作方法與SQL間的直接影射,設計者可以直接為一個方法指定一條SQL語句,從而取得更加準確的資料,同時為優化查詢、連線查詢提供了方便。 而ibatis 的著力點,則在於pojo 與sql之間的對映關係。也就是說,ibatis並不會為程式設計師在執行期自動生成sql 執行。具體的sql 需要程式設計師編寫,然後通過對映配置檔案,將sql所需的引數,以及返回的結果欄位對映到指定pojo。

一、基本功能 作為又一個輕量級的ORM中介軟體,ibatis除了提供了對資料庫基本的增、刪、改、查外還提供了連線管理,快取支援,執行緒支援,(分散式)事物管理等一套教為完整的資料庫管理功能。

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

insert()方法實現對插入SQL語句的對映; delete()方法實現對刪除SQL語句的對映; update()方法實現對更新SQL語句的影射; queryForList()、queryForMap()、queryForObject()、queryForPaginatedList()等方法提供了一組查詢SQL語句的影射; 二、使用步驟 1.ibatis SQL Map 配置檔案

   檔案中對所用資料庫的連線做了基本配置,包括資料庫驅動型別、使用者名稱、密碼,以及連線池的相關管理資料。 

2.PO和對映檔案

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

3.編寫DAO

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

Hibernate的特點: Hibernate功能強大,資料庫無關性好,O/R對映能力強,如果你對Hibernate相當精通,而且對Hibernate進行了適當的封裝,那麼你的專案整個持久層程式碼會相當簡單,需要寫的程式碼很少,開發速度很快,非常爽。以資料庫欄位一一對應對映得到的PO和Hibernte這種物件化對映得到的PO是截然不同的,本質區別在於這種PO是扁平化的,不像Hibernate對映的PO是可以表達立體的物件繼承,聚合等等關係的,這將會直接影響到你的整個軟體系統的設計思路。Hibernate對資料庫結構提供了較為完整的封裝,Hibernate的O/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會有更好的可控性和表現。

batis的作者說的:

if you are starting a new project and you're in full control of your object model and database design, hibernate is a good choice of o/r tool.

if you are accessing any 3rd party databases (e.g. vendor supplied), or you're working with a legacy database, or even just a really poorly designed database, then an o/r mapper might not be capable of handling the situation. that's were an sql mapper comes in handy

google翻譯是這樣寫的:

如果你開始了一個新的專案,你完全控制你的物件模型和資料庫設計,Hibernate O/R工具是一個不錯的選擇。 如果您正在訪問的任何第三方的資料庫(如供應商提供),或者你正在使用一箇舊的資料庫,甚至只是一個非常糟糕的設計資料庫,然而一個O / R對映器可能不能夠處理的情況。這是一個SQL對映器就派上用場了

對於實際的開發進行的比較:

1.對於sql語句

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

  1. 對於查詢表的一些優點

例如表的更新操作:

hibernate 會先把物件先select出來然後在update ibatis 只用一條update語句就可以完成 減少一次與資料庫的互動,對於效能的提升是非常重要。

  1. 開發方面:

可維護性方面,iBatis 更佔優勢。因為 iBatis 的 sql 都儲存到單獨的檔案中。而 Hibernate 在有些情況下可能會在 java 程式碼中保sql/hql。 相對Hibernate“O/R”而言,iBATIS 是一種“Sql Mapping”的ORM實現。 而iBATIS 的著力點,則在於POJO 與SQL之間的對映關係。也就是說,iBATIS並不會為程式設計師在執行期自動生成SQL 執行。具體的SQL 需要程式設計師編寫,然後通過對映配置檔案,將SQL所需的引數,以及返回的結果欄位對映到指定POJO。使用iBATIS 提供的ORM機制,對業務邏輯實現人員而言,面對的是純粹的Java物件,這一層與通過Hibernate 實現ORM 而言基本一致,而對於具體的資料操作,Hibernate會自動生成SQL 語句,而iBATIS 則要求開發者編寫具體的SQL 語句。相對Hibernate而言,iBATIS 以SQL開發的工作量和資料庫移植性上的讓步,為系統設計提供了更大的自由空間。 4. 執行效率

在不考慮 cache 的情況下,iBatis 應該會比hibernate 快一些或者很多。

5.二次開發

當系統屬於二次開發,無法對資料庫結構做到控制和修改,那ibatis的靈活性將比hibernate更適合

6.學習成本

ibatis非常簡單易學,hibernate相對較複雜,門檻較高。

7.海量資料

系統資料處理量巨大,效能要求極為苛刻,這往往意味著我們必須通過經過高度優化的sql語句(或儲存過程)才能達到系統效能設計指標。在這種情況下ibatis會有更好的可控性和表現。

8.與資料對映關係

ibatis以資料庫欄位一一對應對映得到的po和hibernte這種物件化對映得到的po是截然不同的,本質區別在於這種po是扁平化的 hibernate對映的po是可以表達立體的物件繼承,聚合等等關係的,這將會直接影響到你的整個軟體系統的設計思路。 8.自動化程度

ibatis需要手寫sql語句,也可以生成一部分,hibernate則基本上可以自動生成,偶爾會寫一些hql。同樣的需求,ibatis的工作量比 hibernate要大很多。類似的,如果涉及到資料庫欄位的修改,hibernate修改的地方很少,而ibatis要把那些sql mapping的地方一一修改。

相關文章