在持久層框架中無可厚非的就是mybatis了,但是也會經常被人問到為啥要用mybatis,為啥不用hibernate,jpa。很多人各級都是地鐵爺爺看手機的表情,似乎從來沒想過這個問題。“公司叫用我就用了唄”
如果期望有好的發展我覺得我們應該學會知其然&知其所以然,這樣才會有自己想要的進步,今天就來具體講講他們之間的區別以及為什麼現在mybatis都在用卻摒棄了以前那麼牛*的Hibernate。希望可以幫助到思進取的你。
SpringJPA、Hibernate、 Mybatis簡述
Hibernate:Hibernate是一個開放原始碼的物件關係對映框架,它對JDBC進行了非常輕量級的物件封裝,它將POJO與資料庫表建立對映關係,是一個全自動的ORM框架,Hibernate可以自動生成SQL語句,自動執行,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。
Spring Data JPA:Spring Data JPA是Spring Data的子模組,預設由Hibernate實現。Spring Data是一個用於簡化資料庫訪問,並支援雲服務的開源框架。
Mybatis:MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。Mybatis:著力於POJO與SQL之間的對映關係。
由上面的簡述就可以看到SpringJPA、Hibernate、 Mybatis三者對比其實就是Hibernate與Mybatis之間的對比(Spring Data JPA預設由Hibernate實現)
Hibernate與 Mybatis的比較
使用方式上的比較
Hibernate是一個自動化更強的永續性框架,省去了絕大多數的SQL的編寫。Hibernate物件導向與物件之間的模型,因為封裝了完整的物件關係對映機制所以內部十分複雜,學習週期也比較長。而Mybatis將sql的入參和查詢結果對映成POJOs,面向於ResultMap的對映,需要寫的SQL語句跟多。
總結:封裝程度越高東西越不靈活,大家應該都有過體驗吧。Hibernate使用起來簡單,但是很不靈活,很多複雜場景的運用很雞肋。不如Mybatis的隨心DIY舒心。
開發難度的比較
上面有說過,因為Hibernate封裝了完整的物件關係,因此學習難度大於Mybatis,使用Mybatis的時候專注於SQL的編寫以及對映關係就OK了。
查詢的比較
簡單查詢
Hibernate 提供了基礎的查詢方法
Mybatis需要手動編寫SQL語句
高階查詢
Hibernate通過物件對映機制,開發者無需關心SQL的生成與結果對映,專注業務流程;
Mybatis需要通過手動在XML檔案中編寫SQL語句以及ResultMap或者註解。
也就是說Hibernate用起來簡單,但是DIY能力遠差於Mybatis。
快取機制的比較
相同點
Hibernate和Mybatis的二級快取除了採用系統預設的快取機制外,都可以通過實現你自己的快取或為其他第三方快取方案,建立介面卡來完全覆蓋快取行為。
不同點
Hibernate的二級快取配置在SessionFactory生成的配置檔案中進行詳細配置,然後再在具體的表-物件對映中配置是那種快取。
MyBatis的二級快取配置都是在每個具體的表-物件對映中進行詳細配置,這樣針對不同的表可以自定義不同的快取機制。並且Mybatis可以在名稱空間中共享相同的快取配置和例項,通過Cache-ref來實現。
資料庫的移植性比較
Hibernate 對資料庫提供了較為完整的封裝,封裝了基本的DAO層操作,有較好的資料庫移植性
Mybatis 可以進行更細緻的SQL優化,查詢必要的欄位,但是需要維護SQL和查詢結果集的對映,而且資料庫的移植性較差,針對不同的資料庫編寫不同的SQL
總結
拋開業務場景,只針對使用上來看的話,Hibernate 比Mybatis更加方便。但是寫程式永遠脫離不了業務,面對日益複雜話的業務場景,Mybatis的靈活性尤為重要。
ORM框架的使用需要根據具體的專案業務選擇更適合的技術方案,而不能一味地為了技術而技術。但是在大資料時代為了應對複雜的場景Mybatis首當其衝的成為首選的持久化框架。
親~全部手寫,個別錯誤字眼請忽略