当前位置: 首页 > news >正文

Dapper

介绍

Dapper是一个轻量级的ORM(对象关系映射)框架,它可以方便地将数据库查询结果映射到.NET对象上,同时也支持执行原生SQL查询。下面我将详细介绍Dapper的使用方法。

安装Dapper

首先,你需要通过NuGet包管理器将Dapper添加到你的项目中。你可以在Visual Studio中的NuGet包管理器控制台中运行以下命令来添加Dapper:

Install-Package Dapper

创建数据库连接

在使用Dapper之前,你需要创建数据库连接。可以使用.NET Core中的任何数据库提供程序来创建连接对象。例如,对于SQL Server数据库,可以使用SqlConnection类来创建连接对象:

using System.Data.SqlClient;var connectionString = "your_connection_string";
using (var connection = new SqlConnection(connectionString))
{// 在此处使用Dapper
}

请确保将上述代码中的your_connection_string替换为你的数据库连接字符串。

查询数据

使用Dapper进行数据库查询非常简洁方便。以下是一些查询数据的示例:

1. Query方法:执行数据库查询,并将结果映射到.NET对象的集合中。
var sql = "SELECT * FROM Customers";
var customers = connection.Query<Customer>(sql).ToList();// 异步版本
var asyncCustomers = await connection.QueryAsync<Customer>(sql);
2. QueryFirstOrDefault方法:执行数据库查询,并将结果的第一行映射到.NET对象。
var sql = "SELECT * FROM Customers WHERE Id = @id";
var customer = connection.QueryFirstOrDefault<Customer>(sql, new { id = 1 });// 异步版本
var asyncCustomer = await connection.QueryFirstOrDefaultAsync<Customer>(sql, new { id = 1 });
3. QuerySingleOrDefault方法:执行数据库查询,并将结果的单行映射到.NET对象。如果结果集不唯一,则抛出异常。
var sql = "SELECT * FROM Customers WHERE Email = @email";
var customer = connection.QuerySingleOrDefault<Customer>(sql, new { email = "test@example.com" });// 异步版本
var asyncCustomer = await connection.QuerySingleOrDefaultAsync<Customer>(sql, new { email = "test@example.com" });
4. Execute方法:执行数据库操作,例如插入、更新或删除记录。
var sql = "INSERT INTO Customers (Name, Email) VALUES (@Name, @Email)";
var parameters = new { Name = "John Doe", Email = "johndoe@example.com" };
connection.Execute(sql, parameters);// 异步版本
await connection.ExecuteAsync(sql, parameters);
5. ExecuteScalar方法:执行数据库查询,并返回结果的第一行第一列的值。
var sql = "SELECT COUNT(*) FROM Customers";
var count = connection.ExecuteScalar<int>(sql);// 异步版本
var asyncCount = await connection.ExecuteScalarAsync<int>(sql);
6. QueryMultiple方法:执行多个查询语句,并将结果存储在SqlMapper.GridReader对象中。
var sql = "SELECT * FROM Customers; SELECT * FROM Orders";
using (var multi = connection.QueryMultiple(sql))
{var customers = multi.Read<Customer>().ToList();var orders = multi.Read<Order>().ToList();
}// 异步版本
var multi = await connection.QueryMultipleAsync(sql);
var customers = multi.Read<Customer>().ToList();
var orders = multi.Read<Order>().ToList();

这些示例展示了Dapper常用方法以及它们的异步版本的使用情况。异步方法可以更好地支持并发操作,提高应用程序的性能。

这里的Customer是一个自定义的实体类,用于映射数据库中的表结构。Query方法将会自动执行SQL查询,并将结果映射到Customer对象的集合中。

如果你需要使用参数化查询,可以使用Query方法的第二个参数来传递查询参数:

var sql = "SELECT * FROM Customers WHERE Age > @age";
var parameters = new { age = 18 };
var customers = connection.Query<Customer>(sql, parameters).ToList();

插入记录

var sql = "INSERT INTO Customers (Name, Email) VALUES (@Name, @Email)";
var parameters = new { Name = "John Doe", Email = "johndoe@example.com" };
connection.Execute(sql, parameters);

更新记录

var sql = "UPDATE Customers SET Email = @Email WHERE Id = @Id";
var parameters = new { Email = "newemail@example.com", Id = 1 };
connection.Execute(sql, parameters);

删除记录

var sql = "DELETE FROM Customers WHERE Id = @Id";
var parameters = new { Id = 1 };
connection.Execute(sql, parameters);

通过使用Execute方法,你可以执行任何对数据库的增加、删除和修改操作,只需提供相应的SQL语句和参数即可。

当然,你也可以使用其他方法来执行上述操作,例如使用ExecuteScalar方法获取插入操作的自增长ID,或者使用QueryFirstOrDefault方法来检查是否成功执行了修改操作等。

执行操作

除了查询数据,Dapper也支持执行数据库操作,例如插入、更新或删除记录。以下是一些示例:

