Dapper是一种轻量级的ORM(对象关系映射)工具,它提供了高效且易于使用的方式来执行数据库操作。
Dapper是由Stack Overflow团队开发并维护的,它的主要目标是提供比EF更快、更直接的方式访问数据库。
Dapper的主要特点包括:
基于纯ADO.NET而不是EF,因此性能更高
支持多种数据库,如SQL Server、MySQL、Oracle等
通过使用动态SQL和强类型参数,可以有效地减少代码量
提供了多种简单易用的方法,在大多数情况下,只需一两行代码就可以完成常见的CRUD操作
接下来,我们将详细介绍如何使用Dapper进行数据库操作。

一、安装Dapper:

Dapper可以通过NuGet包管理器安装。打开Visual Studio,选择“项目”菜单下的“管理NuGet程序包”,在搜索栏中输入“Dapper”,然后点击“安装”按钮即可。
       你也可以手动在项目中添加以下引用:

using Dapper;
using System.Data.SqlClient;

二、连接数据库
     在使用Dapper之前,我们需要先连接数据库。Dapper支持多种数据库,本文以SQL Server为例。
     创建一个 SqlConnection 对象,然后使用该对象打开数据库连接。

string connectionString = "your connection string";
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
// 这里执行数据库操作
}

三、执行查询操作
     Dapper提供了多种方法来执行查询操作。其中,最常见的方法是 Query 和 QueryFirstOrDefault。
     Query
     Query 方法返回一个包含查询结果的 IEnumerable<T>(T为查询结果映射的类型)。

var products = connection.Query<Product>("SELECT * FROM Products");
foreach (var product in products)
{
// 处理查询结果
}

如果你需要使用参数化查询,可以像下面这样使用命名参数:

var products = connection.Query<Product>("SELECT * FROM Products WHERE CategoryId = @CategoryId", new { CategoryId = 1 });
foreach (var product in products)
{
// 处理查询结果
}

或者使用匿名对象:

var parameters = new { CategoryId = 1 };
var products = connection.Query<Product>("SELECT * FROM Products WHERE CategoryId = @CategoryId", parameters);
foreach (var product in products)
{
// 处理查询结果
}

QueryFirstOrDefault

QueryFirstOrDefault 方法返回一个单个实体对象,如果未找到任何记录,则返回 null。

var product = connection.QueryFirstOrDefault<Product>("SELECT * FROM Products WHERE Id = @Id", new { Id = 1 });
if (product != null)
{
// 处理查询结果
}

    QueryMultiple
    如果你需要一次性执行多个查询语句,可以使用 QueryMultiple 方法。该方法返回一个 SqlMapper.GridReader 对象,通过该对象可以依次获取各个查询语句的结果。
    以下示例中,我们首先执行两个查询语句,获取商品和商品分类的数据。然后,我们使用 Read 方法分别获取这两个结果集,并将它们转换为实体对象列表。

var multi = connection.QueryMultiple("SELECT * FROM Products; SELECT * FROM Categories");
var products = multi.Read<Product>().ToList();
var categories = multi.Read<Category>().ToList();

四、执行插入、更新和删除操作
      Dapper还提供了多种方法来执行插入、更新和删除操作。其中,最常见的方法是 Execute 和 ExecuteScalar。
      Execute
      Execute 方法返回受影响行数。

var rowsAffected = connection.Execute("INSERT INTO Products (Name, Price) VALUES (@Name, @Price)", new { Name = "Product 1", Price = 9.99m });

你也可以使用命名参数或匿名对象:

var parameters = new { Name = "Product 1", Price = 9.99m };
var rowsAffected = connection.Execute("INSERT INTO Products (Name, Price) VALUES (@Name, @Price)", parameters);

   ExecuteScalar
     ExecuteScalar方法返回一个单一的值,通常用于执行插入操作并返回插入记录的主键。

var productId = connection.ExecuteScalar<int>("INSERT INTO Products (Name, Price) VALUES (@Name, @Price); SELECT CAST(SCOPE_IDENTITY() as int)", new { Name = "Product 2", Price = 19.99m });

与 Query 和 Execute 方法一样,你也可以使用命名参数或匿名对象。
对象映射
    Dapper支持自动将查询结果映射到实体对象上。在使用Dapper时,我们需要确保查询语句中的列名与实体类的属性名相对应。
    以下是一个简单的示例:

public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
} // 查询商品数据
var products = connection.Query<Product>("SELECT Id, Name, Price FROM Products");

注意,如果查询语句中的列名与实体类的属性名不匹配,则无法自动映射。此时,你需要手动指定映射关系。
     以下是一个手动映射的示例:

public class Product
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public decimal ProductPrice { get; set; }
} // 查询商品数据
var products = connection.Query<Product>("SELECT Id as ProductId, Name as ProductName, Price as ProductPrice FROM Products");

 总结
      Dapper是一种简单易用、高效的ORM工具,它提供了多种方法来执行数据库操作,能够满足大多数开发人员的需求。在使用Dapper时,我们需要先连接数据库,然后使用 Query、QueryFirstOrDefault、QueryMultiple、Execute 或 ExecuteScalar 等方法执行相应的数据库          操作。同时,Dapper还支持自动将查询结果映射到实体对象上,从而进一步简化了代码编写。

