現在Dao持久層的解決方案中,大部分是采用Spring Data JPA或MyBatis解決方案,並且傳統企業多用前者,互聯網企業多用后者。
Spring Data JPA 是Spring Data 在JPA(Java持久層規范)和ORM(對象關系映射)框架之間抽象封裝層,它不直接代替ORM框架,默認低層使用的ORM框架是Hibernate,但使用它可以靈活的在各種ORM框架之間切換,並且減少ORM框架接入部分重復代碼,進而簡化代碼。
MyBatis是一個持久層框架的,但它設計初衷與Hibernate等全自動、符合JPA規范的ORM框架不同,重點關注關系到對象的(R——》O),而后者不僅是關系到對象的映射,還有對象到關系的映射(O——》R),設計上希望通過面向對象的方式寫SQL,可以更好的屏蔽不同數據庫之間的差異,抽象程度更高。而前者MyBatis需要自己手動寫SQL,更靈活,但受限於開發編寫SQL代碼水平,可能會出現不兼容不同數據庫SQL的情況。
網上也有觀點認為ORM是一種反模式,認為從關系數據庫到面向對象不完全是一一對應的,強行的要ORM反而會讓一些設計變得很奇怪。
總的來說,Spring Data JPA和MyBatis都是很不錯且被廣泛使用的持久層解決方案,具體用那個可以看團隊成員對技術棧熟悉程度以及項目是否對數據持久層方面有特殊需求。相對來說Spring Data JPA/Hibernate用好的話會簡單些,不過復雜查詢及結果集的返回沒有直接用MyBatis靈活方便,可參考如下解決方案:
作者:beamofsoul
鏈接:https://www.zhihu.com/question/53706909/answer/200878397
使用Spring Data JPA + QueryDSL + Hibernate。 基本的增刪改查和調用存儲過程通過Spring Data JPA Repository來解決 稍微復雜的查詢或是批量操作使用QueryDSL或Spring Data Specification的API來解決 特別特別復雜的查詢操作可以使用Spring Data JPA Repository的注解定義native sql來解決 所有持久層底層操作都由Hibernate來支持,且為了保證效率和性能,不需要的包/特性就不需要引入,基本上使用core包就能夠解決問題,當然如果有需要可以加上orm 全過程脫離任何格式(.java除外)的配置文件,都使用Java Config的方式進行配置,除了需要抽象出一套自己架構的持久層的API以外,只需要提供一個獨立的空內容.java配置文件(如果不需要多數據源配置的話),在類上面配置RepositoryFactoryBean和Repository接口包路徑
全使用過程中,除了native sql處以外,全部持久層操作都是類型安全的,特別是使用QueryDSL或Specification后... 從此,mybatis根本就沒有存在的必要...