淺談model, orm, dao和active record的區(qū)別
在做web開發(fā)中观游,經(jīng)常會(huì)碰到和數(shù)據(jù)相關(guān)的幾個(gè)概念:
- Model
- DAO,data access object卵贱,數(shù)據(jù)訪問對(duì)象
- ORM滥沫,object-relational mapping,對(duì)象關(guān)系映射
- Active Record
一键俱、Model兰绣,模型。
模型是MVC中的概念编振,指的是數(shù)據(jù)和改變數(shù)據(jù)的操作(業(yè)務(wù)邏輯)缀辩。模型通常指代現(xiàn)實(shí)生活中的某樣實(shí)體。以訂單為例踪央,每個(gè)訂單都包含許多數(shù)據(jù)臀玄,如客戶、價(jià)格杯瞻、明細(xì)等等镐牺,這些數(shù)據(jù)都叫做訂單這個(gè)模型的屬性,此外魁莉,和訂單相關(guān)的一些列操作,比如當(dāng)購(gòu)買時(shí),你可能需要先檢查庫(kù)存旗唁,給與一定的優(yōu)惠畦浓,再更新賬戶余額和積分等等,這些就叫做業(yè)務(wù)邏輯检疫,也是模型的一部分讶请,從代碼上來講,是要放在模型中的屎媳。
二夺溢、DAO:data access object,數(shù)據(jù)訪問對(duì)象
當(dāng)模型執(zhí)行完業(yè)務(wù)邏輯后烛谊,我們便要把模型中的數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中风响。如果我們直接把和數(shù)據(jù)庫(kù)相關(guān)的代碼放在模型里,會(huì)使得以后的維護(hù)相當(dāng)?shù)穆闊┑べ鳌T谖抑暗囊粋€(gè)項(xiàng)目中状勤,我們用戶的增長(zhǎng)相當(dāng)快,導(dǎo)致一臺(tái)數(shù)據(jù)庫(kù)無法支撐所有的訪問双泪,不得不使用分庫(kù)來解決問題持搜。然而前人把SQL語句直接寫在了模型這一層里,這導(dǎo)致分庫(kù)相當(dāng)?shù)穆闊┍好覀冎荒芟?strong>把這些SQL語句抽出來葫盼,才能把分庫(kù)進(jìn)行下去。我們把這些抽出來的SQL代碼放到單獨(dú)的一層村斟,這一層便是DAL剪返,Data Access Layer,數(shù)據(jù)訪問層邓梅,它由許多DAO組成脱盲,目的便是把和數(shù)據(jù)庫(kù)相關(guān)的代碼封裝起來,這樣當(dāng)我們執(zhí)行分庫(kù)時(shí)日缨,便只用調(diào)整DAO的代碼了钱反,模型根本不用關(guān)心它使用的數(shù)據(jù)是放在A庫(kù)還是B庫(kù)。
DAO其實(shí)是來源于J2EE的一個(gè)設(shè)計(jì)模式匣距,當(dāng)初的目的也是使得企業(yè)更換數(shù)據(jù)庫(kù)時(shí)面哥,不用影響模型層的代碼。
三毅待、ORM尚卫,object-relational mapping
與DAO類似,ORM也是一種封裝數(shù)據(jù)訪問的概念尸红。然而ORM不像DAO只是一種軟件設(shè)計(jì)的指導(dǎo)原則吱涉,強(qiáng)調(diào)的是系統(tǒng)應(yīng)該層次分明刹泄。ORM更像是一種工具,有著成熟的產(chǎn)品怎爵,比如Java界非常有名的hibernate特石,以及很多PHP框架里自帶的ORM庫(kù)。他們的好處在于能將你程序中的數(shù)據(jù)對(duì)象自動(dòng)地轉(zhuǎn)化為關(guān)系型數(shù)據(jù)庫(kù)中對(duì)應(yīng)的表和列鳖链,數(shù)據(jù)對(duì)象間的引用也可以通過這個(gè)工具轉(zhuǎn)化為表之間的join姆蘸,而Hibernate甚至提供一套他們自己的數(shù)據(jù)查詢語言HQL來解決復(fù)雜的查詢問題。
使用ORM的好處就是使得你的開發(fā)幾乎不用接觸到SQL語句芙委。創(chuàng)建一張表逞敷,聲明一個(gè)對(duì)應(yīng)的類,然后你就只用和這個(gè)類的實(shí)例進(jìn)行交互了灌侣,至于這個(gè)對(duì)象里的數(shù)據(jù)該怎么存儲(chǔ)又該怎么獲取推捐,通通不用關(guān)心。
四顶瞳、Active Record
Active Record則是隨著ruby on rails的流行而火起來的一種ORM模式玖姑,它是把負(fù)責(zé)持久化的代碼也集成到數(shù)據(jù)對(duì)象中,即這個(gè)數(shù)據(jù)對(duì)象知道怎樣把自己存到數(shù)據(jù)庫(kù)里慨菱。這與以往的ORM有不同焰络,傳統(tǒng)的ORM會(huì)把數(shù)據(jù)對(duì)象和負(fù)責(zé)持久化的代碼分開,數(shù)據(jù)對(duì)象只是一個(gè)單純包含數(shù)據(jù)的結(jié)構(gòu)體符喝,在模型層和ORM層中傳遞闪彼。而在Active Record中,模型層集成了ORM的功能协饲,他們既代表實(shí)體畏腕,包含業(yè)務(wù)邏輯,又是數(shù)據(jù)對(duì)象茉稠,并負(fù)責(zé)把自己存儲(chǔ)到數(shù)據(jù)庫(kù)中描馅,當(dāng)然,存儲(chǔ)的這一部分代碼是早已在模型的父類中實(shí)現(xiàn)好了的而线,屬于框架的一部分铭污,模型只需簡(jiǎn)單的調(diào)用父類的方法來完成持久化而已。
總結(jié):DAO層用來跟數(shù)據(jù)庫(kù)打交道膀篮。ORM是對(duì)象關(guān)系映射嘹狞,像比較常用的ORM框架有hibernate ,ibatis。就算是一個(gè)應(yīng)用中采用了ORM框架誓竿,也是需要DAO層的磅网。只不過采用ORM后,DAO是跟ORM框架打交道筷屡,再由ORM跟數(shù)據(jù)庫(kù)打交道涧偷;而沒有采用簸喂,就是DAO層直接訪問數(shù)據(jù)庫(kù)。