以SQLserver为例的Dapper详细讲解的更多相关文章

  1. Siki_Unity_2-1_API常用方法和类详细讲解(上)

    Unity 2-1 API常用方法和类详细讲解(上) 任务1&2:课程前言.学习方法 && 开发环境.查API文档 API: Application Programming I ...

  2. 05-- C++ 类的静态成员详细讲解

     C++ 类的静态成员详细讲解    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不 ...

  3. vue-cli 目录结构详细讲解

    https://juejin.im/post/5c3599386fb9a049db7351a8 vue-cli 目录结构详细讲解 目录 结构预览 ├─build // 保存一些webpack的初始化配 ...

  4. C++语言堆栈的详细讲解

    本文主要向大家介绍了C++语言堆栈的详细讲解,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助. 一.预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区 ...

  5. 万字长文,以代码的思想去详细讲解yolov3算法的实现原理和训练过程,Visdrone数据集实战训练

    以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 ...

  6. 30 道 Vue 面试题,内含详细讲解(涵盖入门到精通,自测 Vue 掌握程度)

    前言 本文以前端面试官的角度出发,对 Vue 框架中一些重要的特性.框架的原理以问题的形式进行整理汇总,意在帮助作者及读者自测下 Vue 掌握的程度.本文章节结构以从易到难进行组织,建议读者按章节顺序 ...

  7. head标签详细讲解

    head标签详细讲解 head位于html网页的头部,后前的标签,并以开始以结束的一html标签. Head标签位置如图: head标签示意图 head包含标签 meta,title,link,bas ...

  8. 详细讲解nodejs中使用socket的私聊的方式

    详细讲解nodejs中使用socket的私聊的方式 在上一次我使用nodejs+express+socketio+mysql搭建聊天室,这基本上就是从socket.io的官网上的一份教程式复制学习,然 ...

  9. iOS KVC详细讲解

    iOS KVC详细讲解 什么是KVC? KVC即NSKeyValueCoding,就是键-值编码的意思.一个非正式的 Protocol,是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取 ...

  10. Android webservice的用法详细讲解

    Android webservice的用法详细讲解 看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧.此文章采用的项目是我毕业设计的webserv ...

随机推荐

  1. jQuery实现论坛发帖Demo

    目录 效果展示 思路 代码 改进空间 效果展示 思路 主要知识点:运用jQuery对HTML元素节点的操作(append)来添加帖子. 交互设计:用户点击页面上的"论坛发帖"按钮, ...

  2. redis缓存lua脚本过多导致内存占用很多问题

    现象 生产某集群各节点已使用内存比较大,在清理了大量业务无用数据后,节点已使用内存却未下降. 排查与分析 通过info memory命令查看,内存碎片率略高,但是对某个主节点新添加的从节点内存使用依然 ...

  3. 如何利用 C# + Echarts 绘制 Bar Simple

    背景 Echarts 是百度推出的一个使用 JavaScript 实现的开源可视化库. 该库提供了常规的折线图.柱状图.散点图.饼图.K线图,用于统计的盒形图,用于地理数据可视化的地图.热力图.线图, ...

  4. C/C++ 数据结构单链表的实现(初始化、插入、删除、销毁)

    #include <iostream> #include <Windows.h> #define MAX_SIZE 100 using namespace std; //单链表 ...

  5. windows远程linux桌面

    TigerVNC是一个高性能.平台无关的虚拟网络计算(Virtual Network Computing,VNC)实现,是一个客户端/服务器应用程序,允许用户在远程机器上启动并与图形应用程序进行交互. ...

  6. Oracle表主键作为外键都用在哪些表查询

    Oracle中,如果设置了外键,删除数据时,必须将外键关联一并删除,但是如果对项目不是很熟悉时,我们无法判断到底都在哪些表中有外键关联,以下提供了一个查询的SQL,可以通过数据库查询,查找到所有的外键 ...

  7. Json对象转换模块(自编代码JsonObject.cs)

    namespace 信息采集系统.Common { /// <summary> /// Json类型对象,用于其它Json对象继承 /// </summary> /// < ...

  8. 解决com.alibaba.excel.exception.ExcelGenerateException: Can not close IO.

    我在使用easycel导出到zip包中时,出现了这个问题.各种文件输出时产生的问题其实大同小异 查看了一些网上的文章,还有github上关于此bug的issue,总算是理清并解决了. 解决方法一 主要 ...

  9. PointGNN未修改之前实验结果 ---car

    10个epoch中1-4:

  10. adb命令2

    1.获取手机型号指令 adb shell cat /system/build.prop | findstr "ro.product.model" 2.获取手机处理器信息 adb s ...