Spring Data JPA是Spring Data的子模組。使用Spring Data,使得基於「repositories」概念的JPA實現更簡單和容易。Spring Data JPA的目標是大大簡化資料存取層程式碼的編碼。作為使用者,我們只需要編寫自己的repository介面,介面中包含一些個性化的查詢方法,Spring Data JPA將自動實現查詢方法。
JPA預設使用hibernate作為ORM實現,所以,一般使用Spring Data JPA即會使用hibernate。我們再看看hibernate的官方概念,Hibernate是一個開放原始碼的物件關係對映框架,它對JDBC進行了非常輕量級的物件封裝,它將POJO與資料庫表建立對映關係,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。
MyBatis 是一款優秀的持久層框架,它支援客製化化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來設定和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。
這樣看,Spring Data JPA與MyBatis對比,起始也就是hibernate與MyBatis對比。所以,我們直接來比較後兩者。
從基本概念和框架目標上看,兩個框架差別還是很大的。hibernate是一個自動化更強、更高階的框架,畢竟在java程式碼層面上,省去了絕大部分sql編寫,取而代之的是用物件導向的方式操作關係型資料庫的資料。而MyBatis則是一個能夠靈活編寫sql語句,並將sql的入參和查詢結果對映成POJOs的一個持久層框架。所以,從表面上看,hibernate能方便、自動化更強,而MyBatis 在Sql語句編寫方面則更靈活自由。
但這只是從使用層面上看兩者的區別,並未涉及的本質。但如果看問題,值看淺層次、表象問題的話,就不能理解技術本質,也不能發揮技術的最多效用。所以,如果更上一個抽象層次去看,對於資料的操作,hibernate是物件導向的,而MyBatis是面向關係的。當然,用hibernate也可以寫出面向關係程式碼和系統,但卻得不到面向關係的各種好處,最大的便是編寫sql的靈活性,同時也失去物件導向意義和好處——一句話,不倫不類。那麼,物件導向和關係型模型有什麼不同,體現在哪裡呢?實際上兩者要面對的領域和要解決的問題是根本不同的:物件導向致力於解決計算機邏輯問題,而關係模型致力於解決資料的高效存取問題。我們不妨對比一下物件導向的概念原則和關係型資料庫的不同之處:
從上面兩者基本概念和思想的對比來看,可以得出結論hibernate和MyBatis兩個框架的側重點完全不同。所以我們就兩個框架選擇上,就需要根據不同的專案需求選擇不同的框架。在框架的使用中,也要考慮考慮框架的優勢和劣勢,揚長避短,發揮出框架的最大效用,才能真正的提高專案研發效率、完成專案的目標。但相反,如果使用Spring Data JPA和hibernate等ORM的框架而沒有以物件導向思想和方法去分析和設計系統,而是抱怨框架不能靈活操作sql查詢資料,那就是想讓狗去幫你拿耗子了。
那麼,話題再說回來,使用兩個框架時候的時候,也要注意最佳的步驟和流程。下面我們來分別討論一下,hibernate的一般使用步驟如下:
完成以上步驟,基本上完成了體統中主要的業務概念類和表結構的設計工作,只是完成表結構設計的出發點事如何持久化系統的物件,同時兼顧資料庫表、欄位、欄位型別、表的關聯關係的合理性和合規性,而不是單純表設計。這兩者思考和關注點還是有很大差別的。另外,需要說明一點,這只是使用hibernate的最通用步驟,實際操作過程中還是需要根據具體專案情況來安排。
而MyBatis對於物件導向的概念強調比較少,更適用於靈活的對資料進行增、刪、改、查,所以在系統分析和設計過程中,要最大的發揮MyBatis的效用的話,一般使用步驟則與hibernate有所區別:
這樣看來MyBatis更適合於面向關係(或面向資料、或程式導向)的系統設計方法,這樣的系統一般稱為「事務腳步」系統(事務腳步(Transaction Script) 出自Martin Fowler 2004年所著的企業應用架構模式(Patterns of Enterprise Application Architecture))。而hibernate(也可以說Spring Data JPA)更適合於構建領域模型類的系統。當然,我們也不能說MyBatis無法構建領域模型驅動的系統,而hibernate無法構建事務腳步系統。只是用MyBatis構建領域模型要做更多、跟髒、更累的工作;而用hibernate構建一個事務指令碼系統有些大材小用,資料的查詢反而沒那麼靈活。
綜合上面所有描述和對比,我們對這兩個框架的本質區別應該有所瞭解了。我們瞭解了這些區別,可以幫助我們選擇更合適的框架,同時,也可以利用不同的框架,讓他們去做更合適事,這也是所謂的物盡其用吧,更不至於我們「為物所役」。
以上文章來源於網路,如果侵權,立即刪除!
感覺寫的非常好,便拿來了。