var sql = "INSERT INTO Customers (Name, Email) VALUES (@Name, @Email)";
var parameters = new { Name = "John Doe", Email = "johndoe@example.com" };
connection.Execute(sql, parameters);

在上述示例中,我们执行了一个插入操作,将新的顾客记录插入到数据库中。

存储过程

如果你需要执行存储过程,Dapper也提供了相应的支持。以下是一个示例:

var parameters = new DynamicParameters();
parameters.Add("@productId", 1);
parameters.Add("@quantity", 10, DbType.Int32, ParameterDirection.InputOutput);connection.Execute("UpdateStock", parameters, commandType: CommandType.StoredProcedure);var updatedQuantity = parameters.Get<int>("@quantity");

在上述示例中,我们通过DynamicParameters类创建了存储过程的参数。然后,通过Execute方法执行了存储过程。在存储过程执行后,我们可以通过Get方法获取输出参数的值。

事务

当在Dapper中执行多个数据库操作时,你可以使用事务来保证这些操作要么全部成功,要么全部回滚。Dapper提供了简单且灵活的方式来处理事务。

下面是一个使用Dapper执行事务的示例:

using (var connection = new SqlConnection(connectionString))
{connection.Open(); // 事务开启using (var transaction = connection.BeginTransaction()){try{var insertSql = "INSERT INTO Customers (Name, Email) VALUES (@Name, @Email)";var updateSql = "UPDATE Orders SET Status = @Status WHERE CustomerId = @CustomerId";var insertParameters = new { Name = "John Doe", Email = "johndoe@example.com" };var updateParameters = new { Status = "Completed", CustomerId = 1 };connection.Execute(insertSql, insertParameters, transaction);connection.Execute(updateSql, updateParameters, transaction);transaction.Commit(); // 事务提交}catch{transaction.Rollback(); // 事务回滚throw;}}
}

在这个示例中,我们首先创建了一个SqlConnection对象,并打开连接。然后,我们使用BeginTransaction方法开始一个事务。

在事务内部,我们可以执行任意数量的数据库操作。在本例中,我们执行了一个插入操作和一个更新操作。每个操作都使用Execute方法在同一个事务中执行,并传递了transaction参数。

如果所有的操作都成功执行,我们调用Commit方法提交事务。如果在任何操作期间出现错误,我们使用Rollback方法回滚事务,并重新抛出异常。

通过使用事务,你可以确保在执行一系列数据库操作时保持数据的一致性和完整性。

请注意,在上述示例中,我们使用了SqlConnectionSqlTransaction类,这是因为Dapper使用ADO.NET提供程序作为底层数据库访问。因此,你仍然可以通过Dapper使用事务处理。

IDEA

相关文章:

Dapper

介绍 Dapper是一个轻量级的ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它可以方便地将数据库查询结果映射到.NET对象上&#xff0c;同时也支持执行原生SQL查询。下面我将详细介绍Dapper的使用方法。 安装Dapper 首先&#xff0c;你需要通过NuGet包管理器将Dap…...

Python基础知识(一)

数据类型 基本类型 数字&#xff0c;字符串&#xff0c;布尔 数字类型 int整型 整数 float浮点型 带小数的数 complex复数 abj 字符串类型 str字符串 视作文本 组成&#xff1a;由数字&#xff0c;字母&#xff0c;空格&#xff0c;其他字符等组合而成 表达&#xff…...

QTthreadPool 程序

//*******************主窗口****************************// ------------------------.H--------------------------------- ----------------------------------------------------------- #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #inclu…...

python注册机制Registry

Register用法 1. 为什么使用Register2. 先验知识-----装饰器2.1 代码视角的装饰器用法2.2 装饰器的使用场景2 3. Registry注册器参数parent介绍未完待续 1. 为什么使用Register 2. 先验知识-----装饰器 2.1 代码视角的装饰器用法 实例1 decorate def func():pass #! 等价于…...

【Megatron-DeepSpeed】张量并行工具代码mpu详解(三):张量并行层的实现及测试

相关博客 【Megatron-DeepSpeed】张量并行工具代码mpu详解(三)&#xff1a;张量并行层的实现及测试 【Megatron-DeepSpeed】张量并行工具代码mpu详解(一)&#xff1a;并行环境初始化 【Megatron-DeepSpeed】张量并行工具代码mpu详解(二)&#xff1a;Collective通信操作的封装ma…...

【SpringBoot学习笔记】02. yaml配置注入

yaml配置注入 yaml基础语法 说明&#xff1a;语法要求严格&#xff01; 1、空格不能省略 2、以缩进来控制层级关系&#xff0c;只要是左边对齐的一列数据都是同一个层级的。 3、属性和值的大小写都是十分敏感的。 yaml注入配置文件 1、在springboot项目中的resources目录…...

【初阶C语言】指针的妙用

前言&#xff1a;在C语言中&#xff0c;有一个非常重要的知识点&#xff0c;叫做指针&#xff0c;指针也是数据类型中的一种。在本节内容中&#xff0c;我们就一起来学习指针。 学习一个新知识的时候&#xff0c;我们需要从这几个方面&#xff1a;指针是什么&#xff0c;指针是…...

