參考博客:
https://www.cnblogs.com/llywy/p/10103136.html
https://www.jianshu.com/p/32ce87c163d6
MyBatis分為全注解版和xml版;全注解版適合於小項目,直接在方法上加注解,在注解中寫sql
倉儲
Repository 模式是領域驅動設計中另一個經典的模式。在早期,我們常常將數據訪問層命名為:DAO,而在 SpringData JPA 中,其稱之為 Repository(倉儲),這也不是巧合,而是設計者有意為之。
熟悉 SpringData JPA 的朋友都知道當一個接口繼承 JpaRepository 接口之后便自動具備了 一系列常用的數據操作方法,findAll, findOne ,save等。
那么倉儲和DAO到底有什么區別呢?這就要提到一些遺留問題,以及一些軟件設計方面的因素。在這次SpringForAll 的議題中我能夠預想到有很多會強調 SpringData JPA 具有方便可擴展的 API,像下面這樣
public interface OrderRepository extends JpaRepository<Order, String>{
findByOrderNoAndXxxx(String orderNo,Xxx xx);
@Transactional
@Modifying(clearAutomatically = true)
@Query("update t_order set order_status =?1 where id=?2")
int updateOrderStatusById(String orderStatus, String id);
}
但我要強調的是,這是 SpringData JPA 的妥協,其支持這一特性,並不代表其建議使用。因為這並不符合領域驅動設計的理念。注意對比,SpringData JPA 的設計理念是將 Repository 作為數據倉庫,而不是一系列數據庫腳本的集合,findByOrderNoAndXxxx 方法可以由下面一節要提到的JpaSpecificationExecutor代替,而 updateOrderStatusById 方法則可以由 findOne + save 代替,不要覺得這變得復雜了,試想一下真正的業務場景,修改操作一般不會只涉及一個字段的修改, findOne + save 可以幫助你完成更加復雜業務操作,而不必關心我們該如何編寫 SQL 語句,真正做到了面向領域開發,而不是面向數據庫 SQL 開發,面向對象的擁躉者也必然會覺得,這更加的 OO。
Mybatis優勢
- MyBatis可以進行更為細致的SQL優化,可以減少查詢字段。
- MyBatis容易掌握,而Hibernate門檻較高。
Hibernate優勢
- Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果映射。
- Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。
- Hibernate數據庫移植性很好,MyBatis的數據庫移植性不好,不同的數據庫需要寫不同SQL。
- Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳
1. hibernate是全自動,而mybatis是半自動
hibernate完全可以通過對象關系模型實現對數據庫的操作,擁有完整的JavaBean對象與數據庫的映射結構來自動生成sql。而mybatis僅有基本的字段映射,對象數據以及對象實際關系仍然需要通過手寫sql來實現和管理。
2. hibernate數據庫移植性遠大於mybatis
hibernate通過它強大的映射結構和hql語言,大大降低了對象與數據庫(oracle、mysql等)的耦合性,而mybatis由於需要手寫sql,因此與數據庫的耦合性直接取決於程序員寫sql的方法,如果sql不具通用性而用了很多某數據庫特性的sql語句的話,移植性也會隨之降低很多,成本很高。
3. hibernate擁有完整的日志系統,mybatis則欠缺一些
hibernate日志系統非常健全,涉及廣泛,包括:sql記錄、關系異常、優化警告、緩存提示、臟數據警告等;而mybatis則除了基本記錄功能外,功能薄弱很多。
4. mybatis相比hibernate需要關心很多細節
hibernate配置要比mybatis復雜的多,學習成本也比mybatis高。但也正因為mybatis使用簡單,才導致它要比hibernate關心很多技術細節。mybatis由於不用考慮很多細節,開發模式上與傳統jdbc區別很小,因此很容易上手並開發項目,但忽略細節會導致項目前期bug較多,因而開發出相對穩定的軟件很慢,而開發出軟件卻很快。hibernate則正好與之相反。但是如果使用hibernate很熟練的話,實際上開發效率絲毫不差於甚至超越mybatis。
5. sql直接優化上,mybatis要比hibernate方便很多
由於mybatis的sql都是寫在xml里,因此優化sql比hibernate方便很多。而hibernate的sql很多都是自動生成的,無法直接維護sql;雖有hql,但功能還是不及sql強大,見到報表等變態需求時,hql也歇菜,也就是說hql是有局限的;hibernate雖然也支持原生sql,但開發模式上卻與orm不同,需要轉換思維,因此使用上不是非常方便。總之寫sql的靈活度上hibernate不及mybatis。
心得:
在業務邏輯多是多表關聯的情況下,mybatis絕對比jpa要更加適合。無論是以后的維護還是業務的變更都方便不少。