摘要:關(guān)鍵字對(duì)象關(guān)系映射現(xiàn)代的應(yīng)用程序常常是使用兩種截然不同的技術(shù)構(gòu)建而成業(yè)務(wù)邏輯部分使用面向?qū)ο缶幊?,?shù)據(jù)存儲(chǔ)使用關(guān)系型數(shù)據(jù)庫(kù)。對(duì)象關(guān)系映射則是兩者之間的橋梁,它允許應(yīng)用程序以面向?qū)ο蟮姆绞皆L問(wèn)關(guān)系數(shù)據(jù)。
O/RM技術(shù)可以簡(jiǎn)化數(shù)據(jù)訪問(wèn),但也需要注意到引入這個(gè)新的抽象層來(lái)的挑戰(zhàn)。
關(guān)鍵字:對(duì)象-關(guān)系映射
現(xiàn)代的應(yīng)用程序常常是使用兩種截然不同的技術(shù)構(gòu)建而成:業(yè)務(wù)邏輯部分使用面向?qū)ο缶幊?,?shù)據(jù)存儲(chǔ)使用關(guān)系型數(shù)據(jù)庫(kù)。面向?qū)ο缶幊淌菍?shí)現(xiàn)復(fù)雜的系統(tǒng)的一個(gè)關(guān)鍵技術(shù),它提供的好處包括可重用性、健壯性和可維護(hù)性。關(guān)系型數(shù)據(jù)庫(kù)是保存數(shù)據(jù)的倉(cāng)庫(kù)。O/RM(對(duì)象關(guān)系映射)則是兩者之間的橋梁,它允許應(yīng)用程序以面向?qū)ο蟮姆绞皆L問(wèn)關(guān)系數(shù)據(jù)。?
O/RM是對(duì)象持久化的一個(gè)專業(yè)化的一般概念。IBM研究員格雷迪·布赫在他的書(shū)《面向?qū)ο蟮姆治雠c應(yīng)用設(shè)計(jì)》中,將“持久性”定義為“在程序生命周期之外的數(shù)據(jù)”,是對(duì)象模型1中的次要元素。然而,在現(xiàn)代應(yīng)用程序中,貢獻(xiàn)在持久化上的工作量,有時(shí)可以主宰一個(gè)項(xiàng)目的成本,而使用O/RM工具,可以顯著降低成本。
有一些其他技術(shù)可以用于從面向?qū)ο蟮某绦蛟L問(wèn)關(guān)系型數(shù)據(jù),但這些技術(shù)一般不利用編程語(yǔ)言的對(duì)象模型特性。要充分利用對(duì)象模型的特性,數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)需要支持信息隱藏、關(guān)注點(diǎn)分離、繼承、變化檢測(cè)、唯一性保持和數(shù)據(jù)庫(kù)獨(dú)立性。?
關(guān)注點(diǎn)分離是將一個(gè)程序分為一些邏輯部分的過(guò)程,這些部分有很少或根本沒(méi)有重疊。在數(shù)據(jù)庫(kù)編程中有幾部分應(yīng)分開(kāi):1)業(yè)務(wù)方法中查找和操作領(lǐng)域?qū)ο蟮姆椒ǎ?)領(lǐng)域?qū)ο笾锌赡軙?huì)導(dǎo)致內(nèi)部狀態(tài)的變化的方法和可能會(huì)調(diào)用相關(guān)聯(lián)的對(duì)象方法的方法;3)生成的數(shù)據(jù)庫(kù)命令中對(duì)行和列執(zhí)行插入,查詢,更新,和刪除的;4)以及用于數(shù)據(jù)庫(kù)事務(wù)劃分的方法。
信息隱藏是關(guān)注點(diǎn)分離的一個(gè)實(shí)現(xiàn)策略,此策略根據(jù)接口定義的行為實(shí)現(xiàn)特定的類,以降低復(fù)雜性和成本。類實(shí)現(xiàn)的行為要和調(diào)用者的行為分開(kāi)。改變一方的行為并不一定需要也改變另一方。
繼承允許代碼的重用,一些相關(guān)聯(lián)的類中共同的行為只被定義一次,具有唯一性的行為只在類之間的行為不同的地方實(shí)現(xiàn)。如此,一個(gè)類的行為和子類或父類(超類)的行為相較,可能是相同或不同的,并且此行為獨(dú)立于調(diào)用者的行為。
變化檢測(cè)在一個(gè)數(shù)據(jù)庫(kù)事務(wù)中一直跟蹤領(lǐng)域?qū)ο蟮淖兓栽谑聞?wù)結(jié)束時(shí),更改將應(yīng)用到數(shù)據(jù)庫(kù)。?
唯一性保持是數(shù)據(jù)庫(kù)交互中的一個(gè)屬性,在交互中一個(gè)獨(dú)立領(lǐng)域?qū)嵗龑?duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)行,而不管用戶是如何獲得對(duì)象的:通過(guò)查詢數(shù)據(jù)庫(kù),從一個(gè)實(shí)例的引用導(dǎo)航到另一個(gè),或通過(guò)提供其首要識(shí)別符找到一個(gè)確定的領(lǐng)域?qū)嵗<偃魶](méi)有唯一性保持,對(duì)一個(gè)領(lǐng)域?qū)嵗M(jìn)行的更改將不會(huì)被其他代表同一數(shù)據(jù)庫(kù)行的領(lǐng)域?qū)嵗吹剑@可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)損壞。?
數(shù)據(jù)庫(kù)獨(dú)立性,允許使用一個(gè)共同的API和領(lǐng)域模型操作各種數(shù)據(jù)庫(kù)而不改變數(shù)據(jù)庫(kù)的應(yīng)用程序視圖。
最早用于訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)的技術(shù)(現(xiàn)在仍然非常流行),使用許多API傳輸SQL語(yǔ)句到服務(wù)器,并把執(zhí)行語(yǔ)句的結(jié)果返回給應(yīng)用程序。這會(huì)留給應(yīng)用程序來(lái)決定,是直接使用結(jié)果還是創(chuàng)建數(shù)據(jù)結(jié)構(gòu)來(lái)表示查詢的結(jié)果,并復(fù)制查詢結(jié)果給這些數(shù)據(jù)結(jié)構(gòu)。
直接模式化的查詢結(jié)果所用的的數(shù)據(jù)結(jié)構(gòu),無(wú)法模型化數(shù)據(jù)庫(kù)中存在的關(guān)系;因此,實(shí)例之間的關(guān)聯(lián)沒(méi)有被數(shù)據(jù)結(jié)構(gòu)充分描述。使用這種類型訪問(wèn)的例子包括ODBC(開(kāi)放數(shù)據(jù)庫(kù)連接)接口和JDBC(Java數(shù)據(jù)庫(kù)連接)接口。這些接口允許有限的關(guān)注分離,但更多情況下是業(yè)務(wù)邏輯與數(shù)據(jù)庫(kù)編程混合在一起。他們不支持信息隱藏,繼承,變化檢測(cè),唯一性保持或數(shù)據(jù)庫(kù)獨(dú)立性。
更強(qiáng)大的技術(shù)是在其接口中提供一些方法將查詢結(jié)果復(fù)制到用戶指定的數(shù)據(jù)結(jié)構(gòu)。用戶提供所有注釋過(guò)的SQL語(yǔ)句,使它們可以對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)。用戶創(chuàng)建的SQL語(yǔ)句包括所有的查詢,加上插入,更新和刪除。這些技術(shù)處理很多容易出錯(cuò)和耗費(fèi)時(shí)間的工作以分析查詢結(jié)果,但仍然給用戶留下許多艱巨的任務(wù)。以這種風(fēng)格訪問(wèn)的一個(gè)例子是iBATIS,它支持信息隱藏和有限的關(guān)注分離,但不支持繼承,變化檢測(cè),唯一性保持或數(shù)據(jù)庫(kù)獨(dú)立性。
使用O/RM,存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)將作為本地對(duì)象編程語(yǔ)言中的對(duì)象表示給應(yīng)用程序。程序員映射領(lǐng)域?qū)ο竽P皖惖疥P(guān)系表,并使用一個(gè)由持久性提供程序?qū)崿F(xiàn)了的API來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。對(duì)數(shù)據(jù)庫(kù)的查詢表達(dá)為領(lǐng)域?qū)ο竽P偷姆绞?。提供程序直接從領(lǐng)域模型生成SQL語(yǔ)句。馬丁·福勒稱這種方法DataMapper.2
O/RM技術(shù)和產(chǎn)品在許多面向?qū)ο蟮恼Z(yǔ)言中可用,包括Java,C++,C#,Python,Smalltalk,Ruby和Groovy。O/RM所用的技術(shù)和編程范式適用于許多支持這些語(yǔ)言的產(chǎn)品。(在這篇文章中,例子使用Java)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/17434.html
摘要:使用標(biāo)準(zhǔn)的持久性的一個(gè)優(yōu)點(diǎn)是它允許項(xiàng)目作出晚部署項(xiàng)目數(shù)據(jù)庫(kù)和持久性提供程序的決定。映射通常是需要聲明的,表示領(lǐng)域?qū)ο竽P团c關(guān)系模式模型之間關(guān)聯(lián)的映射在應(yīng)用程序運(yùn)行之前已經(jīng)定義。 O/RM的架構(gòu) 從應(yīng)用程序的視角看,O/RM有兩個(gè)主要部分:持久性API和領(lǐng)域類。在Java中,API通常是Java社區(qū)流程的標(biāo)準(zhǔn)之一 ---Java持久性API,企業(yè)JavaBeans或Java數(shù)據(jù)對(duì)象...
摘要:使用標(biāo)準(zhǔn)的持久性的一個(gè)優(yōu)點(diǎn)是它允許項(xiàng)目作出晚部署項(xiàng)目數(shù)據(jù)庫(kù)和持久性提供程序的決定。映射通常是需要聲明的,表示領(lǐng)域?qū)ο竽P团c關(guān)系模式模型之間關(guān)聯(lián)的映射在應(yīng)用程序運(yùn)行之前已經(jīng)定義。 O/RM的架構(gòu) 從應(yīng)用程序的視角看,O/RM有兩個(gè)主要部分:持久性API和領(lǐng)域類。在Java中,API通常是Java社區(qū)流程的標(biāo)準(zhǔn)之一 ---Java持久性API,企業(yè)JavaBeans或Java數(shù)據(jù)對(duì)象...
閱讀 1483·2021-09-02 19:23
閱讀 1654·2021-08-11 11:19
閱讀 668·2019-08-30 15:55
閱讀 1677·2019-08-30 12:50
閱讀 2276·2019-08-30 11:23
閱讀 2210·2019-08-29 13:13
閱讀 1525·2019-08-28 18:13
閱讀 3367·2019-08-26 11:53