MyBatis與Hibernate區別

背景:在中國網安的面試過程當中遇到這個問題,好長時間沒用了,說不出個因此然來。
MyBatis與Hibernate區別程序員

七、Hibernate與MyBatis對比面試

7.1 相同點sql

Hibernate與MyBatis均可以是經過SessionFactoryBuider由XML配置文件生成SessionFactory,而後由SessionFactory 生成Session,最後由Session來開啓執行事務和SQL語句數據庫

其中SessionFactoryBuider,SessionFactory,Session的生命週期都是差很少的。Hibernate和MyBatis都支持JDBC和JTA事務處理。緩存

7.2 不一樣點mybatis

(1)hibernate是全自動,而mybatis是半自動ide

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。因此在使用二級緩存時若是出現髒數據,系統會報出錯誤並提示。

八、總結

(1)二者相同點
Hibernate和Mybatis的二級緩存除了採用系統默認的緩存機制外,均可以經過實現你本身的緩存或爲其餘第三方緩存方案,建立適配器來徹底覆蓋緩存行爲。

(2)二者不一樣點
Hibernate的二級緩存配置在SessionFactory生成的配置文件中進行詳細配置,而後再在具體的表-對象映射中配置是那種緩存。而MyBatis在使用二級緩存時須要特別當心。若是不能徹底肯定數據更新操做的波及範圍,避免Cache的盲目使用。不然,髒數據的出現會給系統的正常運行帶來很大的隱患。

(3)舉個形象的比喻

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

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

相關文章
相關標籤/搜索