摘要
從字面理解,O是Object,對象;R是Relation,關係;M是Mapping,映射。所以,用一句話概括就是:ORM是一種對象關係映射的技術。
我們平時所使用的大多數編程模型都是面向對象編程,就是把我們研究的問題抽象出來分解成一個個對象,對象有屬性,方法等等,我們操作的是對象。比如一個學生就是一個對象,他有身高,體重等屬性,還有高數書這個屬性,高數書本身又是一個對象,高數書有價格,作者,主人等,該學生還有跑步,學習等方法。
我們可以操作學生跑步,可以操作學生學習,可以操作學生再買一本英語書等等。我們還可以對學生的屬性高數書這個對象操作,例如把他丟棄。所以,我們操作的是對象,這就是面向對象編程。
而我們平時所使用的資料庫是關係型資料庫,他是從集合論等數學知識發展過來的,他講究集合,映射,六大範式等等,跟我們的面向對象思想的封裝繼承多態不同,這兩者之間有著根本性的差異。
所以我們就存在一個問題,怎麼去調和二者,如果能有一種技術把對象與資料庫對應起來,我們編程就會方便許多。於是,ORM應運而生,他就是為了解決對象與資料庫之間的差異所產生的一門技術,用他可以把對象與資料庫建立一種映射,對於業務層的程式設計師,他不用管資料庫的結構,他只需要專注於他的業務邏輯去操作對象。至於對象怎麼去變成元組進入資料庫,以及怎麼從資料庫取數據變成對象,那是ORM自動解決的。
既然ORM這麼方便,我們該怎麼去使用呢?其實每種語言,都有自己的ORM,各種ORM層出不窮,許多程式設計師還喜歡自己去寫一個ORM,這裡哈希君只介紹C#下的Dapper框架。
在介紹Dapper之前,哈希君想跟大家討論一下適配層的概念,以期更好理解這個框架。
我們先來看看一臺計算機,他的最底層是硬體,然後在這之上加了一層作業系統,作業系統負責對硬體的抽象和對資源的管理。這樣,無論我們的CPU是什麼架構的,網卡是什麼廠商的,內存條是多大的,只要有了作業系統,他就可以把這些硬體全部抽象和管理出來,向上提供一個統一的接口,我們應用層就無需管硬體了,只需要專注於接口就行了。所以這裡作業系統就充當了一個適配層的概念,他把底下各種亂七八糟不同的硬體全部適配出來給應用層提供一個統一的接口,我們只要調這個接口就可以操作硬體了,而不用管這個硬體是怎麼樣的,是不是方便多了。
同樣,瀏覽器也是一個適配層。無論你是Windows也好,Linux也好,筆記本也好,手機也好,瀏覽器把他們全部適配出來,這樣網站就不用管這些細節了,他只需要專注於他的網站內容,至於怎麼渲染是瀏覽器的事情,瀏覽器會自動去適配的。所以瀏覽器又是各種作業系統的適配層。
那麼,我們的Dapper也是一個適配層,他可以把錯綜複雜,恩怨糾葛的帶有各種約束的資料庫表抽象出來,向上提供一個統一的接口,對於程式設計師來說,只需要專注於業務邏輯即可。
至此,終於到了本文的重點——Dapper,.NET下的一種ORM框架。
方法一:使用NuGet安裝
打開visual studio的項目,依次點擊工具,NuGet包管理器,管理解決方案的NuGet程序包;
再點擊瀏覽,搜索dapper,點擊搜索結果中的Dapper,勾選項目,選擇安裝;
在解決方案管理器中點擊項目,查看引用,如果有Dapper,說明安裝成功。
方法二:直接在官網[2]下載原始碼,加入項目。這種方法哈希君沒有試,不過可以參考連結Dapper快速學習
首先,我們在Model層寫一個Person類,他有ID,Name,Remark。
![(UBQ}]CQ32{{VW`1EGPJ5MQ.png](http://upload-images.jianshu.io/upload_images/4052700-01cbfcab5e889f51.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
同樣我們在資料庫也有一個Person表,包含id,name,remark三個欄位,其中id是主鍵自增。
而後我們在DAL層寫一個PersonDB類,提供對Person的基本訪問。connectionString是資料庫連接字符串,由配置文件讀取。
插入操作
將一個對象person插入資料庫的方法如圖。
插入代碼文本如下。@Name的意思是自動將person裡的Name值綁定上去。
批量插入:
刪除操作
修改操作
查詢操作
查詢的In操作
多語句操作
為此我們引入以下Book類,同樣在資料庫裡設置這個表。
Join操作
我們是面向對象編程,所以一個對象裡面會有許多其他子對象,這個子對象裡面又有其自己的子對象,這種關係在資料庫裡的表示就是外鍵。
比如我們有一本書book,它有主人person,book是一個對象,主人又是一個對象。
我們自然想要一個方法把資料庫裡複雜的外鍵關係轉成我們需要的對象BookWithPerson,所有我們需要的信息都存在裡面,取數據的時候只要找這個對象取數據就行了,比如我們需要一本書的主人的姓名,我們只需要bookWithPerson.Pers.Name。如果是一對多的關係我們用數組,如果是多對多我們加一層mapping。
現在我們想根據書的ID查詢書的信息,包括主人信息。那麼
其中,Query的三個泛型參數分別是委託回調類型1,委託回調類型2,返回類型。形參的三個參數分別是sql語句,map委託,對象參數。所以整句的意思是先根據sql語句查詢;同時把查詢的person信息賦值給bookWithPerson.Pers,並且返回bookWithPerson;book是對象參數,提供參數綁定的值。
最終整個方法返回BookWithPerson,這樣我們所需要的所有信息就有了。