目錄
一、ORM簡介
二、ORM的工作原理
三、ORM的優缺點
四、常見的ORM框架
一、ORM簡介
ORM(Object Relational Mapping)對象關系映射,一般指持久化數據和實體對象的映射
數據存儲是絕大多數軟件系統都要接觸到的技術,具有一定規模的軟件產品,為了方便存儲和管理數據,便引入了數據庫這一工具,但是數據如何從程序寫入數據庫的呢?
為方便程序員通過代碼將數據寫入數據庫,一般的語言開發的廠商都會為各種數據庫適配數據庫連接的驅動程序,比如ADO.Net,JDBC等。
但是數據庫連接的驅動程序的職責在於管理連接數據庫,設置連接參數等信息,通常會返回各自封裝好的數據集類型,驅動程序封裝的類型往往是以數據為核心進行描述的,現代化的軟件設計為了簡便描述事物的特征都而以面向對象思想為核心,兩者之間的轉換還有很多的路要走。
除卻轉換部分,Sql語句的編寫也是一大學問,一般的編程語言都沒有為sql語句定義類型,這是因為每種數據庫的sql語句風格都是不一樣的,難以給出一個統一的方案。退而求其次,一般的編程語言都采用字符串形式傳遞sql語句到數據庫驅動程序。拋棄各種各樣的sql語句的學習之外,這種方式有一個很大的弊端,那就是sql語句的拼寫極容易由於手誤而犯錯。
在這種場景下,ORM框架誕生了!
二、ORM的工作原理
在講解完ORM的前世之后,我們來聊聊ORM框架為我們做了什么。
在第一節我們提過了,沒有ORM的情況下,主要有兩個槽點:
1.驅動返回類型和對象不能良好映射
2.SQL語句的學習成本及易錯率(多種數據庫語句難以全部掌握)
那么,且看我們的ORM如何改善這兩個槽點:
1.數據驅動返回的數據通常都是以數據為核心的數據集合,我們需要通過手動將類對象和數據庫返回的列數據進行一一匹配獲取,然后賦值到對象上。在這里要感謝泛型和反射兩大語法,通過泛型和反射,我們可以獲取到任何實體類的屬性而不是具體到某一種類型,通過遍歷實體類的屬性去數據集合中一一獲取並復制返回。這一操作便將數據集合的數據完美包裝成了以面向對象為核心的和類相關的對象數據集合。
2.sql語句的拼寫,我們可以提供一套公共sql語句模板,然后在具體實體對象操作的時候將實體對象的屬性名稱和屬性值當作參數拼接進去,組裝成完整的sql語句(例如java體系中的Mybatis框架)或者依舊采用封裝一套淺顯易懂的Api,Api內部通過對應方法和實體對象的組裝成sql語句(例如.Net體系中EntityFramework框架)
ORM還為我們做了什么?
最重要的兩個問題解決完之后,我們可以在框架中做一些對我們有幫助的其他事情。ORM框架做的最多的便是“緩存”。
作為程序員應該掌握的基礎知識,數據庫操作是要和硬盤打交道的,而程序是在內存中運行的,操作內存的速度要比操作硬盤快數十倍以上,可見一個訪問量較高的大型系統很容易由於數據庫操作過於頻繁而拖慢整體速度,從而影響系統的使用。因此,ORM框架要幫助我們減少數據庫的訪問,加快系統速度。
ORM框架的緩存系統一般是較為復雜的,而且每種ORM框架對緩存的實現機制都是不同的。整體的思路卻是一致的,對訪問頻率較高的數據進行緩存,並在對數據編輯的時候要對緩存進行更新,以免出現數據不一致的問題。詳細的緩存實現策略這里不一一贅述,感興趣可以針對某個ORM框架進行剖析。
三、ORM的優缺點
通過上面兩節的描述,我們很容易總結出ORM框架的優缺點。我們先來說說優點。
ORM框架降低了學習門檻,一個對sql語句並不熟悉的開發人員也可以很容易通過簡易的ORM框架Api進行數據庫的操作。
提高了開發效率,ORM使我們減少很多繁瑣重復的工作量,讓我們的注意力集中在實現業務上。
一定程度上提高了程序的響應速度。
ORM框架的弊端也很明顯,框架會自動生成Sql語句,所有場景的sql語句都是同一套模板,難以自動針對場景對sql語句進行良好的優化,某種場景下很容易生成執行很慢的sql語句。如果讓DBA看到這樣的執行sql,必定引來抓狂崩潰。
ORM框架只是為了滿足絕大多數的場景而生的,特殊需要優化sql的場景下,我們完全可以直接使用驅動手動執行sql或使用ORM框架內提供的sql語句api進行自定義sql語句。
四、市面常見的ORM框架
.Net體系:
EntityFramework,功能強大,lambda api,有些龐大臃腫,很多功能用不上
Dapper,輕量級,數據庫種類支持豐富,sql寫法靈活,運行速度快
CYQ.Data,自動化,日志,分布式緩存,弱類型,api簡介
Java體系:
MyBatis,映射采用Xml配置sql,多種映射關系靈活配置,sql需要手動編寫到配置,輕量級,半自動
Hibernate,Xml配置sql,支持HQL語句,移植性好,日志,重量級,功能全,全自動
Speedment,lambda api,依賴java8