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的靈活性,同時也失去面向物件意義和好處——一句話,不倫不類,那么,面向物件和關系型模型有什么不同,體現在哪里呢?實際上兩者要面對的領域和要解決的問題是根本不同的:面向物件致力于解決計算機邏輯問題,而關系模型致力于解決資料的高效存取問題,我們不妨對比一下面向物件的概念原則和關系型資料庫的不同之處:
- 面向物件考慮的是物件的整個生命周期包括在物件的創建、持久化、狀態的改變和行為等,物件的持久化只是物件的一種狀態,而面向關系型資料庫的概念則更關注資料的高效存盤和讀取;
- 面向物件更強調物件狀態的封裝性,物件封裝自己的狀態(或資料)不允許外部物件隨意修改,只暴露一些合法的行為方法供外部物件呼叫;而關系型資料庫則是開放的,可以供用戶隨意讀取和修改關系,并可以和其他表任意的關聯(只要sql正確允許的情況下);
- 面向物件試圖為動態的世界建模,他要描述的是世界的程序和規律,進而適應發展和變化,面向物件總是在變化中處理各種各樣的變化,而關系型模型為靜態世界建模,它通過資料快照記錄了世界在某一時候的狀態,它是靜態的,
從上面兩者基本概念和思想的對比來看,可以得出結論hibernate和MyBatis兩個框架的側重點完全不同,所以我們就兩個框架選擇上,就需要根據不同的專案需求選擇不同的框架,在框架的使用中,也要考慮考慮框架的優勢和劣勢,揚長避短,發揮出框架的最大效用,才能真正的提高專案研發效率、完成專案的目標,但相反,如果使用Spring Data JPA和hibernate等ORM的框架而沒有以面向物件思想和方法去分析和設計系統,而是抱怨框架不能靈活操作sql查詢資料,那就是想讓狗去幫你拿耗子了,
那么,話題再說回來,使用兩個框架時候的時候,也要注意最佳的步驟和流程,下面我們來分別討論一下,hibernate的一般使用步驟如下:
- 分析、抽象和歸納出系統中的業務概念,并梳理出各個業務概念之間的關系——創建概念模型
- 根據概念模型,進一步細化設計系統中的物件類以及類的依賴關系——創建設計模型
- 將設計好的類映射到資料庫的表和欄位配置好
- hibernate可以根據配置資訊自動生成資料庫表,這個時候也可以集中精力去梳理一下表關系,看看表結構是否合理,并適當調整一下類和表的映射關系,重新生成表結構
完成以上步驟,基本上完成了體統中主要的業務概念類和表結構的設計作業,只是完成表結構設計的出發點事如何持久化系統的物件,同時兼顧資料庫表、欄位、欄位型別、表的關聯關系的合理性和合規性,而不是單純表設計,這兩者思考和關注點還是有很大差別的,另外,需要說明一點,這只是使用hibernate的最通用步驟,實際操作程序中還是需要根據具體專案情況來安排,
而MyBatis對于面向物件的概念強調比較少,更適用于靈活的對資料進行增、刪、改、查,所以在系統分析和設計程序中,要最大的發揮MyBatis的效用的話,一般使用步驟則與hibernate有所區別:
- 綜合整個系統分析出系統需要存盤的資料專案,并畫出E-R關系圖,設計表結構
- 根據上一步設計的表結構,創建資料庫、表
- 撰寫MyBatis的SQL 映射檔案、Pojos以及資料庫操作對應的介面方法
這樣看來MyBatis更適合于面向關系(或面向資料、或面向程序)的系統設計方法,這樣的系統一般稱為“事務腳步”系統(事務腳步(Transaction Script) 出自Martin Fowler 2004年所著的企業應用架構模式(Patterns of Enterprise Application Architecture)),而hibernate(也可以說Spring Data JPA)更適合于構建領域模型類的系統,當然,我們也不能說MyBatis無法構建領域模型驅動的系統,而hibernate無法構建事務腳步系統,只是用MyBatis構建領域模型要做更多、跟臟、更累的作業;而用hibernate構建一個事務腳本系統有些大材小用,資料的查詢反而沒那么靈活,
綜合上面所有描述和對比,我們對這兩個框架的本質區別應該有所了解了,我們了解了這些區別,可以幫助我們選擇更合適的框架,同時,也可以利用不同的框架,讓他們去做更合適事,這也是所謂的物盡其用吧,更不至于我們“為物所役”,
以上文章來源于網路,如果侵權,立即洗掉!
感覺寫的非常好,便拿來了,
樹越是向往高處的光亮,它的根就越要向下,向泥土向黑暗的深處,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500293.html
標籤:Java
上一篇:@RequestParam,@PathVariable兩個注解的區別
下一篇:fastjson 使用方法大全
