寫在前面 上篇文章我們講瞭如在在實際項目開發中使用Git來進行代碼的版本控制,當然介紹的都是比較常用的功能。今天我再帶著大家一起熟悉下一個ORM框架Dapper,實例代碼的演示編寫完成後我會通過Git命令上傳到GitHub上,正好大家可以再次熟悉下Git命令的使用,來鞏固上篇文章的知識。本篇文章 ...
寫在前面
上篇文章我們講瞭如在在實際項目開發中使用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控制台程式來進行。
開始前的準備
在我們的項目文件夾,單擊滑鼠右鍵選擇“在當前文件夾下麵打開Git Bash”
然後輸入
git checkout Master
切換回Mater分支,然後輸入git checkout -b Sample05
創建一個新的名為“Sample05”的分支,如下所示:使用vs2017創建一個新的項目,名稱為“Sample05” 位置位於我們當前的目錄,如下圖所示:
接下來打開資料庫,新建一個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
項目中新增資料庫表對應的實體對象,代碼如下:
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; }
項目中添加Dapper的Nugets包,相信一路看教程過來的你一定知道怎麼新增Nuget包吧,這裡就不過多介紹了。
實戰演示
插入操作:將一個對象插入到資料庫中,代碼如下:
/// <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}條數據!"); } }
一次批量插入多條數據,測試代碼如下:
/// <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}條數據!"); } }
執行下代碼查看到控制台輸出如下的結果:
然後到資料庫查看下表中的數據如下:
下麵我們再分別測試下刪除一條數據,與一次刪除多條數據吧,代碼如下:
/// <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}條數據!"); } }
然後去資料庫里查看,發現主鍵為2,3,4的數據都已經被刪除了,如下圖所示:
下麵我們再測試下修改吧,也是分別測試一次只修改一條數據(主鍵為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}條數據!"); } }
現在我們執行下測試代碼看下結果吧
再到資料庫中查看下數據,上步驟5中最後一張圖相比較
增刪改都測試了,下麵就開始測試查詢吧,我們分別來測試下查詢指定的數據以及一次查詢多條數據來看下結果吧。還是先上代碼,:
/// <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:查到的數據為:"); } }
然後我們打上斷點然後去看下結果吧!這裡圖片我沒有截成功,所以就不貼了。
關聯查詢,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()}"); } } }
結果如下所示,調試的代碼沒法截圖我也很無奈。
GitHub源碼
GitHub的測試源碼已經上傳,https://github.com/yilezhu/Czar.Cms/tree/Sample05 放在Czar.Cms的Sample05分支上面。大家可以參考下,覺得有用的話記得star哦!
總結
本文給大家演示了Dapper的常用方法,不過都是通過同步的方式進行操作的,如果你想使用非同步的話可以自行進行測試。文中的大部分內容都有截圖,個別調試無法截圖的大伙可以自行調試查看!相信通過本文的實例講解,大伙應該能夠使用dapper進行相應的開發!下一篇文章我們將進行vue的講解!當然也只是進行很淺層次的講解。因為我是一個後端,也是抱著學習的態度來進行vue的記錄的!主要是以快速上為主。