前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了

.NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了

作者头像
依乐祝
修改2018-11-29 09:38:26
1.1K0
修改2018-11-29 09:38:26
举报
文章被收录于专栏:依乐祝依乐祝

写在前面

上篇文章我们讲了如在在实际项目开发中使用Git来进行代码的版本控制,当然介绍的都是比较常用的功能。今天我再带着大家一起熟悉下一个ORM框架Dapper,实例代码的演示编写完成后我会通过Git命令上传到GitHub上,正好大家可以再次熟悉下Git命令的使用,来巩固上篇文章的知识。本篇文章已经收入.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划 有兴趣的朋友可以加入.NET Core项目实战交流群637326624 进行交流。

作者:依乐祝 原文地址:https://cloud.tencent.com/developer/article/1367126

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
1543242325029
  1. 使用vs2017创建一个新的项目,名称为“Sample05” 位置位于我们当前的目录,如下图所示:
1543242490572
1543242490572
  1. 接下来打开数据库,新建一个Content内容表,表结构还沿用之前教程中的实体,这里只给出MSSql的脚本:至于MySql的你自己建了,如果你实在不会的话可以到群里问其他小伙伴要吧
代码语言:txt
复制

CREATE TABLE dbo.content(

id IDENTITY(1,1) NOT NULL,

title(50) NOT NULL,

content(max) NOT NULL,

status NOT NULL,

add_time NOT NULL,

modify_time NULL,

代码语言:txt
复制
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 IDENTITY(1,1) NOT NULL,

content_id NOT NULL,

content(512) NOT NULL,

add_time NOT NULL,

代码语言:txt
复制
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

代码语言:txt
复制
  1. 项目中新增数据库表对应的实体对象,代码如下:
代码语言:txt
复制
代码语言:txt
复制
   public class Content
代码语言:txt
复制
   {
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 主键
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public int id { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 标题
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public string title { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 内容
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public string content { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 状态 1正常 0删除
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public int status { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 创建时间
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public DateTime add_time { get; set; } = DateTime.Now;
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 修改时间
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public DateTime? modify_time { get; set; }
代码语言:txt
复制
   }

public class Comment

代码语言:txt
复制
   {
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 主键
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public int id { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 文章id
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public int content_id { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 评论内容
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public string content { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 添加时间
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public DateTime add_time { get; set; } = DateTime.Now;
代码语言:txt
复制
   }
代码语言:txt
复制
  1. 项目中添加Dapper的Nugets包,相信一路看教程过来的你一定知道怎么新增Nuget包吧,这里就不过多介绍了。
1543243792492
1543243792492

实战演示

  1. 插入操作:将一个对象插入到数据库中,代码如下:
代码语言:txt
复制
代码语言:txt
复制
/// <summary>
代码语言:txt
复制
       /// 测试插入单条数据
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
      static void test_insert()
代码语言:txt
复制
       {
代码语言:txt
复制
           var content = new Content
代码语言:txt
复制
           {
代码语言:txt
复制
               title = "标题1",
代码语言:txt
复制
               content = "内容1",
代码语言:txt
复制
           };
代码语言:txt
复制
           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;"))
代码语言:txt
复制
           {
代码语言:txt
复制
               string sql_insert = @"INSERT INTO [Content]
代码语言:txt
复制
               (title, [content], status, add_time, modify_time)

VALUES (@title,@content,@status,@add_time,@modify_time)";

代码语言:txt
复制
               var result = conn.Execute(sql_insert, content);
代码语言:txt
复制
               Console.WriteLine($"test_insert:插入了{result}条数据!");
代码语言:txt
复制
           }
代码语言:txt
复制
       }
代码语言:txt
复制
  1. 一次批量插入多条数据,测试代码如下:
代码语言:txt
复制

/// <summary>

代码语言:txt
复制
       /// 测试一次批量插入两条数据
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
      static void test_mult_insert()
代码语言:txt
复制
       {
代码语言:txt
复制
           List<Content> contents = new List<Content>() {
代码语言:txt
复制
              new Content
代码语言:txt
复制
           {
代码语言:txt
复制
               title = "批量插入标题1",
代码语言:txt
复制
               content = "批量插入内容1",
代码语言:txt
复制
           },
代码语言:txt
复制
              new Content
代码语言:txt
复制
           {
代码语言:txt
复制
               title = "批量插入标题2",
代码语言:txt
复制
               content = "批量插入内容2",
代码语言:txt
复制
           },
代码语言:txt
复制
       };
代码语言:txt
复制
           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;"))
代码语言:txt
复制
           {
代码语言:txt
复制
               string sql_insert = @"INSERT INTO [Content]
代码语言:txt
复制
               (title, [content], status, add_time, modify_time)

VALUES (@title,@content,@status,@add_time,@modify_time)";

代码语言:txt
复制
               var result = conn.Execute(sql_insert, contents);
代码语言:txt
复制
               Console.WriteLine($"test_mult_insert:插入了{result}条数据!");
代码语言:txt
复制
           }
代码语言:txt
复制
       }
代码语言:txt
复制
  1. 执行下代码查看到控制台输出如下的结果:
1543246862147
1543246862147

然后到数据库查看下表中的数据如下:

1543246898729
1543246898729
  1. 下面我们再分别测试下删除一条数据,与一次删除多条数据吧,代码如下:
代码语言:txt
复制
代码语言:txt
复制
/// <summary>
代码语言:txt
复制
       /// 测试删除单条数据
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       static void test_del()
代码语言:txt
复制
       {
代码语言:txt
复制
           var content = new Content
代码语言:txt
复制
           {
代码语言:txt
复制
               id = 2,
代码语言:txt
复制
           };
代码语言:txt
复制
           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;"))
代码语言:txt
复制
           {
代码语言:txt
复制
               string sql_insert = @"DELETE FROM [Content]

WHERE (id = @id)";

代码语言:txt
复制
               var result = conn.Execute(sql_insert, content);
代码语言:txt
复制
               Console.WriteLine($"test_del:删除了{result}条数据!");
代码语言:txt
复制
           }
代码语言:txt
复制
       }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 测试一次批量删除两条数据
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       static void test_mult_del()
代码语言:txt
复制
       {
代码语言:txt
复制
           List<Content> contents = new List<Content>() {
代码语言:txt
复制
              new Content
代码语言:txt
复制
           {
代码语言:txt
复制
               id=3,
代码语言:txt
复制
           },
代码语言:txt
复制
              new Content
代码语言:txt
复制
           {
代码语言:txt
复制
               id=4,
代码语言:txt
复制
           },
代码语言:txt
复制
       };
代码语言:txt
复制
           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;"))
代码语言:txt
复制
           {
代码语言:txt
复制
               string sql_insert = @"DELETE FROM [Content]

WHERE (id = @id)";

代码语言:txt
复制
               var result = conn.Execute(sql_insert, contents);
代码语言:txt
复制
               Console.WriteLine($"test_mult_del:删除了{result}条数据!");
代码语言:txt
复制
           }
代码语言:txt
复制
       }
代码语言:txt
复制
1543247418059
1543247418059

然后去数据库里查看,发现主键为2,3,4的数据都已经被删除了,如下图所示:

1543247491525
1543247491525
  1. 下面我们再测试下修改吧,也是分别测试一次只修改一条数据(主键为5),与一次批量修改多条数据(主键为6,7)
代码语言:txt
复制

/// <summary>

代码语言:txt
复制
       /// 测试修改单条数据
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       static void test_update()
代码语言:txt
复制
       {
代码语言:txt
复制
           var content = new Content
代码语言:txt
复制
           {
代码语言:txt
复制
               id = 5,
代码语言:txt
复制
               title = "标题5",
代码语言:txt
复制
               content = "内容5",
代码语言:txt
复制
           };
代码语言:txt
复制
           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;"))
代码语言:txt
复制
           {
代码语言:txt
复制
               string sql_insert = @"UPDATE  [Content]

SET title = @title, content = @content, modify_time = GETDATE()

WHERE (id = @id)";

代码语言:txt
复制
               var result = conn.Execute(sql_insert, content);
代码语言:txt
复制
               Console.WriteLine($"test_update:修改了{result}条数据!");
代码语言:txt
复制
           }
代码语言:txt
复制
       }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 测试一次批量修改多条数据
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       static void test_mult_update()
代码语言:txt
复制
       {
代码语言:txt
复制
           List<Content> contents = new List<Content>() {
代码语言:txt
复制
              new Content
代码语言:txt
复制
           {
代码语言:txt
复制
               id=6,
代码语言:txt
复制
               title = "批量修改标题6",
代码语言:txt
复制
               content = "批量修改内容6",
代码语言:txt
复制
           },
代码语言:txt
复制
              new Content
代码语言:txt
复制
           {
代码语言:txt
复制
               id =7,
代码语言:txt
复制
               title = "批量修改标题7",
代码语言:txt
复制
               content = "批量修改内容7",
代码语言:txt
复制
           },
代码语言:txt
复制
       };
代码语言:txt
复制
           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;"))
代码语言:txt
复制
           {
代码语言:txt
复制
               string sql_insert = @"UPDATE  [Content]

SET title = @title, content = @content, modify_time = GETDATE()

WHERE (id = @id)";

代码语言:txt
复制
               var result = conn.Execute(sql_insert, contents);
代码语言:txt
复制
               Console.WriteLine($"test_mult_update:修改了{result}条数据!");
代码语言:txt
复制
           }
代码语言:txt
复制
       }
代码语言:txt
复制

现在我们执行下测试代码看下结果吧

1543248037237
1543248037237

再到数据库中查看下数据,上步骤5中最后一张图相比较

1543248094960
1543248094960
  1. 增删改都测试了,下面就开始测试查询吧,我们分别来测试下查询指定的数据以及一次查询多条数据来看下结果吧。还是先上代码,:
代码语言:txt
复制
代码语言:txt
复制
/// <summary>
代码语言:txt
复制
       /// 查询单条指定的数据
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       static void test_select_one()
代码语言:txt
复制
       {
代码语言:txt
复制
           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;"))
代码语言:txt
复制
           {
代码语言:txt
复制
               string sql_insert = @"select * from [dbo].[content] where id=@id";
代码语言:txt
复制
               var result = conn.QueryFirstOrDefault<Content>(sql_insert, new { id=5});
代码语言:txt
复制
               Console.WriteLine($"test_select_one:查到的数据为:");
代码语言:txt
复制
           }
代码语言:txt
复制
       }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 查询多条指定的数据
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       static void test_select_list()
代码语言:txt
复制
       {
代码语言:txt
复制
           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;"))
代码语言:txt
复制
           {
代码语言:txt
复制
               string sql_insert = @"select * from [dbo].[content] where id in @ids";
代码语言:txt
复制
               var result = conn.Query<Content>(sql_insert, new { ids=new int[] { 6,7} });
代码语言:txt
复制
               Console.WriteLine($"test_select_one:查到的数据为:");
代码语言:txt
复制
           }
代码语言:txt
复制
       }
代码语言:txt
复制

然后我们打上断点然后去看下结果吧!这里图片我没有截成功,所以就不贴了。

  1. 关联查询,Dapper的强大之处就在于其关联查询了!为了测试的方便,我们给主键为5的content添加两个comment中,这个插入的代码就不贴出来了,留给大家自行书写吧,如果不会的话可以加群问群里的其他小伙伴吧。这里需要新建一个类
代码语言:txt
复制

public class ContentWithCommnet

代码语言:txt
复制
   {
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 主键
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public int id { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 标题
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public string title { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 内容
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public string content { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 状态 1正常 0删除
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public int status { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 创建时间
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public DateTime add_time { get; set; } = DateTime.Now;
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 修改时间
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public DateTime? modify_time { get; set; }
代码语言:txt
复制
       /// <summary>
代码语言:txt
复制
       /// 文章评论
代码语言:txt
复制
       /// </summary>
代码语言:txt
复制
       public IEnumerable<Comment> comments { get; set; }
代码语言:txt
复制
   }
代码语言:txt
复制

然后就是测试代码,运行的查询测试代码如下:查询id为5的文章,文章是包含评论列表的

代码如下:

代码语言:txt
复制

static void test_select_content_with_comment()

代码语言:txt
复制
       {
代码语言:txt
复制
           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;"))
代码语言:txt
复制
           {
代码语言:txt
复制
               string sql_insert = @"select * from content where id=@id;

select * from comment where content_id=@id;";

代码语言:txt
复制
               using (var result = conn.QueryMultiple(sql_insert, new { id = 5 }))
代码语言:txt
复制
               {
代码语言:txt
复制
                   var content = result.ReadFirstOrDefault<ContentWithComment>();
代码语言:txt
复制
                   content.comments = result.Read<Comment>();
代码语言:txt
复制
                   Console.WriteLine($"test_select_content_with_comment:内容5的评论数量{content.comments.Count()}");
代码语言:txt
复制
               }
代码语言:txt
复制
           }
代码语言:txt
复制
       }
代码语言:txt
复制

结果如下所示,调试的代码没法截图我也很无奈。

1543251360510
1543251360510

GitHub源码

GitHub的测试源码已经上传,https://github.com/yilezhu/Czar.Cms/tree/Sample05 放在Czar.Cms的Sample05分支上面。大家可以参考下,觉得有用的话记得star哦!

总结

本文给大家演示了Dapper的常用方法,不过都是通过同步的方式进行操作的,如果你想使用异步的话可以自行进行测试。文中的大部分内容都有截图,个别调试无法截图的大伙可以自行调试查看!相信通过本文的实例讲解,大伙应该能够使用dapper进行相应的开发!下一篇文章我们将进行vue的讲解!当然也只是进行很浅层次的讲解。因为我是一个后端,也是抱着学习的态度来进行vue的记录的!主要是以快速上为主。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • Dapper是什么
  • Dapper快速入门
    • 开始前的准备
      • 实战演示
      • GitHub源码
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档