以SQLserver为例的Dapper详细讲解
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详细讲解的更多相关文章
- Siki_Unity_2-1_API常用方法和类详细讲解(上)
Unity 2-1 API常用方法和类详细讲解(上) 任务1&2:课程前言.学习方法 && 开发环境.查API文档 API: Application Programming I ...
- 05-- C++ 类的静态成员详细讲解
C++ 类的静态成员详细讲解 在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不 ...
- vue-cli 目录结构详细讲解
https://juejin.im/post/5c3599386fb9a049db7351a8 vue-cli 目录结构详细讲解 目录 结构预览 ├─build // 保存一些webpack的初始化配 ...
- C++语言堆栈的详细讲解
本文主要向大家介绍了C++语言堆栈的详细讲解,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助. 一.预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区 ...
- 万字长文,以代码的思想去详细讲解yolov3算法的实现原理和训练过程,Visdrone数据集实战训练
以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 ...
- 30 道 Vue 面试题,内含详细讲解(涵盖入门到精通,自测 Vue 掌握程度)
前言 本文以前端面试官的角度出发,对 Vue 框架中一些重要的特性.框架的原理以问题的形式进行整理汇总,意在帮助作者及读者自测下 Vue 掌握的程度.本文章节结构以从易到难进行组织,建议读者按章节顺序 ...
- head标签详细讲解
head标签详细讲解 head位于html网页的头部,后前的标签,并以开始以结束的一html标签. Head标签位置如图: head标签示意图 head包含标签 meta,title,link,bas ...
- 详细讲解nodejs中使用socket的私聊的方式
详细讲解nodejs中使用socket的私聊的方式 在上一次我使用nodejs+express+socketio+mysql搭建聊天室,这基本上就是从socket.io的官网上的一份教程式复制学习,然 ...
- iOS KVC详细讲解
iOS KVC详细讲解 什么是KVC? KVC即NSKeyValueCoding,就是键-值编码的意思.一个非正式的 Protocol,是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取 ...
- Android webservice的用法详细讲解
Android webservice的用法详细讲解 看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧.此文章采用的项目是我毕业设计的webserv ...
随机推荐
- github 开源项目安装
1.打开github 2.搜索相关项目 3.使用系统下载安装 4.执行 指令;git clone git://github.com/****.git
- 狂神的学习笔记demo11(包机制)
无法生成子包的问题:设置图标里的Compact Middle Packages勾去掉 //定义包 package package com.panda.base1; //导入包import import ...
- .NET 6 的 docker 镜像可以有多小
https://blog.csdn.net/sD7O95O/article/details/120135032 Docker Image Size - How to Keep It Small? ht ...
- ES搜索高亮分词排序聚合搜索
分词高亮搜索代码 List<A> list = new ArrayList<>(); //设置高亮显示 HighlightBuilder highlightBuilder = ...
- Javascript 事件派发 dispatcher
基本使用 基础事件 let event = new Event("click") //新建click事件 node.addEventListener("click&quo ...
- 2021.06.29 mac系统下zsh: command not found:***报错问题
最近老是遇到zsh: command not found:vue,zsh: command not found:nrm, zsh: command not found:tsc, zsh: comman ...
- [Unity工具]搭建lua环境(IDEA)
一.下载IDEA 地址:https://www.jetbrains.com/idea/ 这里我的版本是IntelliJ IDEA Community Edition 2020.2.4 x64 二.断点 ...
- centos下安装不同版本的python
1. 安装环境以及依赖包 可以直接yum安装: yum -y install git gcc make patch zlib-devel gdbm-devel openssl-devel sqlite ...
- typescript 的动态引入组件
环境: Arco Pro + Vue3 vite自身对动态字符串形式的组件引入是有限制的, 以下写法会报错 官方文档中也对此有做说明, 只能通过固定形式去引用 以下形式不会报错, 但这种固定格式的局限 ...
- Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hive.DELETEME1643159643943' doesn't exist
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hive.DELETEME1643159643 ...