mybatis和hibernate的對(duì)比總結(jié)
mybatis和hibernate
第一步, 首先讓我們對(duì)mybatis和hibernate對(duì)比了解下
1、 Hibernate :Hibernate 是當(dāng)前非常流行的ORM框架,對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)提供了較為完整的封裝,都是為了簡(jiǎn)化Dao層的操作。
Mybatis:Mybatis同樣也是非常流行的ORM框架,主要著力點(diǎn)在于POJO 與SQL之間的映射關(guān)系,都是為了簡(jiǎn)化Dao層的操作。
2、Hibernate與MyBatis都可以是通過(guò)SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生 成Session,最后由Session來(lái)開(kāi)啟執(zhí)行事務(wù)和SQL語(yǔ)句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是
差不多的。Hibernate和MyBatis都支持JDBC和JTA事務(wù)處理。
3、Hibernate和Mybatis的二級(jí)緩存除了采用系統(tǒng)默認(rèn)的緩存機(jī)制外,都可以通過(guò)實(shí)現(xiàn)你自己的緩存或?yàn)槠渌谌骄彺娣?案,創(chuàng)建適配器來(lái)完全覆蓋緩存行為,一般在這里的話我們用encache和mybatis和spring集成比較多,這個(gè)時(shí)候你可以你學(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/
不同點(diǎn):
1、hibernate是全自動(dòng),而mybatis是半自動(dòng)。
Hibernate完全實(shí)現(xiàn)了對(duì)JDBC的封裝,可看成"全自動(dòng)洗衣機(jī)".調(diào)用一個(gè)save()方法就能實(shí)現(xiàn)插入操作,完全不需要寫sql.當(dāng)然,它也支持類似sql的hql語(yǔ)句.ibatis需要自己寫sql,但是sql寫在配置文件(.xml)文件里面,可看成"半自動(dòng)洗衣機(jī)".mybatis初級(jí)階段可理解成就是ibatis.
2、hibernate不怎么需要寫sql,而mybatis需要把sql寫在配置文件里面。
3、 hibernate數(shù)據(jù)庫(kù)移植性和擴(kuò)展性遠(yuǎn)大于mybatis,維護(hù)性比較好。
Mybatis由于所有SQL都是依賴數(shù)據(jù)庫(kù)書寫的,所以擴(kuò)展性,遷移性比較差,成本很高。Hibernate與數(shù)據(jù)庫(kù)具體的關(guān)聯(lián)都在XML中,所以HQL對(duì)具體是用什么數(shù)據(jù)庫(kù)并不是很關(guān)心,大大降低了對(duì)象與數(shù)據(jù)庫(kù)(oracle、mysql等)的耦合性。
4、hibernate開(kāi)發(fā)速度比mybatis相對(duì)快點(diǎn)
Hibernate的開(kāi)發(fā)難度要大于Mybatis。主要由于Hibernate比較復(fù)雜、龐大,學(xué)習(xí)周期較長(zhǎng)。
而Mybatis則相對(duì)簡(jiǎn)單一些,并且Mybatis主要依賴于sql的書寫,讓開(kāi)發(fā)者感覺(jué)更熟悉。
Hibernate和MyBatis都有相應(yīng)的代碼生成工具??梢陨珊?jiǎn)單基本的DAO層方法。
針對(duì)高級(jí)查詢,Mybatis需要手動(dòng)編寫SQL語(yǔ)句,以及ResultMap。而Hibernate有良好的映射機(jī)制,開(kāi)發(fā)者無(wú)需關(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)心很多細(xì)節(jié)
hibernate配置要比mybatis復(fù)雜的多,學(xué)習(xí)成本也比mybatis高。但也正因?yàn)閙ybatis使用簡(jiǎn)單,才導(dǎo)致它要比hibernate關(guān)心很多技術(shù)細(xì)節(jié)。mybatis由于不用考慮很多細(xì)節(jié),開(kāi)發(fā)模式上與傳統(tǒng)jdbc區(qū)別很小,因此很容易上手并開(kāi)發(fā)項(xiàng)目,但忽略細(xì)節(jié)會(huì)導(dǎo)致項(xiàng)目前期bug較多,因而開(kāi)發(fā)出相對(duì)穩(wěn)定的軟件很慢,而開(kāi)發(fā)出軟件卻很快。hibernate則正好與之相反。但是如果使用hibernate很熟練的話,實(shí)際上開(kāi)發(fā)效率絲毫不差于甚至超越mybatis。
7、hibernate緩存機(jī)制比mybatis強(qiáng)大
Hibernate一級(jí)緩存是Session緩存,利用好一級(jí)緩存就需要對(duì)Session的生命周期進(jìn)行管理好。建議在一個(gè)Action操作中使用一個(gè)Session。一級(jí)緩存需要對(duì)Session進(jìn)行嚴(yán)格管理。
Hibernate二級(jí)緩存是SessionFactory級(jí)的緩存。 SessionFactory的緩存分為內(nèi)置緩存和外置緩存。內(nèi)置緩存中存放的是SessionFactory對(duì)象的一些集合屬性包含的數(shù)據(jù)(映射元素?fù)?jù)及預(yù)定SQL語(yǔ)句等),對(duì)于應(yīng)用程序來(lái)說(shuō),它是只讀的。外置緩存中存放的是數(shù)據(jù)庫(kù)數(shù)據(jù)的副本,其作用和一級(jí)緩存類似.二級(jí)緩存除了以內(nèi)存作為存儲(chǔ)介質(zhì)外,還可以選用硬盤等外部存儲(chǔ)設(shè)備。二級(jí)緩存稱為進(jìn)程級(jí)緩存或SessionFactory級(jí)緩存,它可以被所有session共享,它的生命周期伴隨著SessionFactory的生命周期存在和消亡。
MyBatis 包含一個(gè)非常強(qiáng)大的查詢緩存特性,它可以非常方便地配置和定制。MyBatis 3 中的緩存實(shí)現(xiàn)的很多改進(jìn)都已經(jīng)實(shí)現(xiàn)了,使得它更加強(qiáng)大而且易于配置。
默認(rèn)情況下是沒(méi)有開(kāi)啟緩存的,除了局部的 session 緩存,可以增強(qiáng)變現(xiàn)而且處理循環(huán) 依賴也是必須的。要開(kāi)啟二級(jí)緩存,你需要在你的 SQL 映射文件中添加一行:
字面上看就是這樣。這個(gè)簡(jiǎn)單語(yǔ)句的效果如下:
映射語(yǔ)句文件中的所有 select 語(yǔ)句將會(huì)被緩存。
映射語(yǔ)句文件中的所有 insert,update 和 delete 語(yǔ)句會(huì)刷新緩存。
緩存會(huì)使用 Least Recently Used(LRU,最近最少使用的)算法來(lái)收回。
根據(jù)時(shí)間表(比如 no Flush Interval,沒(méi)有刷新間隔), 緩存不會(huì)以任何時(shí)間順序 來(lái)刷新。
緩存會(huì)存儲(chǔ)列表集合或?qū)ο?無(wú)論查詢方法返回什么)的 1024 個(gè)引用。
緩存會(huì)被視為是 read/write(可讀/可寫)的緩存,意味著對(duì)象檢索不是共享的,而 且可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改
8、sql直接優(yōu)化上,mybatis要比hibernate方便很多
由于mybatis的sql都是寫在xml里,因此優(yōu)化sql比hibernate方便很多。而hibernate的sql很多都是自動(dòng)生成的,無(wú)法直接維護(hù)sql;雖有hql,但功能還是不及sql強(qiáng)大,見(jiàn)到報(bào)表等變態(tài)需求時(shí),hql也歇菜,也就是說(shuō)hql是有局限的;hibernate雖然也支持原生sql,但開(kāi)發(fā)模式上卻與orm不同,需要轉(zhuǎn)換思維,因此使用上不是非常方便??傊畬憇ql的靈活度上hibernate不及mybatis。
9、mybait比hibernate更加靈活,駕馭型更好
Mybatis優(yōu)勢(shì)
MyBatis可以進(jìn)行更為細(xì)致的SQL優(yōu)化,可以減少查詢字段。
MyBatis容易掌握,而Hibernate門檻較高。
Hibernate優(yōu)勢(shì)
Hibernate的DAO層開(kāi)發(fā)比MyBatis簡(jiǎn)單,Mybatis需要維護(hù)SQL和結(jié)果映射。
Hibernate對(duì)對(duì)象的維護(hù)和緩存要比MyBatis好,對(duì)增刪改查的對(duì)象的維護(hù)要方便。
Hibernate數(shù)據(jù)庫(kù)移植性很好,MyBatis的數(shù)據(jù)庫(kù)移植性不好,不同的數(shù)據(jù)庫(kù)需要寫不同SQL。
Hibernate有更好的二級(jí)緩存機(jī)制,可以使用第三方緩存。MyBatis本身提供的緩存機(jī)制不佳。
作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)