搜尋

首頁  >  問答  >  主體

java - 关于mybatis和hibernate的困惑

谢谢

巴扎黑巴扎黑2804 天前1630

全部回覆(19)我來回復

  • 巴扎黑

    巴扎黑2017-04-18 09:34:16

    知乎上也有類似的問題。
    看到高票的回答大致是說,hibernatemybatis掌握難度高一些,對sql的控制弱一些。

    回覆
    0
  • 黄舟

    黄舟2017-04-18 09:34:16

    mb sql寫到xml裡面不也需要解析麼,效率也高不到哪裡去吧

    回覆
    0
  • PHPz

    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。

    回覆
    0
  • 黄舟

    黄舟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程式碼改名,用註解手動建立關聯,刪除不需要的欄位。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 09:34:16

    1. 問題1:什麼樣的情況下,Hibernate 會慢MyBatis10倍?

    當Hibernate用錯了的情況下,會出現:P
    比如, Hibernate的對象A裡的內嵌對象B加載被你從默認懶加載改為預加載(假設你沒有搞懂影響,就改動了配置), 你要查詢對象A的列表,就會出現N+1查詢, 但你的大部分業務邏輯又不需要讀取內嵌對象B,性能就會很差.
    而一般情況下MyBatis, 這種查詢是需要手寫的. 出現這種情況的機率較小.

    JPA(Hibernate)的內容涵蓋真的很廣,有很多優化技巧.想玩熟要花的成本不低.(我手頭上那本Hibernate In Action厚度很的讓人望而生畏, 花了好久才看完), 不知道有多少程式設計師是愛看書的且有這個耐心.

    但是,MyBatis上手要容易多了. 雖然MyBatis在用錯的情況下.性能會同樣比Hibernate差好多倍.但MyBatis沒那麼複雜啊. 那出錯的幾率就小很多了.

    2. 問題2:小專案用MyBatis還是Hibernate?

    如果你對Hibernate很有研究興趣,且想把他用熟.我建議拿你就試試唄. 畢竟大多數的項目是需要快速出成果的.
    Hibernate在這方面比MyBatis簡單多了(當然MyBatis有自動產生程式碼的方法,但相比還是麻煩不少).
    如果後續專案發展的不錯, 需要多人協作開發, 請務必讓新手遠離持久層程式碼邏輯.

    回覆
    0
  • 黄舟

    黄舟2017-04-18 09:34:16

    簡單來說,Hibernate 是物件導向的,MyBatis 是面向 SQL 的。選哪個得看你的人員配置對哪個熟悉,業務會不會有很多複雜查詢,對效能要求高不高。另外,很多時候都是對 Hibernate 不熟悉,所以會覺得 Hibernate 做不了這個事情,或是做起來很複雜。 Hibernate 表示這鍋我不背。 。 。

    回覆
    0
  • 迷茫

    迷茫2017-04-18 09:34:16

    個人還覺得hibernate 好用呢,自動建表,效能問題是關聯查詢。

    回覆
    0
  • PHPz

    PHPz2017-04-18 09:34:16

    現在開發一邊採用邏輯外鍵,不進行表關聯,開發效率都差不多,mybatis簡單,清晰,sql更具通用性,協作稍微方便點.

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:34:16

    技術沒有好壞,只有適不適合,在特定的情況下解決特定的問題。不同的人用hibernate,會產生不同的結果,如果你精通hibernate,性能一樣不是問題。看到樓上說了那麼多二者的比較,其實真的沒有意義。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 09:34:16

    總的來說hibernate不夠靈活,封裝的太深了。 mybatis可以隨心所欲的設定想要的操作

    回覆
    0
  • 取消回覆