写在前面

上篇文章我们讲了如在在实际项目开发中使用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”的分支,如下所示:

  3. 使用vs2017创建一个新的项目,名称为“Sample05” 位置位于我们当前的目录,如下图所示:

  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包吧,这里就不过多介绍了。

实战演示

  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. 执行下代码查看到控制台输出如下的结果:

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

  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}条数据!");
    }
    }

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

  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}条数据!");
    }
    }

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

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

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

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

GitHub源码

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

总结

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

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

  1. .NET Core实战项目之CMS 第十三章 开发篇-在MVC项目结构介绍及应用第三方UI

    作为后端开发的我来说,前端表示真心玩不转,你如果让我微调一个位置的样式的话还行,但是让我写一个很漂亮的后台的话,真心做不到,所以我一般会选择套用一些开源UI模板来进行系统UI的设计.那如何套用呢?今天 ...

  2. .NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程

    写在前面 这篇我们对用户权限进行极简设计并保留其扩展性.首先很感谢大家的阅读,前面六章我带着大家快速入门了ASP.NET Core.ASP.NET Core的启动过程源码解析及配置文件的加载过程源码解 ...

  3. .NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9998021.html 写在前面 上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它,接着 ...

  4. .NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练

    写在前面 上篇文章我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程,然后又带着大家熟悉了一遍配置文件的加载方式,最后引出了依赖注入以及控制反转的概念!如果大家把前面几张都理解了 ...

  5. .NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用

    写在前面 上面文章我给大家介绍了Dapper这个ORM框架的简单使用,大伙会用了嘛!本来今天这篇文章是要讲Vue的快速入门的,原因是想在后面的文章中使用Vue进行这个CMS系统的后台管理界面的实现.但 ...

  6. .NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发

    上篇给大家从零开始搭建了一个我们的ASP.NET Core CMS系统的开发框架,具体为什么那样设计我也已经在第十篇文章中进行了说明.不过文章发布后很多人都说了这样的分层不是很合理,什么数据库实体应该 ...

  7. .NET Core实战项目之CMS 第十七章 CMS网站系统的部署

    目前我们的.NET Core实战项目之CMS系列教程基本走到尾声了,通过这一系列的学习你应该能够轻松应对.NET Core的日常开发了!当然这个CMS系统的一些逻辑处理还需要优化,如没有引入日志组件以 ...

  8. .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来,首先,请允许我长吸一口气!真没想到一份来自28岁老程序员 ...

  9. .NET Core实战项目之CMS 第十五章 各层联动工作实现增删改查业务

    连着两天更新叙述性的文章大家可别以为我转行了!哈哈!今天就继续讲讲我们的.NET Core实战项目之CMS系统的教程吧!这个系列教程拖得太久了,所以今天我就以菜单部分的增删改查为例来讲述下我的项目分层 ...

随机推荐

  1. INotifyPropertyChanged 接口 CallerMemberName属性

    调用方信息 使用调用方信息属性,可以获取关于调用方的信息传递给方法. 可以获取源代码.行号在源代码和调用方的成员名称的文件路径. 此信息用于跟踪,调试和创建诊断工具非常有用.若要获取此信息,则使用适用 ...

  2. 关于<服务器>定义

    定义: 服务器,也称伺服器,是提供计算服务的设备.由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力.   服务器的构成:包括处理器.硬盘.内存.系统总线等,和 ...

  3. 七、OpenStack—dashboard组件安装

    1.安装包# yum install openstack-dashboard2.编辑 /etc/openstack-dashboard/local_settings 文件 需要更改的几处内容如下: ) ...

  4. python可视化库 Matplotlib 00 画制简单图像

    1.下载方式:直接下载Andaconda,简单快捷,减少准备环境的时间 2.图像 3.代码:可直接运行(有详细注释) # -*- encoding:utf-8 -*- # Copyright (c) ...

  5. NOIP2017 国庆郑州集训知识梳理汇总

    第一天 基础算法&&数学 day1难度测试 如果要用一个词来形容上午的测试,那真是体无完肤.  成绩: 题目 成绩 评价 T1 50 一般 T2 10 大失所望 T3 0 差 基础算法 ...

  6. Java之hashCode的作用和equals方法的重构规则

    这个是博主对hashcode的初步理解,以后加深了会再来更新: 1.hashcode是什么? hashcode是对象的散列码,不同的对象几乎不一样,说几乎是因为还是可以一样的. 特点:每一个对象都有h ...

  7. 201771010126 王燕《面向对象程序设计(Java)》第十六周学习总结

    实验十六  线程技术 实验时间 2017-12-8 1.实验目的与要求 (1) 掌握线程概念: ‐多线程 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. ...

  8. 我和python的初相识

    认识Python是大二的选修 单纯只是想赚学分而已 后来觉得越来越有趣. 一.python简介 简单来说Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python 的设 ...

  9. swust oj 1051

    输出利用先序遍历创建的二叉树中的指定结点的孩子结点 1000(ms) 10000(kb) 2432 / 5430 利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的儿子结点.约定二叉树结点数据为 ...

  10. 微信报错 config:fail.Error:invalid signature

    config:fail.Error:invalid signature 微信公众号报这个错,appid等各项都配置好,经过一番折腾,发现原来ip白明单设置了不是该服务器的ID,重新设置后就可以了