C#的Dapper使用

2021-03-01 新閣Net社群

摘要

ORM(Object Relation Mappin)

從字面理解,O是Object,對象;R是Relation,關係;M是Mapping,映射。所以,用一句話概括就是:ORM是一種對象關係映射的技術。

我們平時所使用的大多數編程模型都是面向對象編程,就是把我們研究的問題抽象出來分解成一個個對象,對象有屬性,方法等等,我們操作的是對象。比如一個學生就是一個對象,他有身高,體重等屬性,還有高數書這個屬性,高數書本身又是一個對象,高數書有價格,作者,主人等,該學生還有跑步,學習等方法。
我們可以操作學生跑步,可以操作學生學習,可以操作學生再買一本英語書等等。我們還可以對學生的屬性高數書這個對象操作,例如把他丟棄。所以,我們操作的是對象,這就是面向對象編程。
而我們平時所使用的資料庫是關係型資料庫,他是從集合論等數學知識發展過來的,他講究集合,映射,六大範式等等,跟我們的面向對象思想的封裝繼承多態不同,這兩者之間有著根本性的差異。
所以我們就存在一個問題,怎麼去調和二者,如果能有一種技術把對象與資料庫對應起來,我們編程就會方便許多。於是,ORM應運而生,他就是為了解決對象與資料庫之間的差異所產生的一門技術,用他可以把對象與資料庫建立一種映射,對於業務層的程式設計師,他不用管資料庫的結構,他只需要專注於他的業務邏輯去操作對象。至於對象怎麼去變成元組進入資料庫,以及怎麼從資料庫取數據變成對象,那是ORM自動解決的。

既然ORM這麼方便,我們該怎麼去使用呢?其實每種語言,都有自己的ORM,各種ORM層出不窮,許多程式設計師還喜歡自己去寫一個ORM,這裡哈希君只介紹C#下的Dapper框架。
在介紹Dapper之前,哈希君想跟大家討論一下適配層的概念,以期更好理解這個框架。

適配層

我們先來看看一臺計算機,他的最底層是硬體,然後在這之上加了一層作業系統,作業系統負責對硬體的抽象和對資源的管理。這樣,無論我們的CPU是什麼架構的,網卡是什麼廠商的,內存條是多大的,只要有了作業系統,他就可以把這些硬體全部抽象和管理出來,向上提供一個統一的接口,我們應用層就無需管硬體了,只需要專注於接口就行了。所以這裡作業系統就充當了一個適配層的概念,他把底下各種亂七八糟不同的硬體全部適配出來給應用層提供一個統一的接口,我們只要調這個接口就可以操作硬體了,而不用管這個硬體是怎麼樣的,是不是方便多了。
同樣,瀏覽器也是一個適配層。無論你是Windows也好,Linux也好,筆記本也好,手機也好,瀏覽器把他們全部適配出來,這樣網站就不用管這些細節了,他只需要專注於他的網站內容,至於怎麼渲染是瀏覽器的事情,瀏覽器會自動去適配的。所以瀏覽器又是各種作業系統的適配層。
那麼,我們的Dapper也是一個適配層,他可以把錯綜複雜,恩怨糾葛的帶有各種約束的資料庫表抽象出來,向上提供一個統一的接口,對於程式設計師來說,只需要專注於業務邏輯即可。

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,這樣我們所需要的所有信息就有了。


