由于java视频里以前好多都是SSH。但是在实际工作中没见过用hibernate的,基本都用mybatis。
我有一些疑问:
hibernate碰到什么样的业务会变成致命的弱点,都说hibernate效率低,能否举个例子(例如同一个查询用mybatis查询耗时1秒,用hibernate查询耗时10秒)
可能是有部分人遇到了hibernate的瓶颈,但是这部分人的业务量我觉得,不是大部分使用hibernate的人都能遇到的。一般的小项目,不超过100个用户,这样的项目综合考虑的话更适合用mybatis还是hibernate?主要从开发效率上来说的话。为什么?
PHPz2017-04-18 09:34:16
對比這兩個之間的關係,從開發效率、可維護性、性能三個方面給出考慮。而就其重要性而言,在專案工程開發過程中,開發效率>可維護性>效能。可能對某些業務來說,效能更關鍵,但放眼全局,個人覺得開發效率>可維護性>效能。
首先來說,開發效率。個人感覺如果你是做一些簡單的CMS類似的只有簡單的增刪改查的項目,那麼使用Hibernate更有優勢,不需要掌握太多的Hibernate知識,只需要會一些基本的查詢和一些配置(Hibernate真正要學會,個人感覺知識量比mybatis大很多)。 hiberbate是用java物件拼sql,mybatis是直接寫原生sql。 hibernate提供了很好的映射機制,mybatis也需要自己寫resultmap paramMap這些東西。 Hibernate和MyBatis都有對應的程式碼產生工具。可以產生簡單基本的DAO層方法。針對進階查詢,Mybatis需要手動編寫SQL語句,以及ResultMap。而Hibernate有良好的映射機制,開發者不需要關心SQL的生成與結果映射,可以更專注於業務流程。綜上所述,那麼從開發效率上來講,Hibernate> mybatis。
可維護性:hiberbate是用java物件拼sql,mybatis是直接寫原生sql。直接寫SQL比較容易維護,前者需要透過java物件來看SQL,你得把sql,用System.out.println(sql);把SQL印出來,才可以看到。 Hibernate的查詢會將表中的所有欄位查詢出來,這一點會有效能消耗。 Hibernate也可以自己寫SQL來指定需要查詢的字段,但這樣就破壞了Hibernate開發的簡潔性。而Mybatis的SQL是手動寫的,所以可以依需求指定查詢的欄位。 Hibernate HQL語句的調優需要將SQL印出來,而Hibernate的SQL被很多人嫌棄因為太醜了。 MyBatis的SQL是自己手動寫的所以調整方便。但Hibernate具有自己的日誌統計。 Mybatis本身不帶日誌統計,使用Log4j進行日誌記錄。
效能:兩者都提供了緩存,session機制。小專案兩者差不多吧.大型專案mybatis>hibernate。
黄舟2017-04-18 09:34:16
看大家討論感覺mybaits比較好一樣,但當初一直以為hibernate比較適合大型開發就直接走hibernate了。那時專案比較急,用得像mybatis一樣,後來玩久了,發現很多有趣的東西,hibernate提供的經驗簡化了不少工作量和兼容性,但這些絕對需要有經驗後才明白,加上後來有用上了hibernate search,全文檢索,也就沒法換了,反正寫原生sql也可以hql也可以,xml設定工具也有,輔助註解也靈活,甚至還能產生原生sql不一樣的one2many,many2many資料結構,總之就是太全面的一個大傢伙了,還沒遇到後悔的時候,就繼續學吧。一般是用hibernate tools自動建立所有表格的Java和xml的mapping做一般查刪改,然後複製Java程式碼改名,用註解手動建立關聯,刪除不需要的欄位。
PHP中文网2017-04-18 09:34:16
當Hibernate用錯了的情況下,會出現:P
比如, Hibernate的對象A裡的內嵌對象B加載被你從默認懶加載改為預加載(假設你沒有搞懂影響,就改動了配置), 你要查詢對象A的列表,就會出現N+1查詢, 但你的大部分業務邏輯又不需要讀取內嵌對象B,性能就會很差.
而一般情況下MyBatis, 這種查詢是需要手寫的. 出現這種情況的機率較小.
JPA(Hibernate)的內容涵蓋真的很廣,有很多優化技巧.想玩熟要花的成本不低.(我手頭上那本Hibernate In Action厚度很的讓人望而生畏, 花了好久才看完), 不知道有多少程式設計師是愛看書的且有這個耐心.
但是,MyBatis上手要容易多了. 雖然MyBatis在用錯的情況下.性能會同樣比Hibernate差好多倍.但MyBatis沒那麼複雜啊. 那出錯的幾率就小很多了.
如果你對Hibernate很有研究興趣,且想把他用熟.我建議拿你就試試唄. 畢竟大多數的項目是需要快速出成果的.
Hibernate在這方面比MyBatis簡單多了(當然MyBatis有自動產生程式碼的方法,但相比還是麻煩不少).
如果後續專案發展的不錯, 需要多人協作開發, 請務必讓新手遠離持久層程式碼邏輯.
黄舟2017-04-18 09:34:16
簡單來說,Hibernate 是物件導向的,MyBatis 是面向 SQL 的。選哪個得看你的人員配置對哪個熟悉,業務會不會有很多複雜查詢,對效能要求高不高。另外,很多時候都是對 Hibernate 不熟悉,所以會覺得 Hibernate 做不了這個事情,或是做起來很複雜。 Hibernate 表示這鍋我不背。 。 。
巴扎黑2017-04-18 09:34:16
技術沒有好壞,只有適不適合,在特定的情況下解決特定的問題。不同的人用hibernate,會產生不同的結果,如果你精通hibernate,性能一樣不是問題。看到樓上說了那麼多二者的比較,其實真的沒有意義。