天天看點

.NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了

寫在前面

上篇文章我們講了如在在實際項目開發中使用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”的分支,如下所示:
    .NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了
  3. 使用vs2017建立一個新的項目,名稱為“Sample05” 位置位于我們目前的目錄,如下圖所示:
    .NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了
  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包吧,這裡就不過多介紹了。
    .NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了

實戰示範

  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. 執行下代碼檢視到控制台輸出如下的結果:
    .NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了
    然後到資料庫檢視下表中的資料如下:
    .NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了
  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}條資料!");
                }
            }
               
    .NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了
    然後去資料庫裡檢視,發現主鍵為2,3,4的資料都已經被删除了,如下圖所示:
    .NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了
  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}條資料!");
                }
            }
               
    現在我們執行下測試代碼看下結果吧
    .NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了
    再到資料庫中檢視下資料,上步驟5中最後一張圖相比較
    .NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了
  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 id=@id";
                    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<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 id=@id;
    select * from comment where content_id=@id;";
                    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()}");
                    }
    
                }
            }
               
    結果如下所示,調試的代碼沒法截圖我也很無奈。
    .NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了

GitHub源碼

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

總結

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

作者:依樂祝(祝雷)

出處:https://www.cnblogs.com/yilezhu

聯系:[email protected] .NET Core實戰項目交流群:637326624 微信:jkingzhu

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如有問題或建議,請多多賜教,非常感謝。

.NET Core實戰項目之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了

繼續閱讀