1. 程式人生 > >.NET Core實戰專案之CMS 第五章 入門篇-Dapper的快速入門看這篇就夠了

.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”的分支,如下所示:

    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的記錄的!主要是以快速上為主。

相關推薦

.NET Core實戰專案CMS 入門-Dapper快速入門

寫在前面 上篇文章我們講了如在在實際專案開發中使用Git來進行程式碼的版本控制,當然介紹的都是比較常用的功能。今天我再帶著大家一起熟悉下一個ORM框架Dapper,例項程式碼的演示編寫完成後我會通過Git命令上傳到GitHub上,正好大家可以再次熟悉下Git命令的使用,來鞏固上篇文章的知識。本篇文章已經收入.

.NET Core實戰專案CMS 入門-原始碼解析配置檔案及依賴注入

作者:依樂祝 原文連結:https://www.cnblogs.com/yilezhu/p/9998021.html 寫在前面 上篇文章我給大家講解了ASP.NET Core的概念及為什麼使用它,接著帶著你一步一步的配置了.NET Core的開發環境並建立了一個ASP.NET Core的mvc專

.NET Core實戰專案CMS 入門-Git的快速入門實戰演練

寫在前面 上篇文章我帶著大家通過分析了一遍ASP.NET Core的原始碼瞭解了它的啟動過程,然後又帶著大家熟悉了一遍配置檔案的載入方式,最後引出了依賴注入以及控制反轉的概念!如果大家把前面幾張都理解了,那麼你也就入了ASP.NET Core的大門了。但是我們還需要一個版本控制工具來提高我們的編碼效率。因此

.NET Core實戰專案CMS 設計-系統開發框架設計

這兩天比較忙,週末也在加班,所以更新的就慢了一點,不過沒關係,今天我們就進行千呼萬喚的系統開發框架的設計。不知道上篇關於架構設計的文章大家有沒有閱讀,如果閱讀後相信一定對架構設計有了更近一部的理解,如果你沒有閱讀也希望大家能好好閱讀一下!其實說白了,架構是為了應對軟體系統複雜度而提出的一個解決方案,架構設計的

.NET Core實戰專案CMS 設計-內容管理極簡設計全過程

原文: .NET Core實戰專案之CMS 第八章 設計篇-內容管理極簡設計全過程 寫在前面 上一篇文章中我帶著大家進行了許可權部分的極簡設計,也僅僅是一個基本的許可權設計。不過你完全可以基於這套許可權系統設計你的更復雜的許可權系統,當然更復雜的許可權系統要根據你的業務來進行,因為任何脫離實際業務的許可權

.NET Core實戰專案CMS 設計-白話架構設計

原文: .NET Core實戰專案之CMS 第九章 設計篇-白話架構設計 前面兩篇文章給大家介紹了我們實戰的CMS系統的資料庫設計,原始碼也已經上傳到伺服器上了。今天我們就好聊聊架構設計,在開始之前先給大家分享一下這幾天我一直在聽的《從零開始學架構》裡面關於架構設計的定義以及架構設計的三大原則,希望能對大家

.NET Core實戰專案CMS 入門-Vue的快速入門及其使用

原文: .NET Core實戰專案之CMS 第六章 入門篇-Vue的快速入門及其使用 寫在前面 上面文章我給大家介紹了Dapper這個ORM框架的簡單使用,大夥會用了嘛!本來今天這篇文章是要講Vue的快速入門的,原因是想在後面的文章中使用Vue進行這個CMS系統的後臺管理介面的實現。但是奈何Vue實現的S

.NET Core實戰專案CMS 十三 開發-在MVC專案結構介紹及應用第三方UI

原文: .NET Core實戰專案之CMS 第十三章 開發篇-在MVC專案結構介紹及應用第三方UI 作為後端開發的我來說,前端表示真心玩不轉,你如果讓我微調一個位置的樣式的話還行,但是讓我寫一個很漂亮的後臺的話,真心做不到,所以我一般會選擇套用一些開源UI模板來進行系統UI的設計。那如何套用呢?今天就以我們

.NET Core實戰專案CMS 各層聯動工作實現增刪改查業務

原文: .NET Core實戰專案之CMS 第十五章 各層聯動工作實現增刪改查業務 連著兩天更新敘述性的文章大家可別以為我轉行了!哈哈!今天就繼續講講我們的.NET Core實戰專案之CMS系統的教程吧!這個系列教程拖得太久了,所以今天我就以選單部分的增刪改查為例來講述下我的專案分層之間的協同工作吧!如果你

.NET Core實戰專案CMS 十一 開發-資料庫生成及實體程式碼生成器開發

上篇給大家從零開始搭建了一個我們的ASP.NET Core CMS系統的開發框架,具體為什麼那樣設計我也已經在第十篇文章中進行了說明。不過文章釋出後很多人都說了這樣的分層不是很合理,什麼資料庫實體應該跟倉儲放在一起形成領域物件,什麼ViewModel應該放在應用層結構倉儲層與UI層。其實我想

.NET Core實戰專案CMS 十二 開發-Dapper封裝GURD及倉儲程式碼生成器實現

本篇我將帶著大家一起來對Dapper進行下封裝並實現基本的增刪改查、分頁操作的同步非同步方法的實現(已實現MSSQL,MySql,PgSQL)。同時我們再實現一下倉儲層的程式碼生成器,這樣的話,我們只需要結合業務來實現具體的業務部分的程式碼就可以了,可以大大減少我們重複而又繁瑣的增刪改查操作,多留點時間給生活

.NET Core實戰專案CMS 十二 開發-Dapper封裝CURD及倉儲程式碼生成器實現

本篇我將帶著大家一起來對Dapper進行下封裝並實現基本的增刪改查、分頁操作的同步非同步方法的實現(已實現MSSQL,MySql,PgSQL)。同時我們再實現一下倉儲層的程式碼生成器,這樣的話,我們只需要結合業務來實現具體的業務部分的程式碼就可以了,可以大大減少我們重複而又繁瑣的增刪改查操作,多留點時間給生活

.NET Core實戰專案CMS 十四 開發-防止跨站請求偽造(XSRF/CSRF)攻擊處理

通過 ASP.NET Core,開發者可輕鬆配置和管理其應用的安全性。 ASP.NET Core 中包含管理身份驗證、授權、資料保護、SSL 強制、應用機密、請求防偽保護及 CORS 管理等等安全方面的處理。 通過這些安全功能,可以生成安全可靠的 ASP.NET Core 應用。而我們這一章就來說道說道如何在

.NET Core實戰專案CMS 第二 入門-快速入門ASP.NET Core

作者:依樂祝 原文連結:https://www.cnblogs.com/yilezhu/p/9985451.html 本來這篇只是想簡單介紹下ASP.NET Core MVC專案的(畢竟要照顧到很多新手朋友),但是轉念一想不如來點猛的(考慮到急性子的朋友),讓你通過本

.NET Core實戰專案CMS 第一 入門-開篇及總體規劃

作者:依樂祝 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 寫在前面 千呼萬喚始出來,首先,請允許我長吸一口氣!真沒想到一份來自28歲老程式設計師的自白 這篇文章會這麼火,更沒想到的是

.NET Core中的一個介面多種實現的依賴注入與動態選擇

最近有個需求就是一個抽象倉儲層介面方法需要SqlServer以及Oracle兩種實現方式,為了靈活我在依賴注入的時候把這兩種實現都給注入進了依賴注入容器中,但是在服務呼叫的時候總是獲取到最後注入的那個方法的實現,這時候就在想能不能實現動態的選擇使用哪種實現呢?如果可以的話那麼我只需要在配置檔案中進行相應的配置

構建 團隊和流程

ini 之前 組織 第五章 團隊 mod 交互 然而 逆轉 典型的團隊開發模式和流程,完全是新的內容;涉及到更多的術語和有意思的策略性東西 1.團隊模式【我比較認可的】 主治醫師模式 由首席程序員(相當於首席醫生)負責整個工程,周圍人員各司其職,配合支持中心人物的工作;

讀構建:團隊和流程

min 這樣的 程序員 希望 成員 eat 貢獻 核心 不能 團隊有一致的集體目標,團隊要一起完成這目標。一個團隊的成員不一定要同時工作,例如接力賽跑。 團隊成員有各自的分工,互相依賴合作,共同完成任務。 軟件團隊有各種形式,適用於不同的人員和需求。基於直覺形成的團隊模式未

構建讀書心得

多個 功能需求 優先級 周期 基礎 第五章 高效 包括 交付 這一章我們主要學習了團隊和流程。團隊簡而言之就是開發一個軟件工程的團隊,那麽團隊究竟怎樣在一起開發這一軟件便有了多種多樣的方法。 比如所有人都一起做的一窩蜂模式,但這樣模式弊端很大,雖然都做了許多工作,但結合起來

現代軟件工程-構建法--- 練習與討論

在一起 缺點 建議 除了 有時 成員 測試 大腦 避免 1、團隊模式和團隊的開發模式有什麽關系 團隊模式主要取決於組成團隊的成員,包括team leader以及team mates。其中,由於身處各個角色人員的性格,能力以及IQ,EQ等的不同,特別是tea