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

C#进阶-轻量级ORM框架Dapper的使用教程与原理详解

本文详细介绍了Dapper在C#中的使用方法,包括Dapper的基本概念、与其他持久层框架的比较、基本语法和高级语法的使用,并通过实例讲解了如何在项目中集成和使用Dapper。Dapper以其高效的性能和简洁的API受到开发者的青睐,适用于各种数据库操作需求。本文还将深入探讨Dapper的核心原理,通过内部代码展示其工作机制。最后,总结了Dapper的优缺点及其在实际开发中的应用场景,为开发者提供全面的指导。

在这里插入图片描述

一、Dapper介绍

1. Dapper介绍

Dapper是一个轻量级的ORM(对象关系映射)框架,专为.NET设计。它通过扩展IDbConnection接口,使开发者能够方便地执行SQL查询,并将查询结果映射到对象模型中。

2. Dapper原理解析

Dapper的核心原理是通过扩展方法来简化数据访问过程。它的主要工作流程如下:

  • 建立数据库连接:使用ADO.NET的IDbConnection接口建立数据库连接。
  • 执行SQL查询:通过Dapper提供的扩展方法(如Query、Execute等)执行SQL查询。
  • 映射结果集:将查询结果集映射到C#对象模型中,简化数据处理。

Dapper的性能优势主要来源于以下几个方面:

  • 轻量级:Dapper没有复杂的上下文管理和变化跟踪机制,减少了性能开销。
  • 直接执行SQL:Dapper直接执行原生SQL查询,避免了复杂的查询生成过程。
  • 缓存查询计划:Dapper会缓存查询计划,减少SQL解析和执行的开销。

3. Dapper和其他操作数据库的框架比较

为了更清晰地展示Dapper与其他数据库操作框架的比较,以下通过表格进行说明:

特性DapperEntity FrameworkNHibernateADO.NET
性能中等中等
易用性中等
映射能力基本映射丰富丰富
学习曲线中等
事务支持支持支持支持支持
LINQ支持不支持支持支持不支持
配置灵活性中等

二、Dapper的基本语法

Dapper提供了多种方法来简化数据库操作。以下是一些常用的基本语法及其示例代码:

1. 查询数据

Dapper使用Query方法执行SQL查询并返回结果集。

using (IDbConnection db = new SqlConnection(connectionString))
{string sql = "SELECT * FROM Students";var students = db.Query<Student>(sql).ToList();
}

2. 插入数据

Dapper使用Execute方法执行插入操作。

using (IDbConnection db = new SqlConnection(connectionString))
{string sql = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";var result = db.Execute(sql, new { Name = "John", Age = 22 });
}

3. 更新数据

Dapper使用Execute方法执行更新操作。

using (IDbConnection db = new SqlConnection(connectionString))
{string sql = "UPDATE Students SET Name = @Name, Age = @Age WHERE Id = @Id";var result = db.Execute(sql, new { Name = "John", Age = 23, Id = 1 });
}

4. 删除数据

Dapper使用Execute方法执行删除操作。

using (IDbConnection db = new SqlConnection(connectionString))
{string sql = "DELETE FROM Students WHERE Id = @Id";var result = db.Execute(sql, new { Id = 1 });
}

5. 存储过程

Dapper可以轻松调用存储过程。

using (IDbConnection db = new SqlConnection(connectionString))
{var result = db.Query<Student>("GetStudentById", new { Id = 1 }, commandType: CommandType.StoredProcedure).FirstOrDefault();
}

三、Dapper的高级功能

Dapper除了基本的CRUD操作外,还提供了一些高级功能,以满足复杂的数据库操作需求。

1. 多映射

Dapper支持多表查询并将结果映射到多个对象。

string sql = "SELECT * FROM Students s INNER JOIN Classes c ON s.ClassId = c.Id";
var studentDictionary = new Dictionary<int, Student>();using (IDbConnection db = new SqlConnection(connectionString))
{var students = db.Query<Student, Class, Student>(sql, (student, @class) => {student.Class = @class;return student;}, splitOn: "Id").Distinct().ToList();
}

2. 参数化查询

Dapper支持参数化查询,有效防止SQL注入。

using (IDbConnection db = new SqlConnection(connectionString))
{string sql = "SELECT * FROM Students WHERE Age > @Age";var students = db.Query<Student>(sql, new { Age = 20 }).ToList();
}

3. 事务处理

Dapper支持数据库事务,确保数据操作的一致性。

