MyBatis分爲全註解版和xml版;全註解版適合於小項目,直接在方法上加註解,在註解中寫sqlmysql
倉儲
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。
程序員
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。
原文:https://blog.csdn.net/w_q_q_/article/details/79032062
sql