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來實現邏輯刪除