EF(三)---ORM

ORM

ORM簡介

ORM(Object Relational Mapping)對象關係映射,一般指持久化數據和實體對象的映射

在這裏插入圖片描述

數據存儲是絕大多數軟件系統都要接觸到的技術,具有一定規模的軟件產品,爲了方便存儲和管理數據,便引入了數據庫這一工具,但是數據如何從程序寫入數據庫的呢?

爲方便程序員通過代碼將數據寫入數據庫,一般的語言開發的廠商都會爲各種數據庫適配數據庫連接的驅動程序,比如ADO.Net,JDBC等。

但是數據庫連接的驅動程序的職責在於管理連接數據庫,設置連接參數等信息,通常會返回各自封裝好的數據集類型,驅動程序封裝的類型往往是以數據爲核心進行描述的,現代化的軟件設計爲了簡便描述事物的特徵都而以面向對象思想爲核心,兩者之間的轉換還有很多的路要走。

除卻轉換部分,Sql語句的編寫也是一大學問,一般的編程語言都沒有爲sql語句定義類型,這是因爲每種數據庫的sql語句風格都是不一樣的,難以給出一個統一的方案。退而求其次,一般的編程語言都採用字符串形式傳遞sql語句到數據庫驅動程序。拋棄各種各樣的sql語句的學習之外,這種方式有一個很大的弊端,那就是sql語句的拼寫極容易由於手誤而犯錯。

在這種場景下,ORM框架誕生了!

ORM的工作原理

沒有ORM的情況下,主要有兩個槽點:

  1. 驅動返回類型和對象不能良好映射
  2. SQL語句的學習成本及易錯率(多種數據庫語句難以全部掌握)

那麼,且看我們的ORM如何改善這兩個槽點:

在這裏插入圖片描述

  1. 數據驅動返回的數據通常都是以數據爲核心的數據集合,我們需要通過手動將類對象和數據庫返回的列數據進行一一匹配獲取,然後賦值到對象上。在這裏要感謝泛型和反射兩大語法,通過泛型和反射,我們可以獲取到任何實體類的屬性而不是具體到某一種類型,通過遍歷實體類的屬性去數據集合中一一獲取並複製返回。這一操作便將數據集合的數據完美包裝成了以面向對象爲核心的和類相關的對象數據集合。

  2. sql語句的拼寫,我們可以提供一套公共sql語句模板,然後在具體實體對象操作的時候將實體對象的屬性名稱和屬性值當作參數拼接進去,組裝成完整的sql語句(例如java體系中的Mybatis框架)或者依舊採用封裝一套淺顯易懂的Api,Api內部通過對應方法和實體對象的組裝成sql語句(例如.Net體系中EntityFramework框架)

  3. 最重要的兩個問題解決完之後,我們可以在框架中做一些對我們有幫助的其他事情。ORM框架做的最多的便是“緩存”。

    在這裏插入圖片描述

    作爲程序員應該掌握的基礎知識,數據庫操作是要和硬盤打交道的,而程序是在內存中運行的,操作內存的速度要比操作硬盤快數十倍以上,可見一個訪問量較高的大型系統很容易由於數據庫操作過於頻繁而拖慢整體速度,從而影響系統的使用。因此,ORM框架要幫助我們減少數據庫的訪問,加快系統速度。

    ORM框架的緩存系統一般是較爲複雜的,而且每種ORM框架對緩存的實現機制都是不同的。整體的思路卻是一致的,對訪問頻率較高的數據進行緩存,並在對數據編輯的時候要對緩存進行更新,以免出現數據不一致的問題。詳細的緩存實現策略這裏不一一贅述,感興趣可以針對某個ORM框架進行剖析。

ORM的優缺點

優點:

  1. ORM框架降低了學習門檻,一個對sql語句並不熟悉的開發人員也可以很容易通過簡易的ORM框架Api進行數據庫的操作。
  2. 提高了開發效率,ORM使我們減少很多繁瑣重複的工作量,讓我們的注意力集中在實現業務上。
  3. 一定程度上提高了程序的響應速度。

弊端:

  1. 框架會自動生成Sql語句,所有場景的sql語句都是同一套模板,難以自動針對場景對sql語句進行良好的優化,某種場景下很容易生成執行很慢的sql語句。如果讓DBA看到這樣的執行sql,必定引來抓狂崩潰。
  2. ORM框架只是爲了滿足絕大多數的場景而生的,特殊需要優化sql的場景下,我們完全可以直接使用驅動手動執行sql或使用ORM框架內提供的sql語句api進行自定義sql語句。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章