對(duì)象關(guān)系映射(Object Relation Mapping,簡(jiǎn)稱ORM,或O/RM,或O/R mapping),用于在關(guān)系型數(shù)據(jù)庫和業(yè)務(wù)實(shí)體對(duì)象之間作一個(gè)映射。
一,什么是ORM
從效果上說,它其實(shí)是創(chuàng)建了一個(gè)可在編程語言里使用的“虛擬對(duì)象數(shù)據(jù)庫”。說白了就是把關(guān)系型數(shù)據(jù)庫封裝成業(yè)務(wù)實(shí)體對(duì)象,這樣,我們?cè)诰唧w的操作業(yè)務(wù)對(duì)象的時(shí)候,就不需要再去和復(fù)雜的SQL語句打交道,只需簡(jiǎn)單的操作對(duì)象的屬性和方法。
對(duì)象關(guān)系映射(Object-Relational Mapping)提供了概念性的、易于理解的模型化數(shù)據(jù)的方法。ORM方法論基于三個(gè)核心原則:
簡(jiǎn)單:以最基本的形式建模數(shù)據(jù)。
傳達(dá)性:數(shù)據(jù)庫結(jié)構(gòu)被任何人都能理解的語言文檔化。
精確性:基于數(shù)據(jù)模型創(chuàng)建正確標(biāo)準(zhǔn)化的結(jié)構(gòu)。
典型地,建模者通過收集來自那些熟悉應(yīng)用程序但不熟練數(shù)據(jù)結(jié)構(gòu)的人的信息開發(fā)信息的模型。建模者必須能夠用非技術(shù)專家可以理解的術(shù)語在概念層次上與數(shù)據(jù)結(jié)構(gòu)進(jìn)行通訊。建模者也必須能以簡(jiǎn)單的單元分析信息,對(duì)樣本數(shù)據(jù)進(jìn)行處理。ORM專門被設(shè)計(jì)為改進(jìn)這種聯(lián)系。簡(jiǎn)單的說:ORM相當(dāng)于中繼數(shù)據(jù)。
二,理解ORM
對(duì)象-關(guān)系映射(Object-Relational Mapping,簡(jiǎn)稱ORM),是隨著面向?qū)ο蟮能浖_發(fā)方法發(fā)展而產(chǎn)生的。面向?qū)ο蟮拈_發(fā)方法是當(dāng)今企業(yè)級(jí)應(yīng)用開發(fā)環(huán)境中的主流開發(fā)方法,關(guān)系數(shù)據(jù)庫是企業(yè)級(jí)應(yīng)用環(huán)境中永久存放數(shù)據(jù)的主流數(shù)據(jù)存儲(chǔ)系統(tǒng)。對(duì)象和關(guān)系數(shù)據(jù)是業(yè)務(wù)實(shí)體的兩種表現(xiàn)形式,業(yè)務(wù)實(shí)體在內(nèi)存中表現(xiàn)為對(duì)象,在數(shù)據(jù)庫中表現(xiàn)為關(guān)系數(shù)據(jù)。內(nèi)存中的對(duì)象之間存在關(guān)聯(lián)和繼承關(guān)系,而在數(shù)據(jù)庫中,關(guān)系數(shù)據(jù)無法直接表達(dá)多對(duì)多關(guān)聯(lián)和繼承關(guān)系。因此,對(duì)象-關(guān)系映射(ORM)系統(tǒng)一般以中間件的形式存在,主要實(shí)現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫數(shù)據(jù)的映射。
面向?qū)ο笫菑能浖こ袒驹瓌t(如耦合、聚合、封裝)的基礎(chǔ)上發(fā)展起來的,而關(guān)系數(shù)據(jù)庫則是從數(shù)學(xué)理論發(fā)展而來的,兩套理論存在顯著的區(qū)別。為了解決這個(gè)不匹配的現(xiàn)象,對(duì)象關(guān)系映射技術(shù)應(yīng)運(yùn)而生。
讓我們從O/R開始。字母O起源于 對(duì)象(Object),而R則來自于 關(guān)系(Relational)。幾乎所有的程序里面,都存在對(duì)象和關(guān)系數(shù)據(jù)庫。在業(yè)務(wù)邏輯層和用戶界面層中,我們是面向?qū)ο蟮。?dāng)對(duì)象信息發(fā)生變化的時(shí)候,我們需要把對(duì)象的信息保存在關(guān)系數(shù)據(jù)庫中。
當(dāng)你開發(fā)一個(gè)應(yīng)用程序的時(shí)候不使用O/R Mapping,你可能會(huì)寫不少數(shù)據(jù)訪問層的代碼,用來從數(shù)據(jù)庫保存,刪除,讀取對(duì)象信息,等等。你在DAL中寫了很多的方法來讀取對(duì)象數(shù)據(jù),改變狀態(tài)對(duì)象等等任務(wù)。而這些代碼寫起來總是重復(fù)的。
如果打開你最近的程序,看看DAL代碼,你肯定會(huì)看到很多近似的通用的模式。我們以保存對(duì)象的方法為例,你傳入一個(gè)對(duì)象,為SQLCOMMAND對(duì)象添加SQLPARAMETER,把所有屬性和對(duì)象對(duì)應(yīng),設(shè)置SQLCOMMAND的COMMANDTEXT屬性為存儲(chǔ)過程,然后運(yùn)行SQLCOMMAND。對(duì)于每個(gè)對(duì)象都要重復(fù)的寫這些代碼。
除此之外,還有更好的辦法嗎?有,引入一個(gè)O/R Mapping。實(shí)質(zhì)上,一個(gè)O/R Mapping會(huì)為你生成DAL。與其自己寫DAL代碼,不如用O/R Mapping。你用O/R Mapping保存,刪除,讀取對(duì)象,O/R Mapping負(fù)責(zé)生成SQL,你只需要關(guān)心對(duì)象就好。
一般的ORM包括以下四部分:
一個(gè)對(duì)持久類對(duì)象進(jìn)行CRUD操作的API;
一個(gè)語言或API用來規(guī)定與類和類屬性相關(guān)的查詢;
一個(gè)規(guī)定Mapping METADATA的工具;
一種技術(shù)可以讓ORM的實(shí)現(xiàn)同事務(wù)對(duì)象一起進(jìn)行DIRTYCHECKING, LAZY ASSOCIATION FETCHING以及其他的優(yōu)化操作。
三,ORM優(yōu)缺點(diǎn)
ORM自其概念被提出,就得到了無數(shù)的響應(yīng),花樣繁多的應(yīng)用框架更是應(yīng)接不暇?梢,他是有其獨(dú)到的優(yōu)勢(shì)的。那么他的優(yōu)勢(shì)有哪些那:
第一:
ORM最大的優(yōu)勢(shì),隱藏了數(shù)據(jù)訪問細(xì)節(jié),“封閉”的通用數(shù)據(jù)庫交互,ORM的核心。
他使得我們的通用數(shù)據(jù)庫交互變得簡(jiǎn)單易行,并且完全不用考慮該死的SQL語句?焖匍_發(fā),由此而來。
第二:
ORM使我們構(gòu)造固化數(shù)據(jù)結(jié)構(gòu)變得簡(jiǎn)單易行。在ORM年表的史前時(shí)代,我們需要將我們的對(duì)象模型轉(zhuǎn)化為一條一條的SQL語句,
通過直連或是DB helper在關(guān)系數(shù)據(jù)庫構(gòu)造我們的數(shù)據(jù)庫體系。而現(xiàn)在,基本上所有的ORM框架都提供了通過對(duì)象模型構(gòu)造關(guān)系數(shù)據(jù)庫結(jié)構(gòu)的功能。這,相當(dāng)不錯(cuò)。
世上沒有驢是不吃草的(又想好又想巧,買個(gè)老驢不吃草),任何優(yōu)勢(shì)的背后都隱藏著缺點(diǎn),這是不可避免的:
第一:
無可避免的,自動(dòng)化意味著映射和關(guān)聯(lián)管理,代價(jià)是犧牲性能(早期,這是所有不喜歡ORM人的共同點(diǎn))。
現(xiàn)在的各種ORM框架都在嘗試使用各種方法來減輕這塊(LazyLoad,Cache),效果還是很顯著的。
第二:
面向?qū)ο蟮牟樵冋Z言(X-QL)作為一種數(shù)據(jù)庫與對(duì)象之間的過渡,雖然隱藏了數(shù)據(jù)層面的業(yè)務(wù)抽象,
但并不能完全的屏蔽掉數(shù)據(jù)庫層的設(shè)計(jì),并且無疑將增加學(xué)習(xí)成本.
第三:
對(duì)于復(fù)雜查詢,ORM仍然力不從心。雖然可以實(shí)現(xiàn),但是不值的。視圖可以解決大部分calculated column,case ,group,having,order by, exists,但是查詢條件(a and b and not c and (d or d))。。。。。。
四,正確看待ORM
ORM為何而生
在數(shù)月以前,我有幸參加了一個(gè)公司內(nèi)部的組件發(fā)布會(huì)。令我深感意外的事,一向無人關(guān)心的組件發(fā)布會(huì)這次變得人山人海,在漫長(zhǎng)的新版本介紹之后。每個(gè)開發(fā)組長(zhǎng)都跳出來抱怨上一個(gè)版本的問題,并且宣布與剛發(fā)布的新版本也是無法滿足他們的需要的。一切都是如此的混亂,以至領(lǐng)導(dǎo)層不得不采用鎮(zhèn)壓的方式來平息怒火沖天的人們。
在會(huì)后的那個(gè)晚上,我仔細(xì)回想了這次沖突。因?yàn)閾?jù)我了解,這一系列的組件非常完美的完成了他所被期待的功能?墒菫槭裁催是會(huì)被抱怨如此那。
我覺得,可能,他(組件)是沒有被正確使用了。
不知道還有誰記得James Elliott的那句話:
As good object-oriented developers got tired of this repetitive work,
their typical tendency towards enlightened laziness started to manifest itself
in the creation of tools to help automate the process. When working with relational databases,
the culmination of such efforts were object/relational mapping tools.
ORM構(gòu)架只能是一個(gè)helper,他定位與此,而不是完整的數(shù)據(jù)持久層。他的設(shè)計(jì)者從來就沒把他定位于取代一切的超級(jí)美女。ORM致力為長(zhǎng)久以來的程序員與”重復(fù)勞動(dòng)”的戰(zhàn)爭(zhēng)而助拳。與任何一個(gè)helper一樣,他有自己的不足,他有優(yōu)點(diǎn)也有缺點(diǎn)。
無數(shù)的開發(fā)人員試圖將使用ORM的框架構(gòu)架自己項(xiàng)目的數(shù)據(jù)持久層,很多人感受到了ORM的優(yōu)勢(shì),他們歡心鼓舞。但是很不幸,也有很多人失敗或是深受蹉責(zé)。
還有許多人,無奈的編寫著很多ORM不適合作的事情。其實(shí)想一想,被自己舍棄了的以前的helper工具,難道真的一無是處了?
ORM與DB Helper Library
很多人可能都接觸過這類的helper,每個(gè)公司都有自己的helper。許多Helper提供了很多的強(qiáng)大的功能,封閉交互底層,實(shí)體類支持,提供SQL翻譯功能。ORM比之這些Helper只是多提供了一層,他嘗試封閉的自動(dòng)化的(或是映射文件)來實(shí)現(xiàn)關(guān)聯(lián)。以前,這都是我們手打的。(靈活替換數(shù)據(jù)庫也算ORM優(yōu)點(diǎn),ORM優(yōu)勢(shì)和缺點(diǎn)。。。(小雨))
問題就在與有些人發(fā)現(xiàn)封閉的自動(dòng)化關(guān)聯(lián)滿足他們需要了,所以O(shè)RM對(duì)他而言是成功的。而有些人發(fā)現(xiàn)封閉的自動(dòng)化關(guān)聯(lián)不適合他們的項(xiàng)目,所以O(shè)RM被詬病。
我的觀點(diǎn)是ORM試圖取代helper,為此提供了更多的功能。他為了應(yīng)付更加嚴(yán)格和復(fù)雜的企業(yè)需求而不斷發(fā)展,在很多情況下,這些工具開始具有自身的復(fù)雜性,使得開發(fā)人員必須學(xué)習(xí)使用它們的詳細(xì)規(guī)則,并修改組成應(yīng)用程序的類以滿足映射系統(tǒng)的需要,使用它們所面臨的復(fù)雜性反而蓋過了所能獲得的好處。在我們的大部分項(xiàng)目中Helper依然是我們構(gòu)建數(shù)據(jù)持久層的主力,ORM或許在有些項(xiàng)目(模塊)中可以獨(dú)攬一切,但是ORM(就目前而言)無法面對(duì)一切考驗(yàn)。
五,數(shù)據(jù)持久化
上面有提到很多人使用ORM的框架構(gòu)架項(xiàng)目的數(shù)據(jù)持久層,什么事數(shù)據(jù)持久層?這就要理解數(shù)據(jù)持久化了。
理解數(shù)據(jù)持久化
數(shù)據(jù)持久化就是將內(nèi)存中的數(shù)據(jù)模型轉(zhuǎn)換為存儲(chǔ)模型,以及將存儲(chǔ)模型轉(zhuǎn)換為內(nèi)存中的數(shù)據(jù)模型的統(tǒng)稱. 數(shù)據(jù)模型可以是任何數(shù)據(jù)結(jié)構(gòu)或?qū)ο竽P?存儲(chǔ)模型可以是關(guān)系模型、XML、二進(jìn)制流等。
狹義的理解,持久化僅僅是指把對(duì)象數(shù)據(jù)永久保存在數(shù)據(jù)庫中,數(shù)據(jù)在計(jì)算機(jī)中一般由兩個(gè)存儲(chǔ)地,內(nèi)存為暫存,數(shù)據(jù)庫可以理解為永存;廣義的理解,持久化包括和數(shù)據(jù)庫相關(guān)的各種操作,封裝了數(shù)據(jù)訪問細(xì)節(jié),為大部分業(yè)務(wù)邏輯提供面向?qū)ο蟮腁PI。
簡(jiǎn)單的理解持久化可以在二個(gè)層面:應(yīng)用層和系統(tǒng)層:
應(yīng)用層:如果關(guān)閉(shutdown)你的應(yīng)用然后重新啟動(dòng)則先前的數(shù)據(jù)依然存在。
系統(tǒng)層:如果關(guān)閉(shutdown)你的系統(tǒng)(電腦)然后重新啟動(dòng)則先前的數(shù)據(jù)依然存在。
數(shù)據(jù)持久化好處
使用數(shù)據(jù)持久化有以下好處:
1、松散耦合,程序代碼重用性強(qiáng),使持久化不依賴于底層數(shù)據(jù)庫和上層業(yè)務(wù)邏輯實(shí)現(xiàn),更換數(shù)據(jù)庫時(shí)只需修改配置文件而不用修改代碼。
2、業(yè)務(wù)邏輯代碼可讀性強(qiáng),在代碼中不會(huì)有大量的SQL語言,提高程序的可讀性。
3、持久化技術(shù)可以自動(dòng)優(yōu)化,以減少對(duì)數(shù)據(jù)庫的訪問量,提高程序運(yùn)行效率。
數(shù)據(jù)持久化對(duì)象的基本操作有:保存、更新、刪除、查詢等。
由此可知,數(shù)據(jù)持久層也就是與數(shù)據(jù)交互的那一層次,所以有時(shí)候有見到ORM框架介紹:是一個(gè)數(shù)據(jù)持久層(ORM)框架。
以上內(nèi)容是關(guān)于理解ORM和數(shù)據(jù)持久化的介紹,要想了解更多相關(guān)信息、教育培訓(xùn)內(nèi)容,請(qǐng)隨時(shí)關(guān)注唯學(xué)網(wǎng),小編會(huì)第一時(shí)間為大家更新、跟進(jìn)最新信息。