1突诬、開發(fā)對比開發(fā)速度
hibernate的真正掌握要比Mybatis來得難些苫拍。Mybatis框架相對簡單很容易上手芜繁,但也相對簡陋些。個人覺得要用好Mybatis還是首先要先理解好Hibernate绒极。
開發(fā)社區(qū)
Hibernate 與Mybatis都是流行的持久層開發(fā)框架骏令,但Hibernate開發(fā)社區(qū)相對多熱鬧些,支持的工具也多垄提,更新也快榔袋,當(dāng)前最高版本4.1.8。而Mybatis相對平靜铡俐,工具較少凰兑,當(dāng)前最高版本3.2。
開發(fā)工作量
Hibernate和MyBatis都有相應(yīng)的代碼生成工具审丘±艄唬可以生成簡單基本的DAO層方法。
針對高級查詢滩报,Mybatis需要手動編寫SQL語句锅知,以及ResultMap。而Hibernate有良好的映射機制脓钾,開發(fā)者無需關(guān)心SQL的生成與結(jié)果映射售睹,可以更專注于業(yè)務(wù)流程。
2惭笑、系統(tǒng)調(diào)優(yōu)對比Hibernate的調(diào)優(yōu)方案
制定合理的緩存策略侣姆;
盡量使用延遲加載特性;
采用合理的Session管理機制沉噩;
使用批量抓取捺宗,設(shè)定合理的批處理參數(shù)(batch_size);
進行合理的O/R映射設(shè)計
Mybatis調(diào)優(yōu)方案
MyBatis在Session方面和Hibernate的Session生命周期是一致的,同樣需要合理的Session管理機制川蒙。MyBatis同樣具有二級緩存機制蚜厉。 MyBatis可以進行詳細的SQL優(yōu)化設(shè)計。
SQL優(yōu)化方面
Hibernate的查詢會將表中的所有字段查詢出來畜眨,這一點會有性能消耗昼牛。Hibernate也可以自己寫SQL來指定需要查詢的字段,但這樣就破壞了Hibernate開發(fā)的簡潔性康聂。而Mybatis的SQL是手動編寫的贰健,所以可以按需求指定查詢的字段。
Hibernate HQL語句的調(diào)優(yōu)需要將SQL打印出來恬汁,而Hibernate的SQL被很多人嫌棄因為太丑了伶椿。MyBatis的SQL是自己手動寫的所以調(diào)整方便。但Hibernate具有自己的日志統(tǒng)計。Mybatis本身不帶日志統(tǒng)計脊另,使用Log4j進行日志記錄导狡。
擴展性方面
Hibernate與具體數(shù)據(jù)庫的關(guān)聯(lián)只需在XML文件中配置即可,所有的HQL語句與具體使用的數(shù)據(jù)庫無關(guān)偎痛,移植性很好旱捧。MyBatis項目中所有的SQL語句都是依賴所用的數(shù)據(jù)庫的,所以不同數(shù)據(jù)庫類型的支持不好踩麦。
3枚赡、對象管理與抓取策略對象管理
Hibernate 是完整的對象/關(guān)系映射解決方案,它提供了對象狀態(tài)管理(state management)的功能靖榕,使開發(fā)者不再需要理會底層數(shù)據(jù)庫系統(tǒng)的細節(jié)标锄。也就是說,相對于常見的 JDBC/SQL 持久層方案中需要管理 SQL 語句茁计,Hibernate采用了更自然的面向?qū)ο蟮囊暯莵沓志没?a target="_blank" rel="nofollow">Java應(yīng)用中的數(shù)據(jù)。
換句話說谓松,使用 Hibernate 的開發(fā)者應(yīng)該總是關(guān)注對象的狀態(tài)(state)星压,不必考慮 SQL 語句的執(zhí)行。這部分細節(jié)已經(jīng)由 Hibernate 掌管妥當(dāng)鬼譬,只有開發(fā)者在進行系統(tǒng)性能調(diào)優(yōu)的時候才需要進行了解娜膘。
而MyBatis在這一塊沒有文檔說明,用戶需要對對象自己進行詳細的管理优质。
抓取策略
Hibernate對實體關(guān)聯(lián)對象的抓取有著良好的機制竣贪。對于每一個關(guān)聯(lián)關(guān)系都可以詳細地設(shè)置是否延遲加載,并且提供關(guān)聯(lián)抓取巩螃、查詢抓取演怎、子查詢抓取、批量抓取四種模式避乏。 它是詳細配置和處理的爷耀。
而Mybatis的延遲加載是全局配置的。
4拍皮、緩存機制對比Hibernate緩存
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的生命周期存在和消亡浸策。
5、優(yōu)勢對比
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本身提供的緩存機制不佳晰奖。
更多詳細源碼參考來源:http://minglisoft.cn/technology歡迎大家一起學(xué)習(xí)研究相關(guān)技術(shù),源碼獲取請加求求:2042849237