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. How to monitor tempdb in MS SQL

    Error: tempdb is full due to active_transaction. select ss.[host_name], ss.login_name, ss.original_l ...

  2. python第一百一十八天---ajax--图片验证码 + Session

    原生AJAX Ajax主要就是使用 [XmlHttpRequest]对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE),Ajax首次出现IE5.5中存在(ActiveX控件). 1.Xm ...

  3. JS实现定时器

    导出:jquery.timers-1.2.js jQuery Timers提供了三个函式 1. everyTime(时间间隔, [定时器名称], 函式名称, [次数限制], [等待函式程序完成])2. ...

  4. c/c++ 数组的智能指针 使用

    数组的智能指针 使用 数组的智能指针的限制: 1,unique_ptr的数组智能指针,没有*和->操作,但支持下标操作[] 2,shared_ptr的数组智能指针,有*和->操作,但不支持 ...

  5. Linux系统中Redis和Tomcat的PID文件路径设置

    Tomcat: /bin/catalina.sh 文件头注释下面添加一行:CATALINA_PID=/var/run/tomcat.pid Redis: redis.conf配置文件里面搜索pidfi ...

  6. Linux下编译安装Apache报APR not found错误的解决办法

    我在编译安装完Nginx.MySQL和PHP(见之前一篇博客:LNMP环境搭建详细教程)之后,进行apache的编译安装: cd /usr/local/src wget http:.tar.gz ta ...

  7. LeetCode算法题-Rotate Array(Java实现)

    这是悦乐书的第184次更新,第186篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第43题(顺位题号是189).给定一个数组,将数组向右旋转k步,其中k为非负数.例如: ...

  8. js中图片上传,多次上传同一张不生效

    在做图片上传的功能时, 使用删除功能删除了一张图片, 然后想重新上传原来删除的图片, 结果预览不显示, 也不能上传成功 解决办法, 在删除方法里置空input $("#id").f ...

  9. 团队作业——Beta冲刺

    团队作业--Beta冲刺 经过紧张的Alpha阶段,很多组已经从完全不熟悉语言和环境,到现在能够实现初步的功能.下一阶段即将加快编码进度,完成系统功能.强化软件工程的体会.Beta阶段的冲刺时间为期5 ...

  10. C和指针 (pointers on C)——第七章:函数(上)

    第七章 函数 这一章对于有一定C的基础的人有一定优秀代码风格的人来说,并非非常虐.关于stdarg宏可能有些陌生.它负责可变參数列表的定义. 总结: 新式风格和旧式风格就不要提了.八百年前的事情. 函 ...