ORM之輕量級框架--Dapper

来源:https://www.cnblogs.com/Erhao/archive/2018/11/30/10042808.html
-Advertisement-
Play Games

一、什麼是Dapper? Dapper是一款輕量級Orm框架,它是屬於半自動的,它和Entity Framework和NHibernate不同,它只有一個單文件,沒有很複雜的配置,如果你喜歡原生Sql語句,而且又是喜歡Orm框架,那麼Dapper對於你來說是再適合不過了。 二、Dapper優點我也是 ...


一、什麼是Dapper?

Dapper是一款輕量級Orm框架,它是屬於半自動的,它和Entity Framework和NHibernate不同,它只有一個單文件,沒有很複雜的配置,如果你喜歡原生Sql語句,而且又是喜歡Orm框架,那麼Dapper對於你來說是再適合不過了。

二、Dapper優點
我也是剛開始學習Dapper,讓我自己去總結它的優點,可能也就還沒真正去體驗到帶來的好。所以我也是抱著學習的態度,去參考一些大佬給它總結的優點:

1、輕量級、單文件。
2、支持多數據,而且性能優越。

3、Dapper原理通過Emit反射IDataReader的序列隊列,來快速的得到和產生對象。

三、例子演示

下麵我們通過一個簡單的例子來學習Dapper。

1、我們通過VS2017 創建一個控制台程式來進行我們的學習,首先我們創建一個項目,命名為DapperTest。

2、首先我們先建立一張UserInfo表,我使用的是Sql Server創建。

CREATE TABLE [dbo].[UserInfo](
[uID] [int] NOT NULL,
[uLoginName] [nvarchar](60) NULL,
[uLoginPWD] [nvarchar](60) NULL,
[uRealName] [nvarchar](60) NULL,
[uStatus] [int] NOT NULL,
[uRemark] [nvarchar](max) NULL,
[uCreateTime] [datetime] NOT NULL,
CONSTRAINT [PK_dbo.sysUserInfo] PRIMARY KEY CLUSTERED 
(
[uID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

3、接下來我們創建一個數據表對應的實體對象。

 public class UserInfo
    {
        //uID, uLoginName, uLoginPWD, uRealName, uStatus, uRemark, uCreateTime
       /// <summary>
       /// 主鍵
       /// </summary>
        public int uID { get; set; }
        /// <summary>
        /// 用戶名
        /// </summary>
        public string uLoginName { get; set; }
        /// <summary>
        /// 密碼
        /// </summary>
        public string uLoginPWD { get; set; }
        /// <summary>
        /// 真實名字
        /// </summary>
        public string uRealName { get; set; }
        /// <summary>
        /// 狀態,0表示正常,1表示刪除
        /// </summary>
        public int uStatus { get; set; }
        /// <summary>
        /// 備註
        /// </summary>
        public string uRemark { get; set; }
        /// <summary>
        /// 創建時間
        /// </summary>
        public DateTime uCreateTime { get; set; }
    }

3、我們需要在我們項目中添加Dapper  Nuget包,然後點擊安裝就可以了。

4、我們需要編寫一個增刪查改幫助類,大家也可以不用按照我那樣。(我是為了不要把那些操作資料庫和業務邏輯代碼全部放到一起)

public class DapperHelper
    {

}

5.1新增,插入一條數據。

先看DapperHelper中代碼:
 string sqlConnstr= "Data Source=.;Initial Catalog=TestDb;User Id=sa;Password=123";
        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public int UserInsert(UserInfo user)
        {
            using (var db=new SqlConnection(sqlConnstr))
            {
                //uID, uLoginName, uLoginPWD, uRealName, uStatus, uRemark, uCreateTime
                string query = "INSERT INTO USERINFO VALUES(@uLoginName, @uLoginPWD, @uRealName, @uStatus, @uRemark, @uCreateTime)";
                return db.Execute(query, user);
            }
        }

接下來我們來看看調用代碼和調用結果。

  #region 1.0插入數據
            UserInfo user = new UserInfo
            {
                uLoginName = "xiaoxiao",
                uLoginPWD = "123",
                uStatus = 0,
                uRealName = "小小",
                uRemark = "Test01",
                uCreateTime = DateTime.Now
            };
            DapperHelper helper = new DapperHelper();
            int i = helper.UserInsert(user);
            if (i > 0)
            {
                Console.WriteLine("插入成功");
            }
            Console.ReadLine();
            #endregion

上面兩張圖中已經顯示我們數據插入成功,接著我們來看看插入多條數據。

5.2批量插入

先看DapperHelper中代碼:
 /// <summary>
        /// 批量插入數據
        /// </summary>
        /// <param name="ulist"></param>
        /// <returns></returns>
        public int MultInsertUser(List<UserInfo> ulist)
        {
            using (var db = new SqlConnection(sqlConnstr))
            {
                string query = "INSERT INTO USERINFO VALUES(@uLoginName, @uLoginPWD, @uRealName, @uStatus, @uRemark, @uCreateTime)";
                return db.Execute(query,ulist);
            }
        }

接著我們來看看調用的代碼

 #region 2.0批量插入
            List<UserInfo> ulist = new List<UserInfo> {
                new UserInfo(){uLoginName = "xiaohu", uLoginPWD = "555",uStatus = 0 ,uRealName = "小虎", uRemark = "Test01",uCreateTime = DateTime.Now},
                new UserInfo(){uLoginName = "yangyang", uLoginPWD = "888",uStatus = 0 ,uRealName = "楊楊", uRemark = "Test01",uCreateTime = DateTime.Now},
            };
            DapperHelper helper = new DapperHelper();
            int i = helper.MultInsertUser(ulist);
            if (i > 0)
            {
                Console.WriteLine("批量數據插入成功");
            }
            Console.ReadLine();
            #endregion

接著我們來看看執行結果和資料庫中的結果:

5.3接著我們來看看刪除一條數據

先看DapperHelper中代碼:
  /// <summary>
        /// 刪除
        /// </summary>
        /// <param name="Uid"></param>
        /// <returns></returns>
        public int UserDelete(int Uid)
        {
            using (var db=new SqlConnection(sqlConnstr))
            {
                string query = "DELETE  USERINFO WHERE uID=@Uid";
                var param = new DynamicParameters();
                param.Add("Uid", Uid);
                return db.Execute(query,param);

            }
        }

接著看看調用代碼:

    #region 3.0刪除數據
            DapperHelper helper = new DapperHelper();
            int uid = 7;
            int i = helper.UserDelete(uid);
            if (i > 0)
            {
                Console.WriteLine("刪除成功");
            }
            Console.ReadLine();
            #endregion

執行結果和資料庫中數據如下:

我們可以從資料庫中看到uID=7的數據已經被刪除。

5.4接著我們來看看批量刪除操作:

先看DapperHelper中代碼:
  public int MultDeleteUser(List<UserInfo> ulist)
        {
            using (var db=new SqlConnection(sqlConnstr))
            {
                string query = "DELETE  USERINFO WHERE uID=@Uid";
                return db.Execute(query, ulist);
            }
        }

接著看看調用代碼:

 List<UserInfo> ulist = new List<UserInfo> {
                new UserInfo(){uID=8},
                new UserInfo(){uID=9},
            };
            DapperHelper helper = new DapperHelper();
            int i = helper.MultDeleteUser(ulist);
            if (i > 0)
            {
                Console.WriteLine("批量刪除成功");
            }
            Console.ReadLine();

我們可以從資料庫截圖中看到uID=8和uID=9的數據已經被刪除。

5.5接下來我們來看看修改的操作。

先看DapperHelper代碼

 public int UserUpdate(UserInfo user)
        {
            //uID, uLoginName, uLoginPWD, uRealName, uStatus, uRemark, uCreateTime
            using (var db=new SqlConnection(sqlConnstr))
            {
                string query= "UPDATE USERINFO SET uLoginName=@uLoginName,uLoginPWD=@uLoginPWD,uRealName=@uRealName,uStatus=@uStatus,uRemark=@uRemark,uCreateTime=@uCreateTime WHERE uID=@uID";return db.Execute(query, user);
            }
        }

接下來看看調用代碼:

UserInfo user = new UserInfo
{
uID = 2,
uLoginName = "xiaomogu",
uLoginPWD = "555555",
uStatus = 0,
uRealName = "蘑菇",
uRemark = "測試",
uCreateTime = DateTime.Now
};
DapperHelper helper = new DapperHelper();
int i = helper.UserUpdate(user);
if (i > 0)
{
Console.WriteLine("修改成功");
}
Console.ReadLine();

從資料庫圖中我們已經可以看到我們已經將uID=2的數據修改成功。

5.6接下來我們來看看查詢所有數據操作。

先看DapperHelper代碼

 public List<UserInfo> GetAll()
        {
            using (var db = new SqlConnection(sqlConnstr))
            {
                string query = "SELECT * FROM USERINFO";
                return db.Query<UserInfo>(query).ToList();

            }
        }

接著我們來看看調用的代碼和執行結果:

 DapperHelper helper = new DapperHelper();
            var list = helper.GetAll();
            foreach (var item in list)
            {
                Console.WriteLine("用戶名:{0},密碼:{1}", item.uLoginName, item.uLoginPWD);
            }
            Console.ReadLine();

5.7最後我們來看看查詢多條指定數據的操作:

先看看DapperHelper代碼:

  /// <summary>
        /// 查詢多條指定的數據
        /// </summary>
        /// <param name="uids">查詢條件</param>
        /// <returns></returns>
        public List<UserInfo> GetAllIn(int[] uids)
        {
            using (var db=new SqlConnection(sqlConnstr))
            {
                string query = "SELECT * FROM USERINFO WHERE uID IN @uids";
                return db.Query<UserInfo>(query, new { uids= uids }).ToList();
            }
        }

接著我們來看看調用代碼和執行結果。

 int[] ids = new int[] { 10, 11 };
            DapperHelper helper = new DapperHelper();
            var list = helper.GetAllIn(ids);
            foreach (var item in list)
            {
                Console.WriteLine("用戶名:{0},密碼:{1}", item.uLoginName, item.uLoginPWD);
            }
            Console.ReadLine();

四、源碼

源碼我已經放到了Github上面了,大家有興趣可以去看看,地址是:https://github.com/xiaoerhao/DapperTest

五、感受

終於寫完了,這是我第一次認真去寫一篇博客,終於跨出了這一小步,大概花了四個多小時,不過我覺得挺值得的。主要也是為了記錄一些自己的所學所收穫的東西分享給大家,和大家更好的交流,相互進步,由於自己的能力和水平有限,所以有些地方理解的不夠透徹,寫出來的東西或許達不到大家的期許,希望大家能夠理解和鼓勵,不過我的初衷就是希望一些剛上手Dapper的新手更好的入門和把自己所學的東西歸納總結,如果能夠幫到大家最好。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄:一個.NET網站的成長歷程 在個人的日常工作和學習中,接觸到不少的項目,這些項目結構大同小異,其結構的核心思想無外乎“分層“。 分層?從字面上理解,看似簡單,實則不然。這需要從多個維度去看待這個問題。最為直接的就是根據項目的類型進行劃分,繼而根據這個類型再對其職責進行劃分。 當然,這僅僅是個人 ...
  • 因為自己的開發環境是 Mac + Rider 組合,想測試網路編程相關內容。想在Windows 虛擬機上運行一套代碼來與Mac 機進行測試,但又不想在虛擬機上安裝一套開發環境。最終找到的解決方案是通過 csc 命令將需要測試的代碼 exe 可執行程式,然後再複製到 Windows 虛擬機上執行。具體 ...
  • 引言: 時光匆匆,如白駒過隙,又一次來到了這個節點,迴首逝去的日子,有收穫也有遺憾... 年底的日子總是那麼悠閑,趁著這些悠閑的時光,整理一下自己平時在工作中的收穫。 之所以取這個標題呢一來是為了讓自己在寫博客的時候不讓自己跑偏,二來呢是準備就著這個主題寫一個與主題相關的博客系列。 目錄: 項目結構 ...
  • 比如,自定義協議名稱為 myapp,要啟動的本地程式為 myapp.exe。 1)首先向註冊表添加如下內容: 2)用 VS 寫一個本地程式 myapp.exe。我這裡寫的是一個WPF程式: 3)在 web 頁面啟動 myapp.exe 4) 在瀏覽器地址欄錄入 myapp://openAppTest ...
  • AdminLTE 一個基於 bootstrap 的輕量級後臺模板,這個前端界面個人感覺很清爽,對於一個大後端的我來說,可以減少較多的時間去承擔前端的工作但又必須去獨立去完成一個後臺系統開發的任務,並且,文檔還算比較齊全,對著demo可以完成一個基本的前端框架搭建了。大家如有更為好看的又方便後端上手的 ...
  • 搞了一天多,才勉強搞出了一個不緊湊的六邊形統計圖,是真的菜。 這裡ECharts的用法與06說的同一種,直接使用帶all的js 先上個效果圖,用面積來表示人數的多少 1. 參數option的tooltip和title還是一樣設置 2. 還有一個grid,這是用來設置y軸的實際長度的。(我把y軸隱藏了 ...
  • 在C#中 JArray japroimg = new JArray(); strproimg.ToString();這樣會導致tostring之後的字元串中會有大量的空格 使用 japroimg.ToString(Newtonsoft.Json.Formatting.None, null);的fom ...
  • ef開發模式有3種:DateBase First(資料庫優先)、Model First(模型優先)和Code First(代碼優先)。這裡我用的是code first 一個簡單的例子: 簡單介紹一下Database.SetInitializer方法 一:資料庫不存在時重新創建資料庫 Database ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...