【MyBatis】4:MyBatis與Hibernate的對比分析

連江偉發表於2016-07-31

        在MyBatis系列文章的第一篇, 提到了JDBC程式設計在實際開發中存在的諸多問題,後來介紹了MyBatis之後也沒有分析,MyBatis是如何解決JDBC存在的問題的。在這篇部落格開頭我們先來一起看看,MyBatis是如何解決JDBC程式設計的問題的。當然,所有的ORM框架都是類似的,都是對JDBC的封裝和優化。

        1、  資料庫連結建立、釋放頻繁造成系統資源浪費從而影響系統效能,如果使用資料庫連結池可解決此問題。

        解決:在SqlMapConfig.xml中配置資料連結池,使用連線池管理資料庫連結。

        2、  Sql語句寫在程式碼中造成程式碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java程式碼。

        解決:將Sql語句配置在XXXXmapper.xml檔案中與java程式碼分離。

        3、  向sql語句傳引數麻煩,因為sql語句的where條件不一定,可能多也可能少,佔位符需要和引數一一對應。

        解決:Mybatis自動將java物件對映至sql語句,通過statement中的parameterType定義輸入引數的型別。

        4、  對結果集解析麻煩,sql變化導致解析程式碼變化,且解析前需要遍歷

        解決:Mybatis自動將sql執行結果對映至java物件,通過statement中的resultType定義輸出結果的型別。

        很多人都喜歡將MyBatis和Hibernate這兩個框架放在一起進行比較,可能這兩個都是比較主流的持久層框架,又或許是在實際的專案開發中用的比較多,問題也比較多,因此就有了選擇的需要。

        1 從ORM的定義上來講,MyBatis和Hibernate不同,它不是一個完全意義上的的ORM框架,如果說Hibernate是自動化的ORM,那麼MyBatis就是一個半自動化的框架,因為MyBatis需要程式設計師自己去編寫sql語句,正因為如此,MyBatis引入了XML配置檔案或者註解的方式來管理和配置要執行的sql語句,並且將java物件和sql語句對映成最終執行的sql,最後將sql的執行結果再對映成java物件,這樣一來,靈活性極大地提高。

        2 在學習代價方面,MyBatis顯然是要更簡單,更加容易上手得多。程式設計師只要瞭解使用MyBatis框架開發的流程,並且會熟練編寫sql語句,那麼就可以快速的開發系統的業務程式碼。反觀Hibernate,學習門檻之高,相信很多學習過Hibernate的小夥伴都深有體會,要想精通Hibernate並且能夠對Hibernate進行一些靈活的處理和優化,將是難上加難,而且如何設計O/R對映,在效能和物件模型之間如何權衡,以及怎樣用好Hibernate需要很強的經驗和能力才可。

        3 從開發效率來講,MyBatis的開發效率要低於Hibernate,針對高階查詢,大量的對映檔案編寫工作,讓人很是抓狂。相反,Hibernate封裝的非常好,不用程式設計師自己去寫sql語句,只要像操作物件一下去運算元據庫的資料,開發者無須關心sql的生成和結果對映,真正做到了ORM的關係和物件的對映,更加具有物件導向的味道。

        4 關於調優方案,MyBatis可以進行詳細的sql優化設計,可以使用二級快取機制,以及合理的session管理機制。但其最重要的優化點事sql優化,因為MyBatis的sql是手動編寫的,所以我們可以按照我們想要的效果進行重新設計。而Hibernate HQL語句調優需要我們將sql語句列印出來,去分析進行去調整HQL語句,達到優化的目的。另外,Hibernate的調優也可以使用合理的快取策略,儘量使用延遲載入特性,使用批量抓取以及進行合理的O/R對映的設計等方面進行。

       5 從擴充套件性上來說,顯然是Hibernate更勝一籌,Hibernate與具體資料庫的關聯只需在xml檔案中進行配置即可,所有的HQL語句與具體使用的資料庫沒有關係,因此移植性很好。而MyBatis的專案中所有的sql語句都是依賴所使用的資料庫的,因此不同的資料庫需要編寫不同的對映檔案,移植性不好。

        6 從效能上來說,Hibernate在JDBC上進行了一次封裝,而MyBatis是基於原生的JDBC的,因此從最初的框架設計上,MyBatis天生就具有執行速度上的優勢。另外在進行關聯查詢時,Hibernate為了保證POJO的資料完整性,需要將關聯的資料全部載入,需要額外的查詢更多的資料,而MyBatis載入的欄位很乾淨,沒有太多的冗餘的欄位,直接對映入關聯中,從這點上來講,MyBatis也是優於Hibernate的。

        7關於Hibernate和MyBatis的對比分析,說了不少了,其實使用哪個要看具體的使用場景,對於管理平臺,需要展現的資訊量較大,併發要求不高時,使用Hibernate比較好,而對於一些小的網際網路網站,業務需求變動比較頻繁,併發量也比較高,則適合使用MyBatis。

        總之,按照使用者的需求在有限的資源環境下只要能做出維護性、擴充套件性良好的軟體架構都是好架構,所以框架只有適合才是最好。

相關文章