mybatis和hibernate的對比總結(jié)

mybatis和hibernate
 第一步, 首先讓我們對mybatis和hibernate對比了解下         
1、 Hibernate :Hibernate 是當(dāng)前非常流行的ORM框架,對數(shù)據(jù)庫結(jié)構(gòu)提供了較為完整的封裝,都是為了簡化Dao層的操作。
    Mybatis:Mybatis同樣也是非常流行的ORM框架,主要著力點在于POJO 與SQL之間的映射關(guān)系,都是為了簡化Dao層的操作。

2、Hibernate與MyBatis都可以是通過SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生 成Session,最后由Session來開啟執(zhí)行事務(wù)和SQL語句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是  
    差不多的。Hibernate和MyBatis都支持JDBC和JTA事務(wù)處理。

3、Hibernate和Mybatis的二級緩存除了采用系統(tǒng)默認的緩存機制外,都可以通過實現(xiàn)你自己的緩存或為其他第三方緩存方 案,創(chuàng)建適配器來完全覆蓋緩存行為,一般在這里的話我們用encache和mybatis和spring集成比較多,這個時候你可以你學(xué)習(xí)下encache也可以去了解小分布式緩存mencached 還有oschache都可以學(xué)習(xí)下。

   MyBatis 參考資料官網(wǎng):http://www.mybatis.org/core/zh/index.html
   Hibernate參考資料: http://docs.jboss.org/hibernate/core/3.6/reference/zh-CN/html_single/
   不同點:
1、hibernate是全自動,而mybatis是半自動。
   Hibernate完全實現(xiàn)了對JDBC的封裝,可看成"全自動洗衣機".調(diào)用一個save()方法就能實現(xiàn)插入操作,完全不需要寫sql.當(dāng)然,它也支持類似sql的hql語句.ibatis需要自己寫sql,但是sql寫在配置文件(.xml)文件里面,可看成"半自動洗衣機".mybatis初級階段可理解成就是ibatis.
      
2、hibernate不怎么需要寫sql,而mybatis需要把sql寫在配置文件里面。

3、 hibernate數(shù)據(jù)庫移植性和擴展性遠大于mybatis,維護性比較好。
    Mybatis由于所有SQL都是依賴數(shù)據(jù)庫書寫的,所以擴展性,遷移性比較差,成本很高。Hibernate與數(shù)據(jù)庫具體的關(guān)聯(lián)都在XML中,所以HQL對具體是用什么數(shù)據(jù)庫并不是很關(guān)心,大大降低了對象與數(shù)據(jù)庫(oracle、mysql等)的耦合性。
       
4、hibernate開發(fā)速度比mybatis相對快點
   Hibernate的開發(fā)難度要大于Mybatis。主要由于Hibernate比較復(fù)雜、龐大,學(xué)習(xí)周期較長。
   而Mybatis則相對簡單一些,并且Mybatis主要依賴于sql的書寫,讓開發(fā)者感覺更熟悉。
   Hibernate和MyBatis都有相應(yīng)的代碼生成工具??梢陨珊唵位镜腄AO層方法。
   針對高級查詢,Mybatis需要手動編寫SQL語句,以及ResultMap。而Hibernate有良好的映射機制,開發(fā)者無需關(guān)心SQL的生成與結(jié)果映射,可以更專注于業(yè)務(wù)流程。

5、 hibernate擁有完整的日志系統(tǒng),mybatis則欠缺一些。
    hibernate日志系統(tǒng)非常健全,涉及廣泛,包括:sql記錄、關(guān)系異常、優(yōu)化警告、緩存提示、臟數(shù)據(jù)警告等;而mybatis則除了基本記錄功能外,功能薄弱很多。

6、mybatis相比hibernate需要關(guān)心很多細節(jié)
   hibernate配置要比mybatis復(fù)雜的多,學(xué)習(xí)成本也比mybatis高。但也正因為mybatis使用簡單,才導(dǎo)致它要比hibernate關(guān)心很多技術(shù)細節(jié)。mybatis由于不用考慮很多細節(jié),開發(fā)模式上與傳統(tǒng)jdbc區(qū)別很小,因此很容易上手并開發(fā)項目,但忽略細節(jié)會導(dǎo)致項目前期bug較多,因而開發(fā)出相對穩(wěn)定的軟件很慢,而開發(fā)出軟件卻很快。hibernate則正好與之相反。但是如果使用hibernate很熟練的話,實際上開發(fā)效率絲毫不差于甚至超越mybatis。

7、hibernate緩存機制比mybatis強大
     
   Hibernate一級緩存是Session緩存,利用好一級緩存就需要對Session的生命周期進行管理好。建議在一個Action操作中使用一個Session。一級緩存需要對Session進行嚴格管理。

   Hibernate二級緩存是SessionFactory級的緩存。 SessionFactory的緩存分為內(nèi)置緩存和外置緩存。內(nèi)置緩存中存放的是SessionFactory對象的一些集合屬性包含的數(shù)據(jù)(映射元素據(jù)及預(yù)定SQL語句等),對于應(yīng)用程序來說,它是只讀的。外置緩存中存放的是數(shù)據(jù)庫數(shù)據(jù)的副本,其作用和一級緩存類似.二級緩存除了以內(nèi)存作為存儲介質(zhì)外,還可以選用硬盤等外部存儲設(shè)備。二級緩存稱為進程級緩存或SessionFactory級緩存,它可以被所有session共享,它的生命周期伴隨著SessionFactory的生命周期存在和消亡。

   MyBatis 包含一個非常強大的查詢緩存特性,它可以非常方便地配置和定制。MyBatis 3 中的緩存實現(xiàn)的很多改進都已經(jīng)實現(xiàn)了,使得它更加強大而且易于配置。

   默認情況下是沒有開啟緩存的,除了局部的 session 緩存,可以增強變現(xiàn)而且處理循環(huán) 依賴也是必須的。要開啟二級緩存,你需要在你的 SQL 映射文件中添加一行:

  字面上看就是這樣。這個簡單語句的效果如下:

  映射語句文件中的所有 select 語句將會被緩存。
  映射語句文件中的所有 insert,update 和 delete 語句會刷新緩存。
  緩存會使用 Least Recently Used(LRU,最近最少使用的)算法來收回。
  根據(jù)時間表(比如 no Flush Interval,沒有刷新間隔), 緩存不會以任何時間順序 來刷新。
  緩存會存儲列表集合或?qū)ο?無論查詢方法返回什么)的 1024 個引用。
  緩存會被視為是 read/write(可讀/可寫)的緩存,意味著對象檢索不是共享的,而 且可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改

8、sql直接優(yōu)化上,mybatis要比hibernate方便很多
   由于mybatis的sql都是寫在xml里,因此優(yōu)化sql比hibernate方便很多。而hibernate的sql很多都是自動生成的,無法直接維護sql;雖有hql,但功能還是不及sql強大,見到報表等變態(tài)需求時,hql也歇菜,也就是說hql是有局限的;hibernate雖然也支持原生sql,但開發(fā)模式上卻與orm不同,需要轉(zhuǎn)換思維,因此使用上不是非常方便。總之寫sql的靈活度上hibernate不及mybatis。

9、mybait比hibernate更加靈活,駕馭型更好

  Mybatis優(yōu)勢
  MyBatis可以進行更為細致的SQL優(yōu)化,可以減少查詢字段。
  MyBatis容易掌握,而Hibernate門檻較高。
  Hibernate優(yōu)勢
  Hibernate的DAO層開發(fā)比MyBatis簡單,Mybatis需要維護SQL和結(jié)果映射。
  Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。
  Hibernate數(shù)據(jù)庫移植性很好,MyBatis的數(shù)據(jù)庫移植性不好,不同的數(shù)據(jù)庫需要寫不同SQL。
  Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。
 



作者:chen.yu
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進階人工智能(鏈接)