|
為方便以后準(zhǔn)備面試,把一些常用的技術(shù)整理出來(lái),會(huì)不定期更新。
首先簡(jiǎn)單介紹下兩者的概念: Hibernate :Hibernate 是當(dāng)前最流行的ORM框架,對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)提供了較為完整的封裝。
Mybatis:Mybatis同樣也是非常流行的ORM框架,主要著力點(diǎn)在于POJO 與SQL之間的映射關(guān)系。
其次具體從幾個(gè)方面說(shuō)一下兩者的區(qū)別: 1.兩者最大的區(qū)別: 針對(duì)簡(jiǎn)單邏輯,Hibernate和MyBatis都有相應(yīng)的代碼生成工具,可以生成簡(jiǎn)單基本的DAO層方法。
針對(duì)高級(jí)查詢,Mybatis需要手動(dòng)編寫SQL語(yǔ)句,以及ResultMap。而Hibernate有良好的映射機(jī)制,開發(fā)者無(wú)需關(guān)心SQL的生成與結(jié)果映射,可以更專注于業(yè)務(wù)流程。
2.開發(fā)難度對(duì)比 Hibernate的開發(fā)難度要大于Mybatis。主要由于Hibernate比較復(fù)雜、龐大,學(xué)習(xí)周期較長(zhǎng)。
而Mybatis則相對(duì)簡(jiǎn)單一些,并且Mybatis主要依賴于sql的書寫,讓開發(fā)者感覺(jué)更熟悉。
3.sql書寫比較
Mybatis的SQL是手動(dòng)編寫的,所以可以按需求指定查詢的字段。不過(guò)沒(méi)有自己的日志統(tǒng)計(jì),所以要借助log4j來(lái)記錄日志。 Hibernate也可以自己寫SQL來(lái)指定需要查詢的字段,但這樣就破壞了Hibernate開發(fā)的簡(jiǎn)潔性。不過(guò)Hibernate具有自己的日志統(tǒng)計(jì)。
4.數(shù)據(jù)庫(kù)擴(kuò)展性比較 Mybatis由于所有SQL都是依賴數(shù)據(jù)庫(kù)書寫的,所以擴(kuò)展性,遷移性比較差。
Hibernate與數(shù)據(jù)庫(kù)具體的關(guān)聯(lián)都在XML中,所以HQL對(duì)具體是用什么數(shù)據(jù)庫(kù)并不是很關(guān)心。
5.緩存機(jī)制比較
相同點(diǎn):Hibernate和Mybatis的二級(jí)緩存除了采用系統(tǒng)默認(rèn)的緩存機(jī)制外,都可以通過(guò)實(shí)現(xiàn)你自己的緩存或?yàn)槠渌谌骄彺娣桨?,?chuàng)建適配器來(lái)完全覆蓋緩存行為。 不同點(diǎn):Hibernate的二級(jí)緩存配置在SessionFactory生成的配置文件中進(jìn)行詳細(xì)配置,然后再在具體的表-對(duì)象映射中配置是那種緩存。 MyBatis的二級(jí)緩存配置都是在每個(gè)具體的表-對(duì)象映射中進(jìn)行詳細(xì)配置,這樣針對(duì)不同的表可以自定義不同的緩存機(jī)制。并且Mybatis可以在命名空間中共享相同的緩存配置和實(shí)例,通過(guò)Cache-ref來(lái)實(shí)現(xiàn)。 兩者比較:因?yàn)?/span>Hibernate對(duì)查詢對(duì)象有著良好的管理機(jī)制,用戶無(wú)需關(guān)心SQL。所以在使用二級(jí)緩存時(shí)如果出現(xiàn)臟數(shù)據(jù),系統(tǒng)會(huì)報(bào)出錯(cuò)誤并提示。 而MyBatis在這一方面,使用二級(jí)緩存時(shí)需要特別小心。如果不能完全確定數(shù)據(jù)更新操作的波及范圍,避免Cache的盲目使用。否則,臟數(shù)據(jù)的出現(xiàn)會(huì)給系統(tǒng)的正常運(yùn)行帶來(lái)很大的隱患。
6.總結(jié):
Hibernate與MyBatis都可以是通過(guò)SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session來(lái)開啟執(zhí)行事務(wù)和SQL語(yǔ)句。 而MyBatis的優(yōu)勢(shì)是MyBatis可以進(jìn)行更為細(xì)致的SQL優(yōu)化,可以減少查詢字段,并且容易掌握。 Hibernate的優(yōu)勢(shì)是DAO層開發(fā)比MyBatis簡(jiǎn)單,Mybatis需要維護(hù)SQL和結(jié)果映射。數(shù)據(jù)庫(kù)移植性很好,MyBatis的數(shù)據(jù)庫(kù)移植性不好,不同的數(shù)據(jù)庫(kù)需要寫不同SQL。有更好的二級(jí)緩存機(jī)制,可以使用第三方緩存。MyBatis本身提供的緩存機(jī)制不佳。
|