Spring-data-jpa和mybatis的比較及兩者的優缺點?


1. spring data jpa實現了jpa(java persistence api)功能,即可以實現pojo轉換為關系型數據庫記錄的功能,通俗來講就是可以不寫任何的建表sql語句了。jpa是spring data jpa功能的一個子集。

而mybatis並沒有jpa功能,建表語句還是要自己寫的。

2. spring data jpa是全自動框架,不需要寫任何sql。而mybatis是半自動框架,需要自己寫sql,mybatis-plus為mybatis賦能,使其也可以基本上不需要寫任何模板sql。

3. debug模式下看生成的sql,mybatis下的sql可讀性很好,而spring data jpa下的查詢sql可讀性並不好。

如spring data jpa的findOne(id)方法,執行的sql如下,看起來很奇怪,不是很直接。

4. spring data jpa的insert與update都調用同一個方法save,如果帶有主鍵id(如果啟用了樂觀鎖,那么還有version字段),那么就是更新,否則就是新增,所以addOrUpdate是一個接口,而mybatis中提供insert方法和updateById方法。

由於spring data jpa調用同一個方法,所以其要執行兩條sql,先執行查詢,再執行插入/更新。

另外就是返回值,spring data jpa的返回值是Employee對象,而mybatis的返回值是影響的行數,當然mybatis也可以得到新增后的id,返回新增后的對象

5. spring data jpa的dynamic sql是使用JpaSpecificationExecutor,而mybatis中是使用xml來構造dynamic sql。 

當我執行分頁查詢的時候,spring data jpa實際上是調用了兩個sql語句

通過count獲得總記錄數,即當用到Pageable的時候會執行一條count語句,這可能是很昂貴的操作,因為count操作在innodb中要掃描所有的葉子節點

通過limit來獲得分頁記錄

mybatis獲得總記錄數好像並不是通過執行count語句來獲得的,可能是通過游標cursor的方式來獲得的,通過druid監控,其只執行一條sql語句

6. spring data jpa支持自己來寫sql語句,有兩種方式:

1)@Query或@Modifying配合@Query

2)通過entityManager

但要注意的是:如果自己寫sql語句,那么有些攔截器可能並不能起作用,如@PreUpdate

相對來說,mybatis就比較簡單,直接在mapper xml中寫sql就可以了

 

ORM框架使用中的常見需求

1. 后管系統做查詢的時候,多個條件通過一個接口進行查詢,帶了哪個字段就加一段sql過濾,通過mybatis如何實現?

通過mybatis的dynamic sql是可以實現的,類似getEmpsByCondition,攜帶了哪個字段,查詢條件就帶上這個字段的值

似乎只能通過寫mapper xml來做邏輯判斷

spring data jpa是通過多個Predicate構造Specification創建where條件的,都是通過代碼來控制邏輯的

2自動設置創建時間/更新時間

mybatis 也是使用metaObjectHandler來做?

還是通過攔截器來做?

還是只創建這兩個字段,通過數據庫語句來控制?

spring data jpa中有entityListener,可以不操作數據庫,來實現此功能

3.字段自動加解密?

不知道如何實現自動

在mybatis中,查詢出來之后做混淆處理

在spring data jpa中,使用entityManager查詢出來之后做混淆處理

4. 樂觀鎖功能

mybatis-plus提供了optimistic-lock plugin

spring data jpa也提供了@version注解來做

5. 邏輯刪除

mybatis-plus邏輯刪除是放在DefaultSqlInjector中的

spring data jpa要自己寫sql來實現邏輯刪除


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM