數據庫持久層框架iBatis、myBatis、Hibernate對比

  在 java 應用的數據庫開發中,不可避免地會使用到持久層框架,而現在開源項目中持久層框架用到最多的基本就是 iBatis、myBatis 和 Hibernate 了。這裏就重點分析下這三個框架之間的區別。

iBatis 與 Hibernate
  iBatis 是基於SQL映射的持久層框架,相對 Hibernate 一站工的ORM解決框架來言,iBatis 算是一種半自動化的ORM實現。兩者的區別是:

  • 1.Hibernate 是當前最流行、最經典的o/r mapping框架;而 iBatis 相對 Hibernate“o/r”而言是一種“sql mapping”的orm實現。
    2.iBatis入門簡單,即學即用;而Hibernate則相對來說較爲複雜,學習門檻不低,要精通門檻更高,而且怎麼設計O/R映射,在性能和對象模型之間如何權衡取得平衡,怎樣用好 Hibernate 方面需要經驗和能力都很強才行。
    3.對於具體的數據操作,Hibernate 會自動生成sql 語句,能夠在程序運行時自動生成,能夠自動建表,無論到什麼機器上,都不需要數據庫,都能自動完成遷移;而iBatis 則要求開發者編寫具體的sql 語句,且必須要有相應的數據庫表才能進行數據庫的移植。相對 Hibernate 而言,iBatis 以sql開發的工作量和數據庫移植性上的讓步,爲系統設計提供了更大的自由空間。
    4.Hibernate 功能強大,數據庫無關性好,O/R(對象/關係)映射能力強,Hibernate 對數據庫結構提供了較爲完整的封裝,Hibernate 的O/R Mapping實現了POJO(實體類) 和數據庫表之間的映射,以及SQL 的自動生成和執行。程序員往往只需定義好了POJO 到數據庫表的映射關係,即可通過 Hibernate 提供的方法完成持久層操作。程序員甚至不需要對SQL 的熟練掌握, Hibernate/OJB 會根據制定的存儲邏輯,自動生成對應的SQL 並調用JDBC 接口加以執行;而 iBatis 的着力點,則在於pojo與sql之間的映射關係。也就是說,iBatis 並不會爲程序員在運行期自動生成sql 執行。具體的sql需要程序員編寫,然後通過映射配置文件,將sql所需的參數,以及返回的結果字段映射到指定pojo。使用 iBatis 提供的orm機制,對業務邏輯實現人員而言,面對的是純粹的java對象,缺點就是框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層數據庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速數據庫修改。如果涉及到數據庫字段的修改,Hibernate 修改的地方很少,而 iBatis 要把那些sql mapping的地方一一修改。
    5.當系統屬於二次開發,無法對數據庫結構做到控制和修改,那 iBatis 的靈活性將比 Hibernate 更適合。系統數據處理量巨大,性能要求極爲苛刻,這往往意味着我們必須通過經過高度優化的SQL語句(或存儲過程)才能達到系統性能設計指標。在這種情況下 iBatis 會有更好的可控性和表現。
    6.Hibernate 現在已經是主流O/R Mapping框架,從文檔的豐富性,產品的完善性,版本的開發速度都要強於iBatis。


iBatis與myBatis
  iBatis是2002年發起的開放源代碼項目,之前一直託管在apache下,於2010年6月16號被谷歌託管,改名爲MyBatis,myBatis 與 iBatis 一樣,也是一種“半自動化”的ORM實現,共同的優點:

  • 1.是一個基於Java的持久層框架
    2.提供的持久層框架包括SQL Maps和Data Access Objects(DAO)
    3.支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架
    4.消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索
    5.使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄

總體流程:

  • 1.加載配置並初始化
    2.接收調用請求
    3.處理操作請求
    4.返回處理結果將最終的處理結果返回

功能架構:

  • 1.API接口層:提供給外部使用的接口API,開發人員通過這些本地API來操縱數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。
    2.數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操作。
    3.基礎支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作爲最基礎的組件。爲上層的數據處理層提供最基礎的支撐。

當然,iBatis 改名爲 myBatis 後,進行了一部分的改良,myBatis 在很多地方都藉助於 JDK 的泛型和註解特性進行了簡化,他們的主要區別是:

  • 1.mybatis 實現了接口綁定,使用更加方便。在 iBatis 中我們需要在DAO的實現類中指定具體對應哪個xml映射文件。簡單地講,就是 myBatis 不需要寫DAO接口的實現類了,已經自動實現了接口與xml映射文件的對應。
    2.對象關係映射的改進,效率更高。myBatis中,除了兼容 iBatis2.x 中的“嵌套查詢”方式外,還提供了直接“嵌套結果”的方式,其效果相當於直接通過一句sql將查詢出的dto對象自動封裝成所需的對象,但這一方式在使用分頁的時候並不起作用,或者說嵌套對象的結果集是不允許進行分頁的。
    3.個別配置的方法更改。iBatis 習慣把全局配置文件命名爲 sqlMapConfig.xml, myBatis 將該文件命名爲 Configuration.xml 。iBatis 僅是以 SQL 映射爲核心的框架,而在 myBatis 中多以 Mapper、Session、Configuration 等其他常用 ORM 框架中的名字代替,體現的無非是兩個方面:首先是爲了減少開發者在切換框架所帶來的學習成本;其次,myBatis 充分吸收了其他 ORM 框架好的實踐,myBatis 現在已不僅僅是一個 SQL 映射框架了。在 iBatis 中,namespace 不是必需的,且它的存在沒有實際的意義。在 myBatis 中,namespace 終於派上用場了,它使得映射文件與接口綁定變得非常自然。
    4.myBatis 採用功能強大的基於OGNL的表達式來消除其他元素。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章