链表——LinkedList类的概述和实现

LinkedList类 1.1LinkedList类概述 LinkedList类底层是基于双向链表结构实现的&#xff0c;不同于ArrayList类和Vector类是基于数组实现的&#xff1b;LinkedList类是非线程安全的&#xff1b;LinkedList类元素允许为null&#xff0c;允许重复元素&#xff1b;LinkedList类插…...

快六一啦,学习CSS3实现一个冰淇淋动画特效

快六一啦&#xff0c;小时候顶多吃个小冰棍&#xff0c;或者是那种小冰袋&#xff0c;现在的小朋友真是好&#xff0c;动不动就能吃到冰淇淋&#xff0c;今天用CSS3实现一个冰淇淋的动画特效吧 目录 实现思路 桶身的实现 冰淇淋身体的实现 五彩颗粒的实现 HTML源码 CSS3源…...

VSCode CMake vcpkg 整合

VSCode 整合 CMake 调试 CMake 工程 // launch.json {"version": "0.2.0","configurations": [{"name": "(gdb) Launch","type": "cppdbg","request": "launch",// Resolved by …...

c++ | win vscode

vscode 适合新手做一些简单的单个的编译和调试 新手适合去配置c 环境&#xff0c;尤其是当涉及复杂一点的编程&#xff0c;如多文件、多线程&#xff0c;在调试的时候会头大&#xff0c;要求会高一点 但怎么说呢&#xff1f; c 编译和调试是最接近实际开发环境的&#xff0c;与…...

算法-快速排序

给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5] 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 详细思路直接看我录制的视频吧 算法-快速排序_哔哩哔哩_bilibili class Soluti…...

SSM项目-博客系统

在线体验项目&#xff1a;登陆页面 项目连接&#xff1a;huhublog_ssm: 个人博客系统 技术栈&#xff1a;SpringBoot、SpringMVC、Mybatis、Redis、JQuery、Ajax、Json (gitee.com) 1.项目技术点分析 SpringBoot、SpringWeb(SpringMVC)、MyBatis、MySQL(8.x)、Redis(存储验…...

Android Gradle Plugin 编译

1. 源码下载&#xff1a; $ mkdir studio-main $ cd studio-main $ repo init -u https://android.googlesource.com/platform/manifest -b studio-main $ repo sync -c -j4 -q 这个官方网址让下载 studio-master-dev 分支&#xff0c;这个分支很老旧了&#xff0c;我这里直接…...

如何快速掌握水土保持方案编制

1、熟悉水土保持常用的主要法律法规、部委规章、规范性文件及技术规范与标准&#xff1b; 2、了解水土保持方案、监测及验收工作开展的流程&#xff1b; 3、熟悉水土保持方案、监测及验收工作需要收集的资料、现场踏勘注意事项&#xff1b; 4、熟悉常见水土保持工程施工工艺…...

前端笔试---acm模式

前言 之前一直刷力扣&#xff0c;昨天做了小红书笔试&#xff0c;发现是acm模式&#xff0c;不太熟悉&#xff0c;特此总结。其实如果是acm模式就需要自己写一下输入输出。前端一般有两个选择&#xff0c;一个是基于 V8 环境&#xff0c;另一个是基于 node。 V8 // 对于有多…...

国联易安网页防篡改保护系统“渠道招募”启动啦!

作为业内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数据安全的领军企业&#xff0c;国联易安网页防篡改保护系统基于“高效同步”、“安全传输”两项技术&#xff0c;具备了独特的“五重防护”新特性&#xff0c;支持网页的全自动发布、网页监控、报警和自…...

JavaScript--WebStorage

目录 WebStorage概述 WebStorage分类 注意&#xff1a; localStorage方法 介绍&#xff1a; 常见方法&#xff1a; 案例演示&#xff1a; sessionStorage方法 介绍&#xff1a; 常见方法&#xff1a; 案例演示&#xff1a; WebStorage概述 WebStorage是HTML5中…...

elementui 的 dialog 常用逻辑总结

菜鸟最近写后台管理系统&#xff0c;发现不管是弹窗、还是编辑、查看、添加等功能&#xff0c;真的代码都差不多&#xff0c;但是每次都要重新写里面的关闭逻辑等&#xff0c;菜鸟就感觉不如搞一个模版&#xff0c;后面只关注于逻辑&#xff0c;其他都直接来这里复制了&#xf…...

ip网络广播系统网络音频解码终端公共广播SV-7101

SV-7101V网络音频终端产品简介 网络广播终端SV-7101V&#xff0c;接收网络音频流&#xff0c;实时解码播放。本设备只有网络广播功能&#xff0c;是一款简单的网络广播终端。提供一路线路输出接功放或有源音箱。 产品特点 ■ 提供固件网络远程升级■ 标准RJ45网络接口&…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...