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. 解决Spark filter过滤条件中使用>=或<=时不识别的问题

    一.场景 val jldxx_zxzq = jldxx_with_dddf .withColumn("ZXZQ", zxzq(col("CBZQ"))) .fi ...

  2. ORACLE归档日志比联机重做日志小很多的情况总结

    ORACLE归档日志比联机重做日志小很多的情况   前几天一网友在群里反馈他遇到归档日志比联机重做日志(redo log)小很多的情况,个人第一次遇到这种情况,非常感兴趣,于是在一番交流沟通后,终于弄 ...

  3. MSSQL 如何采用sql语句 获取建表字段说明、字段备注、字段类型、字段长度

    转自: http://www.maomao365.com/?p=4983 <span style="color:red;font-weight:bold;">下文讲述- ...

  4. element-ui 2.4.8 BUG 标签页的最后一个Tab标题没法移除,更新后发现最新版本不存在该问题了 记录下

  5. 看到一个想收藏的的AJAX小列子

    用户登录的验证可以使用 form 表单提交,也可以使用 ajax 技术异步提交. AJAX 即 Asynchronous Javascript And XML(异步 JavaScript 和 XML) ...

  6. DELL 服务器报CPU 1 has an internal error (IERR)

    重启服务器,然后按F2 进入到bios中,选择system bios settings这个选项,然后选择system profiles 进入,在这个里面麻烦将 C1E 和Cstate这两个选项改为di ...

  7. 【2018.08.13 C与C++基础】C++语言的设计与演化读书笔记

    先占坑 老实说看这本书的时候,有很多地方都很迷糊,但却说不清楚问题到底在哪里,只能和Effective C++联系起来,更深层次的东西就想不到了. 链接: https://blog.csdn.net/ ...

  8. Ubuntu 12.04上安装 MongoDB并运行

    Ubuntu 12.04上安装 MongoDB并运行 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在Terminal输入 sudo apt-key ...

  9. Glyphicons 字体图标

  10. PHP防盗链的基本思想&&防盗链的设置方法

    PHP防盗链的基本思想&&防盗链的设置方法 网站盗链会大量消耗被盗链网站的带宽,而真正的点击率也许会很小,严重损害了被盗链网站的利益.本文主要介绍用PHP实现防盗链的方法以及基本思想, ...