背景:在中國網安的面試過程當中遇到這個問題,好長時間沒用了,說不出個因此然來。
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:智能機器人,但研發它(學習、熟練度)的成本很高,工做均可以擺脫他了,但僅限於它能作的事。(強大、方便、高效、複雜、繞彎子、全自動)