相關焦點

  • C#和.NET向JAVA好轉嗎?
    不過也有一些差別,不過不多,稍微習慣下就好了,比如:集合:兩種語言都有集合ArrayList,還有通過鍵訪問值的Java中是HashMap而c#中是HashTable。c#比Java多泛型集合List<T>與Dictionary<K,V>更容易了,無需拆箱裝箱了,更安全了。
  • 中文語音識別技術在c#中的應用(二)
    正在閱讀:中文語音識別技術在c#中的應用(二)中文語音識別技術在c#中的應用(二)2004-06-11 10:04出處:CSDN作者:tashanzhishi>  接上篇《中文語音識別技術在c#中的應用(一)》………但是,這個方法本身並不知道你給的字符串是什麼語言,所以需要我們它這個字符串用什麼語言讀出。
  • c#.net多線程編程教學(3):線程同步
    正在閱讀:c#.net多線程編程教學(3):線程同步c#.net多線程編程教學(3):線程同步2005-07-07 10:44出處:作者:c-sharpcorner  考慮一種我們經常遇到的情況:有一些全局變量和共享的類變量,我們需要從不同的線程來更新它們,可以通過使用System.Threading.Interlocked類完成這樣的任務,它提供了原子的,非模塊化的整數更新操作。  還有你可以使用System.Threading.Monitor類鎖定對象的方法的一段代碼,使其暫時不能被別的線程訪問。
  • [譯]ASP.NET Core Web API 中使用Oracle資料庫和Dapper看這篇就夠了
    甚至關於ASP.NET Core Web API中使用Dapper+Mysql組合的文章都很少,更別提Oracel+Dapper組合的文章了,那麼今天就帶著大家一起翻譯一篇國外大牛寫的關於ASP.NET Core Web API 開發中使用Oracle+Dapper的組合的文章吧。
  • 5個最優秀的Java和C#代碼轉換工具
    【IT168 技術】毋庸置疑,Java 是一門最受歡迎而且使用最廣泛的程式語言,目前有超過 9 百萬的 Java 開發者從事 web 服務的開發,Java 以「編寫一次,可在任何地方運行」而著稱,同時這也是其大受歡迎的主要原因。
  • Dapper: 大規模分布式系統鏈路追蹤基礎設施
    這些應用可能是由不同團隊使用不同程式語言開發的軟體模塊集合構建的,並且可能跨越數千臺計算機及多個物理設備。在這樣的環境中,有一個幫助理解系統行為和關於性能問題推理的工具顯得非常寶貴。使用自適應採樣有助於使系統變得具有可擴展並降低性能損耗。
  • 使用open-webkit-sharp打開報表頁面,實現js腳本對C 代碼的調用
    書接上回由於使用的帆軟設計器的版本較低,所以在對圖表設置了圖標縮放功能後,IE瀏覽器並不支持,所以為了兼容處理,替換為使用webkit的谷歌內核打開帆軟報表。下載open-webkit-sharp資源,然後將Cores文件夾和References文件夾下的所有文件拷貝到項目所在路徑下,然後把Binary文件夾析的文件全部拷貝到項目所在路徑下(如果使用的是Framework2.0的框架則複製Binary NET2下面的文件)。
  • 如何使用 C# 中的 HashSet
    www.infoworld.com/article/3586972/how-to-use-hashset-in-csharp.htmlHashSet 是一個優化過的無序集合,提供對元素的高速查找和高性能的set集合操作,而且 HashSet 是在 .NET 3.5 中被引入的,在 System.Collection.Generic 命名空間下,這篇就來討論一下如何使用這個
  • [譯]聊聊C#中的泛型的使用
    通過使用Test的定義,只能向集合添加整型類型的數據。當使用foreach語句讀取ArrayList中的值時,將發生拆箱。代替使用對象類型,TestClass類的泛型類型被定義為int,因此在從編譯器動態生成的類中將使用int類型。
  • 如何在 C#8 中使用 GUID
    本質上來說,GUID就是一串很長的編號,這串編號從數學角度能夠保證不僅僅在一個系統中是唯一的,而且在多系統甚至跨系統之間都是唯一的,這篇文章我們就來討論一下為什麼需要GUID,以及如何在 C#8 中使用 GUID。
  • Dapper Dan
    NuGet安裝 Dapper /// 2. using 就可以使用下面例子 string sql = "SELECT SNAME,SUSER,SDATE,SFLAG,SNUM,CST1,CST2 FROM IIDBSYN"; string connstring = C...
  • Epic執行長希望更多開發者公平使用「特殊待遇」
    #Epic#Epic 執行長 Tim Sweeney 對此事發布了不同的看法,Tim Sweeney 表示,他確實要求蘋果公司允許 Epic 的商店在 iOS 上可以正常使用,這是一項特殊待遇,同時他還表示,希望蘋果公司可以讓更多的開發者公平地使用這項功能,這和之前蘋果高級副總裁 Phil Schiller 先前所說的剛好相反。
  • C#知識點講解之C#delegate、event、Action、EventHandler的使用和區別
    今天來講一講《C#delegate、event、Action、EventHandler的使用和區別》目錄所以,event應運而生
  • C#中ref和out的使用小結
    首頁 > 語言 > 關鍵詞 > 最新資訊 > 正文 C#中ref和out的使用小結
  • C#中使用Bogus創建模擬數據
    原文:CREATING SAMPLE DATA FOR C#[1] 作者:Bruno Sonnino 譯文:C#中使用
  • 使用C#的後端Web API:循序漸進教程
    如何在VS中創建基於.NET的後端應用程式,該應用程式使用C#語言從Web API中提取。讓我們開始吧!為伺服器後端邏輯選擇語言的問題是幾乎每個開發人員最重要的問題之一,特別是對於初學者。除了這些語言的語法特徵外,還有許多其他問題/問題,例如擴展的可能性,不同類型資料庫的使用,高學習曲線,容錯要求,大量數據等等。上。哪種語言最受歡迎?你應該使用哪一個?也許有人會推薦PHP,它具有豐富的功能和較低的學習曲線。然而,事實仍然是現在最常用的語言是Java和.NET。
  • Unity中的協同程序-使用Promise進行封裝(二)
    Javascript API中的大多數異步操作在完成工作的時候會返回一個回調函數作為結果(用c#術語來表示的話:就是一個Action的委託)。你可以顯式地為那些異步操作提供一個函數,但遵循這些異步代碼的規則使用匿名函數實現回調會容易許多。理論上它似乎是我們的協同程序的一個像樣的升級版本。讓我們試著舉出一個如何在C #程序中做這個事情的例子: