寫在前面

上篇文章我們講了如在在實際專案開發中使用Git來進行程式碼的版本控制,當然介紹的都是比較常用的功能。今天我再帶著大家一起熟悉下一個ORM框架Dapper,例項程式碼的演示編寫完成後我會通過Git命令上傳到GitHub上,正好大家可以再次熟悉下Git命令的使用,來鞏固上篇文章的知識。本篇文章已經收入.NET Core實戰專案之CMS 第一章 入門篇-開篇及總體規劃 有興趣的朋友可以加入.NET Core專案實戰交流群637326624 進行交流。

作者:依樂祝

原文地址:https://www.cnblogs.com/yilezhu/p/10024091.html

Dapper是什麼

Dapper是.NET下一個輕量級的ORM框架,它和Entity Framework或Nhibnate不同,屬於輕量級的,並且是半自動的。也就是說實體類都要自己寫。它沒有複雜的配置檔案,一個單檔案就可以了。Dapper通過擴充套件你的IDbConnection來進行工作的。如果你想了解更多內容的話請點選這裡

Dapper快速入門

前面幾篇文章我們進行介紹的時候都是手動在程式碼裡面建立的模擬資料,這篇文章我們就結合Dapper來從資料庫進行相關的操作。為了演示的方便,這裡的例項程式碼我們就使用一個簡單地asp.net core控制檯程式來進行。

開始前的準備

  1. 在我們的專案資料夾,單擊滑鼠右鍵選擇“在當前資料夾下面開啟Git Bash”

  2. 然後輸入git checkout Master 切換回Mater分支,然後輸入git checkout -b Sample05 建立一個新的名為“Sample05”的分支,如下所示:

    1543242325029

  3. 使用vs2017建立一個新的專案,名稱為“Sample05” 位置位於我們當前的目錄,如下圖所示:

    1543242490572

  4. 接下來開啟資料庫,新建一個Content內容表,表結構還沿用之前教程中的實體,這裡只給出MSSql的指令碼:至於MySql的你自己建了,如果你實在不會的話可以到群裡問其他小夥伴要吧

    CREATE TABLE [dbo].[content](
     [id] [int] IDENTITY(1,1) NOT NULL,
     [title] [nvarchar](50) NOT NULL,
     [content] [nvarchar](max) NOT NULL,
     [status] [int] NOT NULL,
     [add_time] [datetime] NOT NULL,
     [modify_time] [datetime] NULL,
     CONSTRAINT [PK_Content] PRIMARY KEY CLUSTERED 
    (
     [id] 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
    
    ALTER TABLE [dbo].[content] ADD  CONSTRAINT [DF_Content_status]  DEFAULT ((1)) FOR [status]
    GO
    
    ALTER TABLE [dbo].[content] ADD  CONSTRAINT [DF_content_add_time]  DEFAULT (getdate()) FOR [add_time]
    GO
    
    CREATE TABLE [dbo].[comment](
     [id] [int] IDENTITY(1,1) NOT NULL,
     [content_id] [int] NOT NULL,
     [content] [nvarchar](512) NOT NULL,
     [add_time] [datetime] NOT NULL,
     CONSTRAINT [PK_comment] PRIMARY KEY CLUSTERED 
    (
     [id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[comment] ADD  CONSTRAINT [DF_comment_add_time]  DEFAULT (getdate()) FOR [add_time]
    GO
    
  5. 專案中新增資料庫表對應的實體物件,程式碼如下:

        public class Content
        {
            /// <summary>
            /// 主鍵
            /// </summary>
            public int id { get; set; }
    
            /// <summary>
            /// 標題
            /// </summary>
            public string title { get; set; }
            /// <summary>
            /// 內容
            /// </summary>
            public string content { get; set; }
            /// <summary>
            /// 狀態 1正常 0刪除
            /// </summary>
            public int status { get; set; }
            /// <summary>
            /// 建立時間
            /// </summary>
            public DateTime add_time { get; set; } = DateTime.Now;
            /// <summary>
            /// 修改時間
            /// </summary>
            public DateTime? modify_time { get; set; }
        }
    public class Comment
        {
            /// <summary>
            /// 主鍵
            /// </summary>
            public int id { get; set; }
            /// <summary>
            /// 文章id
            /// </summary>
            public int content_id { get; set; }
            /// <summary>
            /// 評論內容
            /// </summary>
            public string content { get; set; }
            /// <summary>
            /// 新增時間
            /// </summary>
            public DateTime add_time { get; set; } = DateTime.Now;
        }
  6. 專案中新增Dapper的Nugets包,相信一路看教程過來的你一定知道怎麼新增Nuget包吧,這裡就不過多介紹了。

    1543243792492

實戰演示

  1. 插入操作:將一個物件插入到資料庫中,程式碼如下:

     /// <summary>
            /// 測試插入單條資料
            /// </summary>
           static void test_insert()
            {
                var content = new Content
                {
                    title = "標題1",
                    content = "內容1",
    
                };
                using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
                {
                    string sql_insert = @"INSERT INTO [Content]
                    (title, [content], status, add_time, modify_time)
    VALUES   (@title,@content,@status,@add_time,@modify_time)";
                    var result = conn.Execute(sql_insert, content);
                    Console.WriteLine($"test_insert:插入了{result}條資料!");
                }
            }
  2. 一次批量插入多條資料,測試程式碼如下:

    /// <summary>
            /// 測試一次批量插入兩條資料
            /// </summary>
           static void test_mult_insert()
            {
                List<Content> contents = new List<Content>() {
                   new Content
                {
                    title = "批量插入標題1",
                    content = "批量插入內容1",
    
                },
                   new Content
                {
                    title = "批量插入標題2",
                    content = "批量插入內容2",
    
                },
            };
    
                using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
                {
                    string sql_insert = @"INSERT INTO [Content]
                    (title, [content], status, add_time, modify_time)
    VALUES   (@title,@content,@status,@add_time,@modify_time)";
                    var result = conn.Execute(sql_insert, contents);
                    Console.WriteLine($"test_mult_insert:插入了{result}條資料!");
                }
            }
  3. 執行下程式碼檢視到控制檯輸出如下的結果:

    1543246862147

    然後到資料庫查看下錶中的資料如下:

    1543246898729

  4. 下面我們再分別測試下刪除一條資料,與一次刪除多條資料吧,程式碼如下:

     /// <summary>
            /// 測試刪除單條資料
            /// </summary>
            static void test_del()
            {
                var content = new Content
                {
                    id = 2,
    
                };
                using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
                {
                    string sql_insert = @"DELETE FROM [Content]
    WHERE   (id = @id)";
                    var result = conn.Execute(sql_insert, content);
                    Console.WriteLine($"test_del:刪除了{result}條資料!");
                }
            }
    
            /// <summary>
            /// 測試一次批量刪除兩條資料
            /// </summary>
            static void test_mult_del()
            {
                List<Content> contents = new List<Content>() {
                   new Content
                {
                    id=3,
    
                },
                   new Content
                {
                    id=4,
    
                },
            };
    
                using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
                {
                    string sql_insert = @"DELETE FROM [Content]
    WHERE   (id = @id)";
                    var result = conn.Execute(sql_insert, contents);
                    Console.WriteLine($"test_mult_del:刪除了{result}條資料!");
                }
            }

    1543247418059

    然後去資料庫裡檢視,發現主鍵為2,3,4的資料都已經被刪除了,如下圖所示:

    1543247491525

  5. 下面我們再測試下修改吧,也是分別測試一次只修改一條資料(主鍵為5),與一次批量修改多條資料(主鍵為6,7)

    /// <summary>
            /// 測試修改單條資料
            /// </summary>
            static void test_update()
            {
                var content = new Content
                {
                    id = 5,
                    title = "標題5",
                    content = "內容5",
    
                };
                using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
                {
                    string sql_insert = @"UPDATE  [Content]
    SET         title = @title, [content] = @content, modify_time = GETDATE()
    WHERE   (id = @id)";
                    var result = conn.Execute(sql_insert, content);
                    Console.WriteLine($"test_update:修改了{result}條資料!");
                }
            }
    
            /// <summary>
            /// 測試一次批量修改多條資料
            /// </summary>
            static void test_mult_update()
            {
                List<Content> contents = new List<Content>() {
                   new Content
                {
                    id=6,
                    title = "批量修改標題6",
                    content = "批量修改內容6",
    
                },
                   new Content
                {
                    id =7,
                    title = "批量修改標題7",
                    content = "批量修改內容7",
    
                },
            };
    
                using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
                {
                    string sql_insert = @"UPDATE  [Content]
    SET         title = @title, [content] = @content, modify_time = GETDATE()
    WHERE   (id = @id)";
                    var result = conn.Execute(sql_insert, contents);
                    Console.WriteLine($"test_mult_update:修改了{result}條資料!");
                }
            }

    現在我們執行下測試程式碼看下結果吧

    1543248037237

    再到資料庫中檢視下資料,上步驟5中最後一張圖相比較

    1543248094960

  6. 增刪改都測試了,下面就開始測試查詢吧,我們分別來測試下查詢指定的資料以及一次查詢多條資料來看下結果吧。還是先上程式碼,:

     /// <summary>
            /// 查詢單條指定的資料
            /// </summary>
            static void test_select_one()
            {
                using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
                {
                    string sql_insert = @"select * from [dbo].[content] where [email protected]";
                    var result = conn.QueryFirstOrDefault<Content>(sql_insert, new { id=5});
                    Console.WriteLine($"test_select_one:查到的資料為:");
                }
            }
    
            /// <summary>
            /// 查詢多條指定的資料
            /// </summary>
            static void test_select_list()
            {
                using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
                {
                    string sql_insert = @"select * from [dbo].[content] where id in @ids";
                    var result = conn.Query<List<Content>>(sql_insert, new { ids=new int[] { 6,7} });
                    Console.WriteLine($"test_select_one:查到的資料為:");
                }
            }

    然後我們打上斷點然後去看下結果吧!這裡圖片我沒有截成功,所以就不貼了。

  7. 關聯查詢,Dapper的強大之處就在於其關聯查詢了!為了測試的方便,我們給主鍵為5的content新增兩個comment中,這個插入的程式碼就不貼出來了,留給大家自行書寫吧,如果不會的話可以加群問群裡的其他小夥伴吧。這裡需要新建一個類

    public class ContentWithCommnet
        {
            /// <summary>
            /// 主鍵
            /// </summary>
            public int id { get; set; }
    
            /// <summary>
            /// 標題
            /// </summary>
            public string title { get; set; }
            /// <summary>
            /// 內容
            /// </summary>
            public string content { get; set; }
            /// <summary>
            /// 狀態 1正常 0刪除
            /// </summary>
            public int status { get; set; }
            /// <summary>
            /// 建立時間
            /// </summary>
            public DateTime add_time { get; set; } = DateTime.Now;
            /// <summary>
            /// 修改時間
            /// </summary>
            public DateTime? modify_time { get; set; }
            /// <summary>
            /// 文章評論
            /// </summary>
            public IEnumerable<Comment> comments { get; set; }
        }

    然後就是測試程式碼,執行的查詢測試程式碼如下:查詢id為5的文章,文章是包含評論列表的

    程式碼如下:

    static void test_select_content_with_comment()
            {
                using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
                {
                    string sql_insert = @"select * from content where [email protected];
    select * from comment where [email protected];";
                    using (var result = conn.QueryMultiple(sql_insert, new { id = 5 }))
                    {
                        var content = result.ReadFirstOrDefault<ContentWithComment>();
                        content.comments = result.Read<Comment>();
                        Console.WriteLine($"test_select_content_with_comment:內容5的評論數量{content.comments.Count()}");
                    }
    
                }
            }

    結果如下所示,除錯的程式碼沒法截圖我也很無奈。

    1543251360510

    GitHub原始碼

    GitHub的測試原始碼已經上傳,https://github.com/yilezhu/Czar.Cms/tree/Sample05 放在Czar.Cms的Sample05分支上面。大家可以參考下,覺得有用的話記得star哦!

    總結

    本文給大家演示了Dapper的常用方法,不過都是通過同步的方式進行操作的,如果你想使用非同步的話可以自行進行測試。文中的大部分內容都有截圖,個別除錯無法截圖的大夥可以自行除錯檢視!相信通過本文的例項講解,大夥應該能夠使用dapper進行相應的開發!下一篇文章我們將進行vue的講解!當然也只是進行很淺層次的講解。因為我是一個後端,也是抱著學習的態度來進行vue的記錄的!主要是以快速上為主。

.