嗯~~~~很難跟你說明就是了。
啊~~~我想到了。其實就像是貨運一樣。
用飛機用火車用船或是用汽車。
這些全都可以算是一種資料讀取的協議(能用協議論嗎??好像也怪怪的)或方法。
要說差異跟優劣,其實很難說。
因為依照環境或是作用的不同。還有能使用的元件。
都是有其允許及不允許的。
我覺我說的有點亂。但又不想照本宣科的回答。
你看看能意會多少算多少吧。
https://www.jianshu.com/p/00a7ca8d6bea
看這說明,DAO似乎只是把存取資料庫的程式碼封裝成接口,以便後續維護。
ORM則是更進一步的把資料庫的欄位和操作用物件去映射。
然後DAO和ORM基本上層級就不同了。
不過我也沒經過DAO的時代,所以也不是很清楚。
所以,一般只會選擇一種方法來對DB做操作嗎?
一定啊??看你的系統需求能用什麼方法就用。
很少看到會同時用兩種方式的。但也不太一定啦。
就有看過web server跟java同步的東西。兩者使用的方法就不相同了。
看我給你的那個連結,他有提到,ORM後面要存取資料庫,也是透過DAO的概念。
一般來說你在寫程式的確只會用一種,但是偶爾有可能會混用。
比如說你有時候ORM用一用,發現ORM不容易寫,還是得寫SQL,這時候你有可能會把SQL封裝成一個lib,這應該就算是簡易的DAO。
好的~謝謝你們,我有一個概念了!
froce
是不是說反了? 原文意思是 DAO 裡頭使用 ORM 存取資料庫
DAO 本身就是一個抽象化, 底層用什麼方式存取 DB 都被封裝起來, 因此你在底層可以用 ORM, 也可以用 SQL 語法, 或是任何你想用的方式, 只要 DAO 這層沒變, 外面的程式就都不用變
就算是一个应用中采用了ORM框架,也是需要DAO层的。只不过采用ORM后,DAO是跟ORM框架打交道,再由ORM跟数据库打交道;而没有采用,就是DAO层直接访问数据库。
應該沒說反吧。
ORM是把資料庫更進一步封裝,將欄位映射成物件的屬性和方法。
再透過DAL中介,實際去操作資料庫。
不過剛剛看了一下他原文寫的,好像真的有點問題。
以我平常在用的Django ORM為例好了:
# ORM的映射
class Example(models.Model):
test = models.TextField()
# 實際操作資料庫
e = Example.objects.filter(test="test")
這樣的操作只要你設定好backend是啥就好,不用管你用啥資料庫,寫出來的code都一樣。
那filter這個函數一定背後是透過DAO去看你使用的backend,然後去得到相對應的SQL,送給資料庫。
所以我覺得應該是原文表達有點怪。
froce 原文的意思應該是 ORM 不能取代 DAO, 用了 ORM 你還是得在外頭加一層 DAO, 形成 DAO -> ORM -> DB 這樣的架構
他的文法用的比較奇怪, 但是我看確實是這個意思
喔,的確是我搞錯了。
DAO模式的範例:
https://openhome.cc/Gossip/CodeData/PythonTutorial/ObjectSerializationPy3.html
以上面為例,前面Example那邊是ORM,然後用filter這個DAO去操作資料庫。
不好意思,不知道我理解的對不對呢?
DAO類似一個框架、容器; ORM類似一門技術、物件,
其架構就像weiclin所說的 : DAO -> ORM -> DB
而ORM與DAO都可以對DB做操作,
只是要看自己的需求怎麼去規劃層級與應用?
要這樣說明也算對啦。
ORM認真來說,可以當物件或是協議。
你可以也將它視為一種工具。它的用處在於口語化及操作方便。
anniecat
DAO 實際上是用在系統設計上, 三層式架構的資料存取層(DAL), 是你想把資料保存的細節做抽象化隱藏起來, 讓架構簡單清楚用的
ORM 就是那個要被隱藏起來的細節, 在 DAL 底下到底是用什麼方式存取資料庫的, 甚至到底有沒有用資料庫? 還是只用個 csv 檔在存? 甚至是透過雲端存到 AWS 去了? 實作的細節全部都藏在 DAL 裡面, 你在寫 DAL 以外的部份時完全不用考慮, 只要知道呼叫 DAL 它就會萬事處理好就行
所以這兩者一個是系統設計層面的東西, 另一個是操作資料庫的一種風格或工具, 你只要想想 DAO 底下不一定是關聯式資料庫, 而 ORM 則(實務上)是為資料庫操作用的, 大概會清楚一點
參考: https://stackoverflow.com/questions/8060742/is-a-dao-only-meant-to-access-databases
現在已有初步了解,之後在實作時應該會更清楚,謝謝大家的幫忙~
資料存取物件(data access object,DAO)是為某種類型的資料庫或其他永續性機制提供一個抽象介面的物件
物件關聯對映(英語:Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程式設計技術,用於實現物件導向程式語言裡不同類型系統的資料之間的轉換