兩種框架自己都用過一段時間,現在想總結一下各自適用的場景,部分比較取自群友分享
框架簡介
Spring Data JPA是Spring Data的子模塊。使用Spring Data,使得基於“repositories”概念的JPA實現更簡單和容易。Spring Data JPA的目標是大大簡化數據訪問層代碼的編碼。作為使用者,我們只需要編寫自己的repository接口,接口中包含一些個性化的查詢方法,Spring Data JPA將自動實現查詢方法。
JPA默認使用hibernate作為ORM實現,所以,一般使用Spring Data JPA即會使用hibernate。我們再看看hibernate的官方概念,Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關系,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。
MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
比較
維度一:hibernate是面向對象的,而MyBatis是面向關系的
1.面向對象考慮的是對象的整個生命周期包括在對象的創建、持久化、狀態的改變和行為等,對象的持久化只是對象的一種狀態,而面向關系型數據庫的概念則更關注數據的高效存儲和讀取;
2.面向對象更強調對象狀態的封裝性,對象封裝自己的狀態(或數據)不允許外部對象隨意修改,只暴露一些合法的行為方法供外部對象調用;而關系型數據庫則是開放的,可以供用戶隨意讀取和修改關系,並可以和其他表任意的關聯(只要sql正確允許的情況下);
3.面向對象試圖為動態的世界建模,他要描述的是世界的過程和規律,進而適應發展和變化,面向對象總是在變化中處理各種各樣的變化。而關系型模型為靜態世界建模,它通過數據快照記錄了世界在某一時候的狀態,它是靜態的。
維度二:從項目功能類型比較(這個真心需要JPA的高手哦,請定位清晰再參考)
數據分析型的OLAP應用適合用MyBatis,事務處理型OLTP應用適合用JPA。
越是復雜的業務,越需要領域建模,建模用JPA實現最方便靈活。但是JPA想用好,門檻比較高,不懂DDD的話,就會淪為增刪改查了。
復雜的查詢應該是通過CQRS模式,通過異步隊列建立合適查詢的視圖,通過視圖避免復雜的Join,而不是直接查詢領域模型。
從目前的趨勢來看OLAP交給NoSQL數據庫可能更合適
維度三:項目維護迭代維度比較(長期快速迭代類、變動較小的類型)
追求快速迭代,需求快速變更,靈活的 mybatis 修改起來更加方便,而且一般每一次的改動不會帶來性能上的下降。JPA經常因為添加關聯關系或者開發者不了解優化導致項目越來越糟糕(這里可能要考研功力了)。
個人總結(請參考上面一些維度,或者還有許多其它維度,總結自己的理解)
1.表關聯較多的項目,優先使用mybatis
2.持續維護開發迭代較快的項目建議使用mybatis,因為一般這種項目需要變化很靈活,對sql的靈活修改要求較高
3.對於傳統項目或者關系模型較為清晰穩定的項目,建議JPA(比如DDD設計中的領域層)
4.目前微服務比較火,基於其職責的獨立性,如果模型清晰,可以考慮使用JPA,但如果數據量較大全字段返回數據量大的話可能在性能有影響,需要根據實際情況進行分析