目錄java
1、ORM簡介
2、ORM的工做原理
3、ORM的優缺點
4、常見的ORM框架程序員
ORM(Object Relational Mapping)對象關係映射,通常指持久化數據和實體對象的映射sql
數據存儲是絕大多數軟件系統都要接觸到的技術,具備必定規模的軟件產品,爲了方便存儲和管理數據,便引入了數據庫這一工具,可是數據如何從程序寫入數據庫的呢?數據庫
爲方便程序員經過代碼將數據寫入數據庫,通常的語言開發的廠商都會爲各類數據庫適配數據庫鏈接的驅動程序,好比ADO.Net,JDBC等。編程
可是數據庫鏈接的驅動程序的職責在於管理鏈接數據庫,設置鏈接參數等信息,一般會返回各自封裝好的數據集類型,驅動程序封裝的類型每每是以數據爲核心進行描述的,現代化的軟件設計爲了簡便描述事物的特徵都而以面向對象思想爲核心,二者之間的轉換還有不少的路要走。api
除卻轉換部分,Sql語句的編寫也是一大學問,通常的編程語言都沒有爲sql語句定義類型,這是由於每種數據庫的sql語句風格都是不同的,難以給出一個統一的方案。退而求其次,通常的編程語言都採用字符串形式傳遞sql語句到數據庫驅動程序。拋棄各類各樣的sql語句的學習以外,這種方式有一個很大的弊端,那就是sql語句的拼寫極容易因爲手誤而犯錯。緩存
在這種場景下,ORM框架誕生了!app
在講解完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框架下降了學習門檻,一個對sql語句並不熟悉的開發人員也能夠很容易經過簡易的ORM框架Api進行數據庫的操做。
提升了開發效率,ORM使咱們減小不少繁瑣重複的工做量,讓咱們的注意力集中在實現業務上。
必定程度上提升了程序的響應速度。
ORM框架的弊端也很明顯,框架會自動生成Sql語句,全部場景的sql語句都是同一套模板,難以自動針對場景對sql語句進行良好的優化,某種場景下很容易生成執行很慢的sql語句。若是讓DBA看到這樣的執行sql,一定引來抓狂崩潰。
ORM框架只是爲了知足絕大多數的場景而生的,特殊須要優化sql的場景下,咱們徹底能夠直接使用驅動手動執行sql或使用ORM框架內提供的sql語句api進行自定義sql語句。
EntityFramework,功能強大,lambda api,有些龐大臃腫,不少功能用不上
Dapper,輕量級,數據庫種類支持豐富,sql寫法靈活,運行速度快
CYQ.Data,自動化,日誌,分佈式緩存,弱類型,api簡介
MyBatis,映射採用Xml配置sql,多種映射關係靈活配置,sql須要手動編寫到配置,輕量級,半自動
Hibernate,Xml配置sql,支持HQL語句,移植性好,日誌,重量級,功能全,全自動
Speedment,lambda api,依賴java8