Mybatis和Hibernate的區別、優缺點


一、概述

MyBatis和Hibernate是當前流行的ORM框架。Hibernate對數據庫結構提供了較為完整的封裝,全自動ORM框架。MyBatis主要着力點在於java對象與SQL之間的映射關系,半自動ORM框架。

注:ORM:簡單的來說就是將Java中的對象與數據庫中的表關聯對應起來。

1.MyBatis:MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或注解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

把Mybatis的功能架構分為三層:

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

優點:

  • 簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar文件+配置幾個sql映射文件易於學習,易於使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。
  • 靈活:mybatis不會對應用程序或者數據庫的現有設計強加任何影響。 sql寫在xml里,便於統一管理和優化。通過sql基本上可以實現我們不使用數據訪問框架可以實現的所有功能,或許更多。
  • 解除sql與程序代碼的耦合:通過提供DAL層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。
  • 提供映射標簽,支持對象與數據庫的orm字段關系映射
  • 提供對象關系映射標簽,支持對象關系組建維護
  • 提供xml標簽,支持編寫動態sql。

缺點:

  • 編寫SQL語句時工作量很大,尤其是字段多、關聯表多時,更是如此。
  • SQL語句依賴於數據庫,導致數據庫移植性差,不能更換數據庫。
  • 框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層數據庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速數據庫修改。
  • 二級緩存機制不佳

了解更多關於MySQL可以參見:https://www.w3cschool.cn/mybatis/

2.Hibernate:

Hibernate 是由 Gavin King 於 2001 年創建的開放源代碼的對象關系框架。它強大且高效的構建具有關系對象持久性和查詢服務的 Java 應用程序。

Hibernate 將 Java 類映射到數據庫表中,從 Java 數據類型中映射到 SQL 數據類型中,並把開發人員從 95% 的公共數據持續性編程工作中解放出來。

Hibernate 是傳統 Java 對象和數據庫服務器之間的橋梁,用來處理基於 O/R 映射機制和模式的那些對象。

image

優勢:

  • Hibernate 使用 XML 文件來處理映射 Java 類別到數據庫表格中,並且不用編寫任何代碼。
  • 為在數據庫中直接儲存和檢索 Java 對象提供簡單的 APIs。
  • 如果在數據庫中或任何其它表格中出現變化,那么僅需要改變 XML 文件屬性。
  • 抽象不熟悉的 SQL 類型,並為我們提供工作中所熟悉的 Java 對象。
  • Hibernate 不需要應用程序服務器來操作。
  • 操控你數據庫中對象復雜的關聯。
  • 最小化與訪問數據庫的智能提取策略。
  • 提供簡單的數據詢問。

支持的數據庫:

Hibernate 支持幾乎所有的主要 RDBMS。以下是一些由 Hibernate 所支持的數據庫引擎。

  • HSQL Database Engine
  • DB2/NT
  • MySQL
  • PostgreSQL
  • FrontBase
  • Oracle
  • Microsoft SQL Server Database
  • Sybase SQL Server
  • Informix Dynamic Server

支持的技術:

Hibernate 支持多種多樣的其它技術,包括以下:

  • XDoclet Spring
  • J2EE
  • Eclipse plug-ins
  • Maven

想了解更多關於Hibernate可以參見:https://www.w3cschool.cn/hibernate/skzl1idz.html

二、對比(參見:https://blog.csdn.net/eff666/article/details/71332386)

1.不同

(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。

(6)緩存機制上,hibernate要比mybatis更好一些

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

而Hibernate對查詢對象有着良好的管理機制,用戶無需關心SQL。所以在使用二級緩存時如果出現臟數據,系統會報出錯誤並提示。

2.相同

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

其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。Hibernate和MyBatis都支持JDBC和JTA事務處理。

三、總結

1.兩者相同點
Hibernate和Mybatis的二級緩存除了采用系統默認的緩存機制外,都可以通過實現你自己的緩存或為其他第三方緩存方案,創建適配器來完全覆蓋緩存行為。

2.兩者不同點
Hibernate的二級緩存配置在SessionFactory生成的配置文件中進行詳細配置,然后再在具體的表-對象映射中配置是那種緩存。而MyBatis在使用二級緩存時需要特別小心。如果不能完全確定數據更新操作的波及范圍,避免Cache的盲目使用。否則,臟數據的出現會給系統的正常運行帶來很大的隱患。

3.舉個形象的比喻

MyBatis:機械工具,使用方便,拿來就用,但工作還是要自己來作,不過工具是活的,怎么使由我決定。(小巧、方便、高效、簡單、直接、半自動)

Hibernate:智能機器人,但研發它(學習、熟練度)的成本很高,工作都可以擺脫他了,但僅限於它能做的事。(強大、方便、高效、復雜、繞彎子、全自動)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM