ORM:对象关系映射器,它直接将数据库映射到C#对象。

有很多ORM框架可用,Dapper是其中之一,被称为ORM之王。

下面是Dapper主要的一些功能:

  • 速度快,性能好;
  • 更少的代码行
  • 对象映射
  • 静态对象绑定
  • 动态对象绑定
  • 易于处理Sql语句
  • 易于处理存储过程
  • 直接操作IDBConnection类,该类直接向数据库提供平滑性和运行查询,而不是像在EF和ADO.NET中那样使用各种对象传递数据。
  • 多个查询支持
  • 支持存储过程
  • 批量处理数据插入
  • 允许基于多个输入获取多个数据

为什么选择Dapper

  • Dapper是第二快的ORM

图片参照: Dapper dotnet.

  • 直接使用IDBConnection对象执行CRUD操作;
  • 通过数据库提供查询静态和动态数据;
  • 获取简单或复杂数据类型的通用结果;
  • Dapper允许同时存储批量数据。

如何安装Dapper

在Visual Studio中,创建一个新的控制台项目,并在解决方案资源管理器中右键单击引用,选择 “管理Nuget包...”包管理器,然后搜索Dapper,并使用NuGet包管理器控制台命令“install-package Dapper”,这将在项目中安装Dapper。

Dapper如何工作

主要包含三个步骤

第一步:使用连接字符串创建一个IDBConnection对象;

第二步:编写一个查询并将其存储在一个普通的字符串变量中;

第三步:调用db.execute()并传递查询,完成。

在下面的示例中,我们还将探索许多其他的方法。

对于本例,我有一个名为“ContactDB”的数据库,库中包含一个名为“Contacts”的表,让我们使用Dapper对Contacts表进行CRUD操作。

创建一个控制台应用程序并安装Dapper,并包含Dapper的命名空间。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper; namespace DapperORMBlog
{
public class Program
{
static void Main(string[] args)
{
}
}
}

示例1:

获取所有数据并打印到控制台

第一步:创建IDbConnection类的对象和SqlConnection的新实例。

static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);

SqlServerConnString是连接字符串名称,可以配置在程序中的App.config中。

<connectionStrings>
<add name="SqlServerConnString" providerName="System.Data.SqlClient" connectionString="Data Source=.\;Initial Catalog=ContactDB;Integrated Security=True;MultipleActiveResultSets=True" />
</connectionStrings>

第二步:写一个查询,并将其存储到一个string类型的变量中

String query = "select * from contacts"; 

第三步:在db实例上启动查询,并将泛型返回类型转换为联系人实体List

(List<Contact>)db.Query<Contact>(query)

只要使用这三个步骤,我们就可以从Contacts表中检索出所有的数据,可以在需要的地方去填充这些数据。可以将整个列表打印到Winform程序的GridView或者WPF,更或者将整个列表传递给任何外部的WCF.

对于这个示例,我们将其打印到控制台

List<Contact> lstContact= (List<Contact>)db.Query<Contact>(query);
foreach (var item in lstContact)
{
Console.WriteLine(item.FirstName + " " + item.LastName+"\n");
}
Console.ReadKey();

结果:

示例2:

给Contacts表中插入数据,同样包含三步

第一步:创建IDbConnection类的对象和SqlConnection的新实例。

static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);

第二步:

  string query = @"Insert into contacts values (@FirstName, @LastName, @Email, @Company, @Title);
Select Cast (Scope_Identity() as int)";

在这里,我们包含两个查询来获取Contacts表最后插入的id值。

在db实例上启动查询,我们将获得一个int类型的返回值,因此将其存储到int变量中,并将contact对象和查询语句传递过去,如下所示。

 int id = db.Query<int>(query, contact).Single();

在这三个简单步骤中,数据将被插入到数据库中。

 Contact contact = new Contact() { FirstName = "yixuan", LastName = "han", Email = "yixuanhan@aaa.com", Company = "BAT", Title = "PE" };
string query = @"Insert into contacts values (@FirstName, @LastName, @Email, @Company, @Title);
Select Cast (Scope_Identity() as int)";
int id = db.Query<int>(query, contact).Single();

查看数据库多了一条记录,说明插入成功

示例3:现在,让我们通过在where子句中传递一个id,从Contacts表中获取一条记录

第一步:创建IDbConnection类的对象和SqlConnection的新实例。

static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);

第二步:

    string query = "select * from contacts where id = @id";

第三步:在db实例上启动查询,我们将获得一条联系人记录,并将其传给contact对象进行保存

            Contact cont = (Contact)db.Query<Contact>(query, new { id =  }).SingleOrDefault();

备注:同样的方法,我们可以对数据库进行Update和Delete操作

我们甚至可以用db.Execute()

db.Query()和db.Execute()之间主要的区别是,用db.Query()我们可以按照我们的设计获取返回值,因为它是一个通用的方法,而db.Execute()不是一个通用的方法,因此它只能返回int

进一步使用Dapper

  • 我们也会遇到一次需要处理多个表的需求,例如一次查询多个表或者以外键获取数据
  • 我们可以用Dapper同时访问多个表,并且十分平滑
  • 传递对象列表,Dapper本事可以识别出是批量插入
  • 根据各种参数获取数据,Dapper会自动将数组转换成CSV,并返回一个List对象

示例4:

下面假如说我已经有另一张名为“Address”的表

我们将在两个表上同时执行CRUD操作,使用相同的ContactId,即Contacts表中的主键,Adress表中的外键

现在让我们通过传递Id从Contacts表和Adress表中获取多条数据

第一步和之前所有示例的第一步相同,我们从第二步开始

第二步:

string query = "select * from contacts where id = @id ; select * from address where ContactId = @id;";

第三步:db实例上启动查询

using (var multipleresult = db.QueryMultiple(query, new { id =  }))
{
var contact = multipleresult.Read<Contact>().SingleOrDefault();
var Addresses = multipleresult.Read<Address>().ToList();
if (contact != null && Addresses != null)
{
contact.Addresses.AddRange(Addresses);
}
}

以上三步你将 可以从多个表中获得多条记录

示例5:

让我们使用存储过程访问数据库

我有一个存储过程,声明一个参数(ID),并且基于ID返回Contact数据和Address数据

Use ContactDB
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO CREATE PROCEDURE [dbo].[sp_GetContact_Address]
@Id int
AS
BEGIN
select * from contacts where id = @Id ;
select * from Address where ContactId = @Id;
END
GO

用Dapper调用存储过程

第一步同其他示例

在这里我们不需要写任何的query语句,相反的我们将调用数据库内的存储过程

在这里我们将做的更改是传递一个存储过程的名称而不是查询语句,并传递一个名称为command type的参数。

第二步:在db实例上启动查询

using (var multipleresult = db.QueryMultiple("sp_GetContact_Address", new { id =  }, commandType: CommandType.StoredProcedure))
{
var contact = multipleresult.Read<Contact>().SingleOrDefault();
var Addresses = multipleresult.Read<Address>().ToList();
if (contact != null && Addresses != null)
{
contact.Addresses.AddRange(Addresses);
}
}

仅仅两步,就 可以成功的调用数据库中的存储过程

示例6:

当我们需要处理运行时对象时,还可以将动态对象或者值传递给存储过程

下面这个存储过程会给Contacts表里增加一条记录

use ContactDB
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO CREATE PROCEDURE [dbo].[SaveContact]
@Id int output,
@FirstName nvarchar(50),
@LastName nvarchar(50),
@Email nvarchar(50),
@Company nvarchar(50),
@Title nvarchar(50) AS
BEGIN
INSERT INTO [dbo].[Contacts]
([FirstName],[LastName],[Company],[Title],[Email]) VALUES
(@FirstName, @LastName, @Company, @Title, @Email);
SET @Id = cast(scope_identity() as int)
END
GO

下面演示了如何使用Dapper通过传递动态参数调用存储过程

第一步同其他示例

第二步:创建一个动态对象并将值传递给该对象

var parameter = new DynamicParameters();
parameter.Add("@Id", con.Id, dbType: DbType.Int32, direction: ParameterDirection.InputOutput);
parameter.Add("@FirstName", con.FirstName);
parameter.Add("@LastName", con.LastName);
parameter.Add("@Company", con.Company);
parameter.Add("@Title", con.Title);
parameter.Add("@Email", con.Email);

第三步:用db.Execute()调用存储过程

db.Execute("SaveContact",parameter,commandType:CommandType.StoredProcedure);  

//To get newly created ID back
con.Id = parameter.Get<int>("@Id");

这些是使用c#动态对象操作数据库的方法。

原文链接:https://www.c-sharpcorner.com/UploadFile/e4e3f7/dapper-king-of-micro-orm-C-Sharp-net/?

Dapper-小型ORM之王(C#.NET)的更多相关文章

  1. Dapper小型ORM的使用(随便吐槽下公司)

    近来公司又有新项目要做,之前做项目用过蛮多ORM,包括ef,NetTiers,ServiceStack.OrmLite等ROM,每种ORM都有一定的坑(或者说是使用者的问题吧~~).用来用去都觉的有一 ...

  2. Dapper.NET - ORM(ibatis.Net)

    Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2.2实体类. 3.使用方法 3.1  一对一映射 3.2 一对多映射 3.3 ...

  3. ASP .Net Core 使用 Dapper 轻型ORM框架

    一:优势 1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll. 2,Dapper很快.Dapper的速度接近与IDataReader,取列表 ...

  4. Dapper.net ORM

    参考链接:https://github.com/StackExchange/dapper-dot-net Dapper - a simple object mapper for .Net Dapper ...

  5. [转载]ORM-PetaPoco 小型ORM框架

    轻量级ORM-PetaPoco及改进 作者:帮助您   发布:2013-04-26 06:03   分类:软件综合问题   阅读:371次   评论关闭     PetaPoco描述 PetaPoco ...

  6. ASP.NET Core 中的 ORM 之 Dapper

    目录 Dapper 简介 使用 Dapper 使用 Dapper Contrib 或其他扩展 引入工作单元 Unit of Work 源代码 参考 Dapper 简介 Dapper是.NET的一款轻量 ...

  7. Use Dapper ORM With ASP.NET Core

    Dapper.NET is not just another ORM tool, it's considered as the king of ORM. Because it's fast, easy ...

  8. 使用轻量级ORM Dapper进行增删改查

      项目背景 前一段时间,开始做一个项目,在考虑数据访问层是考虑技术选型,考虑过原始的ADO.NET.微软的EF.NH等.再跟经理讨论后,经理强调不要用Ef,NH做ORM,后期的sql优化不好做,公司 ...

  9. 轻量级ORM框架Dapper应用一:Dapper安装

    一.Dapper简介 Dapper是一款轻量级ORM框架,为解决网站访问流量极高而产生的性能问题而构造,主要通过执行TSQL表达式而实现数据库的CQRS. 如果你在项目中遇到性能访问问题,选择Dapp ...

随机推荐

  1. [20170604]12c Top Frequency histogram补充.txt

    [20170604]12c Top Frequency histogram补充.txt 1.环境:SCOTT@test01p> @ ver1PORT_STRING                 ...

  2. ugui SetParent在安卓上一个诡异bug

    问题描述 我的环境:Unity3D 5.3.7 出问题机型:安卓模拟器.部分低配安卓机型(比如:红米2A) 以下代码是设置某个节点的父节点,在PC.Editor.大部分手机上都是正常的,但问题机型上, ...

  3. DubboAdmin部署

    1.软件下载 部署管理后台和监控中心需要以下软件 opensesame  下载地址:https://github.com/alibaba/opensesame Dubbo源码下载  https://g ...

  4. IE6浏览器无法打开QQ邮箱

    原因:未启用TLS1.0 解决方法: 打开IE浏览器,依次打开 [Internet]→[高级],在 设置 选项卡中,勾选[使用TLS1.0],然后点击[确定]保存修改,重启浏览器即可.

  5. Jetbrains IntelliJ IDEA PyCharm 注册激活(2018最新)

    AppCode CLion DataGrip GoLand IntelliJ IDEA PhpStorm PyCharm Rider RubyMine WebStorm下载注册激活 官方下载地址 Ap ...

  6. 优雅的使用Spring

    Bean声明的三种方式: 1.@Component, @Service, @Repository,@Controller 用于声明一个组件,程序启动时会扫描这些组件,并创建实例. 2.在applica ...

  7. C# -- 使用递归列出文件夹目录及目录下的文件

    使用递归列出文件夹目录及目录的下文件 1.使用递归列出文件夹目录及目录下文件,并将文件目录结构在TreeView控件中显示出来. 新建一个WinForm应用程序,放置一个TreeView控件: 代码实 ...

  8. Python3 实现简易局域网视频聊天工具

    Python3 实现简易局域网视频聊天工具   1.环境 操作系统为 Ubuntu 16.04 python 3.5opencv-python 3.4.1.15numpy 1.14.5PyAudio ...

  9. B. Yet Another Array Partitioning Task ——cf

    B. Yet Another Array Partitioning Task time limit per test 2 seconds memory limit per test 256 megab ...

  10. Ecelipse上添加Server

    第一步,打开eclipse工具,点击菜单栏中的"Help",选择"Install New Software" 第二步,点击Add按钮 第三步,Name输入:&q ...