DAL、DAO、ORM、Active Record辨析

模型 Model

模型是MVC中的概念,指的是讀取數據和改變數據的操作(業務邏輯)。一開始我們直接把和數據庫相關的代碼放在模型裏(sql直接寫在代碼中),這樣就會導致以後的維護相當麻煩。業務邏輯的修改都需要開發者重新寫sql,如果項目需要分庫,需要將sql語句抽出來,放到單獨的一層。這一層就是DAL(數據訪問層)。

持久層Persistence

持久層只是一個邏輯概念而已,主要任務是負責把數據保存起來,一般是指保存至數據庫或者文件,也可以負責完成與之相關的行爲。

持久層指的是把數據長期保存起來,如數據庫把數據長期保存在硬盤裏,XML也可以長期保存數據,還有如果把數據存放到指定文件中,也可以成爲持久層。

持久化可以理解爲動詞。Java中的Hibernate做的就是持久化的操作,主要是對數據庫底層的OR映射,這樣我們就不必關心討厭的關係映射了,直接操作對象就可以了。

DAL  Data Access Layer,數據訪問層

DAL是三層架構(表現層,業務邏輯層,數據訪問層)中的數據訪問層,是一個概念或者說是一個方案,它由許多DAO組成,或者說由DAO具體實現,是把和數據庫相關的代碼封裝起來,這樣當我們執行分庫時,便只用調整DAO的代碼了,模型根本不用關心它使用的數據是放在A庫還是B庫。

設計數據訪問層接口的目的是讓業務邏輯層不去調用具體的數據訪問層的實現(不依賴於數據訪問層具體的實現技術),這樣的好處是,業務邏輯不必管數據訪問層具體是什麼技術來實現的,接口是不變的。

使用DAL的優勢如下:

1、開發人員可以只關注整個結構中的其中某一層;

2、可以很容易的用新的實現來替換原有層次的實現;

3、可以降低層與層之間的依賴;

4、有利於標準化;

5、利於各層邏輯的複用。

概括來說,分層式設計可以達至如下目的:分散關注、鬆散耦合、邏輯複用、標準定義。

降低耦合性的實際應用如下:

業務邏輯不必管數據訪問層具體是什麼技術來實現的,接口是不變的,數據訪問層可以用jdbc來實現,也可以用hibernate來實現,而且更換起來不是非常麻煩,這樣耦合就降低了

DAO data access object,數據訪問對象

DAO是一個軟件設計的指導原則,在覈心J2EE模式中是這樣介紹DAO模式的:爲了建立一個健壯的J2EE應用,應該將所有對數據源的訪問操作抽象封裝在一個公共API中。用程序設計的語言來說,就是建立一個接口,接口中定義了此應用程序中將會用到的所有事務方法。在這個應用程序中,當需要和數據源進行交互的時候則使用這個接口,並且編寫一個單獨的類來實現這個接口在邏輯上對應這個特定的數據存儲。

顧名思義就是與數據庫打交道,夾在業務邏輯與數據庫資源中間,是DAL的具體實現。

簡單的說 dao層 就是對數據庫中數據的增刪改查等操作封裝在專門的類裏面,在業務邏輯層中如果要訪問數據的時候,直接調用該dao類(包括瞭如何訪問數據庫和數據的增刪改查等等代碼),就可以返回數據,而不需要再在業務邏輯層中寫這些代碼。

ORM object-relational mapping,對象關係映射

ORM也是一種對數據庫訪問的封裝,然而ORM不像DAO只是一種軟件設計的指導原則,強調的是系統應該層次分明,更像是一種工具,有着成熟的產品,比如JAVA界非常有名的Hibernate,以及很多PHP框架裏自帶的ORM庫。他們的好處在於能將你程序中的數據對象自動地轉化爲關係型數據庫中對應的表和列,數據對象間的引用也可以通過這個工具轉化爲表之間的JOIN。使用ORM的好處就是使得你的開發幾乎不用接觸到SQL語句。創建一張表,聲明一個對應的類,然後你就只用和這個類的實例進行交互了,至於這個對象裏的數據該怎麼存儲又該怎麼獲取,通通不用關心。

Active Record

Active Record則是隨着ruby on rails的流行而火起來的一種ORM模式,它是把負責持久化的代碼也集成到數據對象中,即這個數據對象知道怎樣把自己存到數據庫裏。這與以往的ORM有不同,傳統的ORM會把數據對象和負責持久化的代碼分開,數據對象只是一個單純包含數據的結構體,在模型層和ORM層中傳遞。而在Active Record中,模型層集成了ORM的功能,他們既代表實體,包含業務邏輯,又是數據對象,並負責把自己存儲到數據庫中,當然,存儲的這一部分代碼是早已在模型的父類中實現好了的,屬於框架的一部分,模型只需簡單的調用父類的方法來完成持久化而已。

下面內容摘自ThinkPHP手冊

遵循標準的ORM模型:表映射到記錄,記錄映射到對象,字段映射到對象屬性。配合遵循的命名和配置慣例,能夠很大程度的快速實現模型的操作,而且簡潔易懂。

ActiveRecord的主要思想是:

1. 每一個數據庫表對應創建一個類,類的每一個對象實例對應於數據庫中表的一行記錄;通常表的每個字段在類中都有相應的Field;

2. ActiveRecord同時負責把自己持久化,在ActiveRecord中封裝了對數據庫的訪問,即CURD;

3. ActiveRecord是一種領域模型(Domain Model),封裝了部分業務邏輯;

ActiveRecord比較適用於:

1. 業務邏輯比較簡單,當你的類基本上和數據庫中的表一一對應時, ActiveRecord是非常方便的,即你的業務邏輯大多數是對單表操作;

2. 當發生跨表的操作時, 往往會配合使用事務腳本(Transaction Script),把跨表事務提升到事務腳本中;

3. ActiveRecord最大優點是簡單, 直觀。 一個類就包括了數據訪問和業務邏輯. 如果配合代碼生成器使用就更方便了;

這些優點使ActiveRecord特別適合WEB快速開發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章