using (IDbConnection db = new SqlConnection(connectionString))
{db.Open();using (var transaction = db.BeginTransaction()){string insertSql = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";db.Execute(insertSql, new { Name = "John", Age = 22 }, transaction);string updateSql = "UPDATE Students SET Age = @Age WHERE Name = @Name";db.Execute(updateSql, new { Age = 23, Name = "John" }, transaction);transaction.Commit();}
}

4. 批量操作

Dapper可以高效地进行批量操作。

using (IDbConnection db = new SqlConnection(connectionString))
{string sql = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";var students = new List<Student>{new Student { Name = "John", Age = 22 },new Student { Name = "Jane", Age = 24 },new Student { Name = "Mark", Age = 26 }};db.Execute(sql, students);
}

5. 动态对象

Dapper支持动态对象,适用于不确定返回结构的查询。

using (IDbConnection db = new SqlConnection(connectionString))
{string sql = "SELECT * FROM Students";var students = db.Query<dynamic>(sql).ToList();foreach (var student in students){Console.WriteLine($"{student.Name} - {student.Age}");}
}

6. 缓存功能

Dapper内置简单的缓存功能,可以提高查询性能。

using (IDbConnection db = new SqlConnection(connectionString))
{string sql = "SELECT * FROM Students";var students = db.Query<Student>(sql, buffered: true).ToList();
}

四、Dapper使用总结

Dapper作为一个轻量级的ORM框架,在性能和易用性之间找到了平衡点。它适合于需要高效数据访问的应用场景,尤其是在已有数据库项目中快速集成和使用。

Dapper的优势在于其高性能、简单易用和灵活性。它直接执行SQL查询,性能接近手写ADO.NET,且API简洁明了,易于上手。同时,Dapper不需要复杂的配置,适合快速集成和使用。

然而,Dapper也有其局限性。它不支持复杂的对象关系映射,不提供LINQ支持,不适合复杂的业务逻辑处理场景。因此,在选择使用Dapper时,需要根据具体项目需求进行权衡。

优势总结
优势描述
高性能直接执行SQL查询,性能接近手写ADO.NET
简单易用API简洁明了,易于上手
轻量级不需要复杂的配置,适合快速集成
参数化查询有效防止SQL注入
支持事务处理确保数据操作的一致性
灵活性允许开发者完全控制SQL语句,实现更复杂的查询逻辑

通过本教程,希望读者能够快速掌握Dapper的基本使用方法,并在项目中有效地应用Dapper提高开发效率。Dapper的高效和简洁使其成为处理简单到中等复杂度数据库操作的理想选择,但对于复杂的业务场景,仍需结合其他框架或工具进行综合使用。

在这里插入图片描述

相关文章:

C#进阶-轻量级ORM框架Dapper的使用教程与原理详解

本文详细介绍了Dapper在C#中的使用方法&#xff0c;包括Dapper的基本概念、与其他持久层框架的比较、基本语法和高级语法的使用&#xff0c;并通过实例讲解了如何在项目中集成和使用Dapper。Dapper以其高效的性能和简洁的API受到开发者的青睐&#xff0c;适用于各种数据库操作需…...

Windows图形界面(GUI)-MFC-C/C++ - 编辑框(Edit Control) - CEdit

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 编辑框(Edit Control) - CEdit 基本概念 成员函数 示例代码 编辑框(Edit Control) - CEdit 基本概念 编辑框&#xff08;Edit Control&#xff09;是一个允许用户输入和编辑文本的窗…...

网络安全防御【IPsec VPN搭建】

目录 一、实验拓扑图 二、实验要求 三、实验思路 四、实验步骤&#xff1a; 修改双机热备的为主备模式&#xff1a; 2、配置交换机LSW6新增的配置&#xff1a; 3、防火墙&#xff08;FW4&#xff09;做相关的基础配置&#xff1a; 4、搭建IPsec VPN通道 &#xff08;1…...

java环境配置与tomcat的配置

1、java环境配置 一、JDK下载 访问Oracle官网&#xff1a; 前往Oracle官网&#xff08;Oracle | Cloud Applications and Cloud Platform&#xff09;&#xff0c;在首页的顶部菜单中选择“Resources” > “Downloads” > “Java” > “JDK”。注意&#xff1a;Orac…...

OD C卷 - 来自异国的客人/幸运数字

来自异国的客人/幸运数字&#xff08;100&#xff09; 输入描述&#xff1a; 输入k,n,m k表示物品价值&#xff08;十进制&#xff09; k>0 n表示幸运数字, n > 0 m表示异国采用的进制&#xff1b;m > 1 n < m 输出描述&#xff1a; 输出幸运数字的个数&#xff0…...

C++ | 动态内存管理 new、delete (用法、底层)详解

目录 简单回顾C语言动态内存管理 new、delete的用法 内置类型 new delete 自定义类型 new、delete底层讲解&#xff08;重要&#xff09; operator new 与 operator delete 定位 new 结语 简单回顾C语言动态内存管理 在C语言的学习阶段 我们接触到了三个能在堆上开辟…...

【C语言】结构体内存布局解析——字节对齐

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、引言 二、什么是字节对齐&…...

模型表达方式

目录 一、模型表达概述 二、模型精确表达 2.1 几何表示 (Geometrical Representation) 三、模型非精确表达 3.1 网格表示 (Mesh Representation) 3.2 体素表示 (Voxel Representation) 一、模型表达概述 模型的表达方式多种多样,选择适合的表达方式取决于具体应用场景和…...

校园课程助手【4】-使用Elasticsearch实现课程检索

本节将介绍本项目的查询模块&#xff0c;使用Elasticsearch又不是查询接口&#xff0c;具体流程如图所示&#xff08;如果不了解Elasticsearch可以使用sql语句进行查询&#xff09;&#xff1a; 这里是两种方法的异同点&#xff1a; Mysql&#xff1a;擅长事务类型操作&#…...

经典运维面试题

1、Linux常见的日志文件都有哪些&#xff0c;各自的用途&#xff1f;日志轮询配置文件在哪里&#xff1f;欢迎界面配置文件在哪里&#xff1f; /var/log/messages #内核及公共消息日志/var/log/cron #计划任务日志/var/log/dmesg #系统引导日志/var/log/malilog #邮件系…...

别再盲目推广了!Xinstall助你开启App线下推广新篇章

在这个数字化飞速发展的时代&#xff0c;App已经成为我们生活中不可或缺的一部分。然而&#xff0c;App市场的竞争也日益激烈&#xff0c;如何让你的App在众多竞争者中脱颖而出&#xff0c;成为每个推广者必须面对的问题。今天&#xff0c;就让我们一起探讨一下App线下推广的痛…...

大厂linux面试题攻略五之数据库管理

一、数据库管理-MySQL语句 0.MySQL基本语句&#xff1a; 1.SQL语句-增 创建xxx用户&#xff1a; mysql>create user xxx % indentified by 123456; xxx表示用户名 %b表示该用户用来连接数据库的方式&#xff08;远程或本地连接&#xff09; indentified by 123456设置密码…...

【pytorch】模型集成

在集成学习中&#xff0c;我们会训练多个模型&#xff08;通常称为「弱学习器」&#xff09;解决相同的问题&#xff0c;并将它们结合起来以获得更好的结果。最重要的假设是&#xff1a;当弱模型被正确组合时&#xff0c;我们可以得到更精确和/或更鲁棒的模型。 常用的模型集成…...

初识集合和数据结构

目录 初识集合框架数据结构基本概念和术语数据数据元素数据项数据对象前四者的关系数据结构逻辑结构和物理结构逻辑结构物理结构 算法算法设计要求 初识集合框架 Java的集合框架也可被称为容器&#xff0c;是定义在Java.util包下的一些接口和实现类。其就是将多个元素存储到一…...

cocos creator 3.x中动态加载 resources 文件夹下的图片时提示找不到

文件目录如下 类型为spriteFrame 代码案例 图片设置为 sprite-frame、texture 或其他图片类型后&#xff0c;将会在 资源管理器 中生成一个对应类型的资源。但如果直接加载 equipments/testea&#xff0c;得到的类型将会是 ImageAsset&#xff0c;必须指定路径到具体的子资源…...

第九十八周周报

学习时间&#xff1a; 2024.7.27-204.8.3 学习产出&#xff1a; 这周主要在按照审稿人的意见修改论文&#xff0c;由于有个模型保存的文件找不到了&#xff0c;所以重新训练花了点时间&#xff0c;目前已经把修改后的论文和cover letter发给杨老师了。...

程序员找工作之数据结构面试题总结分析

文章目录 1. 数据结构的基本概念与分类2. 数据结构的存储与表示3. 数据元素的存储与关系4. 存储结构的选择与考量5. 特定数据结构的定义与特性6. 数据结构操作与应用7. 数组与存储8. 特定数据结构的存储与访问 程序员在找工作面试中&#xff0c;数据结构方面可能会被问到的问题…...

设置provider解决maven找不到JUnit 5测试样例

问题描述 尝试复现一个用大模型生成测试样例的工作&#xff0c;但使用maven生成的JUnit 5测试样例死活不执行。又不想用命令行运行&#xff0c;因此进行排查 基本知识 <dependencies> junit-jupiter-api JUnit 5写代码时调用的库 junit-jupyter-engine 运行JUnit 5测…...

php反序列化靶机serial实战

扫描ip,找到靶机ip后进入 他说这是cookie的测试网页&#xff0c;我们抓个包&#xff0c;得到cookie值 base64解码 扫描一下靶机ip的目录 发现http://192.168.88.153/backup/&#xff0c;访问 下载一下发现是他的网页源码 通过代码审计&#xff0c;发现 通过代码审计得知&…...

类型推断技术及仓颉语言实践

史磊 仓颉语言类型推断技术专家 一、一种看待类型系统的方式 一门编程语言一定得包含类型系统吗&#xff1f; 这个问题今天看来可能显而易见&#xff0c;一个程序没有类型的话还能算是个完整、正确的程序吗&#xff1f;但是其实关于类型系统的作用&#xff0c;一直是存在两种…...

PDF-Parser-1.0开箱即用体验:无需配置的PDF解析工具

PDF-Parser-1.0开箱即用体验&#xff1a;无需配置的PDF解析工具 1. 引言&#xff1a;PDF解析的痛点与解决方案 如果你经常需要从PDF文档里提取文字、表格或者公式&#xff0c;肯定遇到过这样的烦恼&#xff1a;要么工具太复杂&#xff0c;配置起来让人头疼&#xff1b;要么效…...

深入解析IKEv2与IPSec安全联盟的建立过程

1. IKEv2协议的核心价值与IPSec安全联盟 第一次接触IKEv2协议时&#xff0c;我被它简洁的交互流程惊艳到了。相比传统的IKEv1&#xff0c;这个2005年诞生的协议就像把瑞士军刀升级成了智能工具箱。IKEv2全称Internet Key Exchange version 2&#xff0c;它最大的突破在于将IPSe…...

出一个Comsol锂电池容量衰减模型

出一个Comsol锂电池容量衰减模型&#xff0c;有相关论文参考锂电池用两年就蔫了&#xff1f;拆开看看全是玄学。搞仿真的兄弟都知道&#xff0c;容量衰减这玩意儿要建模得玩多物理场耦合。最近在《Journal of Power Sources》扒到篇狠货&#xff0c;教你怎么用COMSOL玩转这个死…...

LoRa通信实战:手把手教你用Matlab仿真Chirp扩频信号(附完整代码)

LoRa通信实战&#xff1a;手把手教你用Matlab仿真Chirp扩频信号&#xff08;附完整代码&#xff09; 在物联网设备爆炸式增长的今天&#xff0c;低功耗广域网络(LPWAN)技术正成为连接万物的关键纽带。作为LPWAN的代表性技术之一&#xff0c;LoRa凭借其卓越的穿透能力和超远传输…...

UniApp多环境配置实战:Vite插件实现微信/支付宝小程序动态切换

UniApp多环境配置实战&#xff1a;Vite插件实现动态切换的工程化方案 在跨平台小程序开发中&#xff0c;经常遇到需要为不同客户定制不同版本的需求。每次手动修改配置不仅效率低下&#xff0c;还容易出错。本文将分享一套基于Vite插件的自动化解决方案&#xff0c;实现UniApp项…...

告别模糊!专业级多显示器显示优化工具全攻略

告别模糊&#xff01;专业级多显示器显示优化工具全攻略 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 在多显示器办公环境中&#xff0c;你是否经常遇到主副屏幕显示不一致的问题&#xff1f;当4K显示器遇上1080P屏幕&#xff0c;文字…...

嵌入式方向输入抽象库:摇杆与按键的语义化状态映射

1. 项目概述direction是一个轻量级、零依赖的嵌入式方向输入抽象库&#xff0c;专为资源受限的微控制器&#xff08;如 STM32F0/F1/L0/L1、nRF52、ESP32-C3、RP2040 等&#xff09;设计。其核心目标并非实现复杂的人机交互逻辑&#xff0c;而是以最小的代码体积和确定性的执行时…...

【云原生监控】PushGateway:打通监控数据“最后一公里”的桥梁

1. 为什么需要PushGateway&#xff1f; 在云原生监控体系中&#xff0c;Prometheus的拉取模式&#xff08;Pull&#xff09;是主流设计。但实际生产环境中&#xff0c;我们经常会遇到这些头疼的场景&#xff1a;某台服务器躲在防火墙后面出不来&#xff0c;某个临时任务运行5分…...

Java DDD分层架构实战:从理论到代码落地

1. DDD分层架构的本质与价值 第一次接触DDD分层架构时&#xff0c;我盯着那个四层结构图看了整整半小时。当时刚做完一个电商促销系统&#xff0c;Service层堆了2000多行代码&#xff0c;各种if-else嵌套看得人头皮发麻。直到把业务逻辑按照DDD分层重新梳理后&#xff0c;才真正…...

别再踩坑了!PyInstaller打包后图标和文件丢失?一个函数搞定路径问题

PyInstaller打包实战&#xff1a;彻底解决资源路径问题的终极指南 当你第一次用PyInstaller打包Python程序时&#xff0c;那种兴奋感很快就会被一个残酷的现实击碎——程序在其他电脑上运行时&#xff0c;图标消失了&#xff0c;配置文件找不到了&#xff0c;数据文件也读不出来…...