Dapper-小型ORM之王(C#.NET)

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 = "[email protected]", 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 = 7 }).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 = 1 }))
            {
                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 = 1 }, 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/?

原文地址:https://www.cnblogs.com/Jeely/p/11357606.html

时间: 2024-10-06 19:51:07

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

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

近来公司又有新项目要做,之前做项目用过蛮多ORM,包括ef,NetTiers,ServiceStack.OrmLite等ROM,每种ORM都有一定的坑(或者说是使用者的问题吧~~).用来用去都觉的有一定的不爽.这次打算用Dapper这个ORM来做项目看看.首先感谢http://www.cnblogs.com/wywnet/p/33422150.html这位老兄给出的文章还有demo(建议大家可以看看),看了后深受启发.所以也确定用Dapper来练练手.好了,先介绍下Dapper这个ORM 1,D

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

一:优势 1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll. 2,Dapper很快.Dapper的速度接近与IDataReader,取列表的数据超过了DataTable. 3,Dapper支持什么数据库.Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库,当然如果你知道原理也可以让它支持Mongo db 4,Dapper的r支持多表并联的对象.支持一对多 多对多的关系.并且

Dapper-开源小型ORM

 一些关于Dapper的介绍: 1.Dapper是一个轻型的开源ORM类,代码就一个SqlMapper.cs文件,编译后就40多K的一个很小的Dll. 2.Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库 3.Dapper的r支持多表并联的对象.支持一对多 多对多的关系.并且没侵入性. 4.Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象.性能提升了很多:(比采用常规的反射)并且无须迁就数据库

Dapper.net ORM

参考链接:https://github.com/StackExchange/dapper-dot-net Dapper - a simple object mapper for .Net Dapper is a single file you can drop in to your project that will extend your IDbConnection interface. It provides 3 helpers: Dapper 只有一个文件,你可以把它放入你的项目,它扩展I

ASP.NET Core 中的 ORM 之 Dapper

目录 Dapper 简介 使用 Dapper 使用 Dapper Contrib 或其他扩展 引入工作单元 Unit of Work 源代码 参考 Dapper 简介 Dapper是.NET的一款轻量级ORM工具(GitHub),也可称为简单对象映射器.在速度方面拥有微型ORM之王的称号.它是半自动的,也就是说实体类和SQL语句都要自己写,但它提供自动对象映射.是通过对IDbConnection接口的扩展来操作数据库的. 优点: 轻量,只有一个文件 性能高,Dapper的速度接近与IDataRe

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 to integrate, requires fewer lines of code, supports bulk data insertion and supports static and dynamic object binding. And Dapper ORM can be used w

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

  项目背景 前一段时间,开始做一个项目,在考虑数据访问层是考虑技术选型,考虑过原始的ADO.NET.微软的EF.NH等.再跟经理讨论后,经理强调不要用Ef,NH做ORM,后期的sql优化不好做,公司也没有人对EF,Nh 等orm优化比较熟悉的.强调说的,我们的项目要做的得简单,可以使用ADO.NET 写原始的sql.但我自己还是喜欢ORM的,它可以提高数据访问层的开发.有一天,在订阅张善友 doNet跨平台微信公众号里,看到Dapper的推荐.了解之后,我自己喜欢喜欢Dapper,可以满足我这

Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作

ChuanGoing 2019-09-10 距离上一篇近一个月时间,断断续续才把本篇码完,后面将加快进度,争取年度内把本系列基本介绍完成,同时督促本人持续学习. 本篇学习曲线: 1.初识Dapper 2.DbConnection 3.CommandBuilder实现单表操作(略) 4.演示 初识Dapper Dapper是一个轻量级/高性能的ORM,核心功能是利用Emit反射获取IDataReader中的数据.我们可以利用它的对象关系映射实现简单CURD操作,或者直接用SQL语句实现复杂场景的C

EntityFramework、Dapper vs 草根框架性能

EntityFramework.Dapper vs 草根框架性能 扯淡 当前市面上 ORM 很多,有跑车型的,如 Dapper,有中规中矩型的,如 Mybatis.Net,也有重量型的,如 EntityFramework 和 NHibernate,还有一些出自草根之手的,如 Chloe.ORM.各式各样,层出不穷.试问,为何要重复造轮子?很简单,咱来自火星,目前地球上还没一款轮子适合咱这辆火星车~ 为加深对各个 ORM 框架的了解,同时也想看看咱自己的框架性能如何,也可以让对 Chloe 感兴趣