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

寫在前面

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

做者:依樂祝vue

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

Dapper是什麼

Dapper是.NET下一個輕量級的ORM框架,它和Entity Framework或Nhibnate不一樣,屬於輕量級的,而且是半自動的。也就是說實體類都要本身寫。它沒有複雜的配置文件,一個單文件就能夠了。Dapper經過擴展你的IDbConnection來進行工做的。若是你想了解更多內容的話請點擊這裏github

Dapper快速入門

前面幾篇文章咱們進行介紹的時候都是手動在代碼裏面建立的模擬數據,這篇文章咱們就結合Dapper來從數據庫進行相關的操做。爲了演示的方便,這裏的實例代碼咱們就使用一個簡單地asp.net core控制檯程序來進行。sql

開始前的準備

  1. 在咱們的項目文件夾,單擊鼠標右鍵選擇「在當前文件夾下面打開Git Bash」數據庫

  2. 而後輸入git checkout Master 切換回Mater分支,而後輸入git checkout -b Sample05 建立一個新的名爲「Sample05」的分支,以下所示:c#

    1543242325029

  3. 使用vs2017建立一個新的項目,名稱爲「Sample05」 位置位於咱們當前的目錄,以下圖所示:後端

    1543242490572

  4. 接下來打開數據庫,新建一個Content內容表,表結構還沿用以前教程中的實體,這裏只給出MSSql的腳本:至於MySql的你本身建了,若是你實在不會的話能夠到羣裏問其餘小夥伴要吧app

    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 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()}");
                    }
    
                }
            }

    結果以下所示,調試的代碼無法截圖我也很無奈。

    1543251360510

    GitHub源碼

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

    總結

    本文給你們演示了Dapper的經常使用方法,不過都是經過同步的方式進行操做的,若是你想使用異步的話能夠自行進行測試。文中的大部份內容都有截圖,個別調試沒法截圖的大夥能夠自行調試查看!相信經過本文的實例講解,大夥應該可以使用dapper進行相應的開發!下一篇文章咱們將進行vue的講解!固然也只是進行很淺層次的講解。由於我是一個後端,也是抱着學習的態度來進行vue的記錄的!主要是以快速上爲主。

相關文章
相關標籤/搜索