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与其他数据库操作框架的比较,以下通过表格进行说明:
| 特性 | Dapper | Entity Framework | NHibernate | ADO.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#中的使用方法,包括Dapper的基本概念、与其他持久层框架的比较、基本语法和高级语法的使用,并通过实例讲解了如何在项目中集成和使用Dapper。Dapper以其高效的性能和简洁的API受到开发者的青睐,适用于各种数据库操作需…...
Windows图形界面(GUI)-MFC-C/C++ - 编辑框(Edit Control) - CEdit
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 编辑框(Edit Control) - CEdit 基本概念 成员函数 示例代码 编辑框(Edit Control) - CEdit 基本概念 编辑框(Edit Control)是一个允许用户输入和编辑文本的窗…...
网络安全防御【IPsec VPN搭建】
目录 一、实验拓扑图 二、实验要求 三、实验思路 四、实验步骤: 修改双机热备的为主备模式: 2、配置交换机LSW6新增的配置: 3、防火墙(FW4)做相关的基础配置: 4、搭建IPsec VPN通道 (1…...
java环境配置与tomcat的配置
1、java环境配置 一、JDK下载 访问Oracle官网: 前往Oracle官网(Oracle | Cloud Applications and Cloud Platform),在首页的顶部菜单中选择“Resources” > “Downloads” > “Java” > “JDK”。注意:Orac…...
OD C卷 - 来自异国的客人/幸运数字
来自异国的客人/幸运数字(100) 输入描述: 输入k,n,m k表示物品价值(十进制) k>0 n表示幸运数字, n > 0 m表示异国采用的进制;m > 1 n < m 输出描述: 输出幸运数字的个数࿰…...
C++ | 动态内存管理 new、delete (用法、底层)详解
目录 简单回顾C语言动态内存管理 new、delete的用法 内置类型 new delete 自定义类型 new、delete底层讲解(重要) operator new 与 operator delete 定位 new 结语 简单回顾C语言动态内存管理 在C语言的学习阶段 我们接触到了三个能在堆上开辟…...
【C语言】结构体内存布局解析——字节对齐
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html 🎁代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、引言 二、什么是字节对齐&…...
模型表达方式
目录 一、模型表达概述 二、模型精确表达 2.1 几何表示 (Geometrical Representation) 三、模型非精确表达 3.1 网格表示 (Mesh Representation) 3.2 体素表示 (Voxel Representation) 一、模型表达概述 模型的表达方式多种多样,选择适合的表达方式取决于具体应用场景和…...
校园课程助手【4】-使用Elasticsearch实现课程检索
本节将介绍本项目的查询模块,使用Elasticsearch又不是查询接口,具体流程如图所示(如果不了解Elasticsearch可以使用sql语句进行查询): 这里是两种方法的异同点: Mysql:擅长事务类型操作&#…...
经典运维面试题
1、Linux常见的日志文件都有哪些,各自的用途?日志轮询配置文件在哪里?欢迎界面配置文件在哪里? /var/log/messages #内核及公共消息日志/var/log/cron #计划任务日志/var/log/dmesg #系统引导日志/var/log/malilog #邮件系…...
别再盲目推广了!Xinstall助你开启App线下推广新篇章
在这个数字化飞速发展的时代,App已经成为我们生活中不可或缺的一部分。然而,App市场的竞争也日益激烈,如何让你的App在众多竞争者中脱颖而出,成为每个推广者必须面对的问题。今天,就让我们一起探讨一下App线下推广的痛…...
大厂linux面试题攻略五之数据库管理
一、数据库管理-MySQL语句 0.MySQL基本语句: 1.SQL语句-增 创建xxx用户: mysql>create user xxx % indentified by 123456; xxx表示用户名 %b表示该用户用来连接数据库的方式(远程或本地连接) indentified by 123456设置密码…...
【pytorch】模型集成
在集成学习中,我们会训练多个模型(通常称为「弱学习器」)解决相同的问题,并将它们结合起来以获得更好的结果。最重要的假设是:当弱模型被正确组合时,我们可以得到更精确和/或更鲁棒的模型。 常用的模型集成…...
初识集合和数据结构
目录 初识集合框架数据结构基本概念和术语数据数据元素数据项数据对象前四者的关系数据结构逻辑结构和物理结构逻辑结构物理结构 算法算法设计要求 初识集合框架 Java的集合框架也可被称为容器,是定义在Java.util包下的一些接口和实现类。其就是将多个元素存储到一…...
cocos creator 3.x中动态加载 resources 文件夹下的图片时提示找不到
文件目录如下 类型为spriteFrame 代码案例 图片设置为 sprite-frame、texture 或其他图片类型后,将会在 资源管理器 中生成一个对应类型的资源。但如果直接加载 equipments/testea,得到的类型将会是 ImageAsset,必须指定路径到具体的子资源…...
第九十八周周报
学习时间: 2024.7.27-204.8.3 学习产出: 这周主要在按照审稿人的意见修改论文,由于有个模型保存的文件找不到了,所以重新训练花了点时间,目前已经把修改后的论文和cover letter发给杨老师了。...
程序员找工作之数据结构面试题总结分析
文章目录 1. 数据结构的基本概念与分类2. 数据结构的存储与表示3. 数据元素的存储与关系4. 存储结构的选择与考量5. 特定数据结构的定义与特性6. 数据结构操作与应用7. 数组与存储8. 特定数据结构的存储与访问 程序员在找工作面试中,数据结构方面可能会被问到的问题…...
设置provider解决maven找不到JUnit 5测试样例
问题描述 尝试复现一个用大模型生成测试样例的工作,但使用maven生成的JUnit 5测试样例死活不执行。又不想用命令行运行,因此进行排查 基本知识 <dependencies> junit-jupiter-api JUnit 5写代码时调用的库 junit-jupyter-engine 运行JUnit 5测…...
php反序列化靶机serial实战
扫描ip,找到靶机ip后进入 他说这是cookie的测试网页,我们抓个包,得到cookie值 base64解码 扫描一下靶机ip的目录 发现http://192.168.88.153/backup/,访问 下载一下发现是他的网页源码 通过代码审计,发现 通过代码审计得知&…...
类型推断技术及仓颉语言实践
史磊 仓颉语言类型推断技术专家 一、一种看待类型系统的方式 一门编程语言一定得包含类型系统吗? 这个问题今天看来可能显而易见,一个程序没有类型的话还能算是个完整、正确的程序吗?但是其实关于类型系统的作用,一直是存在两种…...
代码所有权的悖论:集体智慧与个人责任的边界
代码世界的身份迷局在软件测试的日常工作中,我们时常会陷入这样的困惑:当面对一行引发系统崩溃的代码时,究竟该追溯到最初编写它的开发者,还是问责于后续不断迭代维护的团队?当一个历经数十人之手、跨越数年周期的模块…...
【Midjourney 2026审美趋势白皮书】:基于127万组V6–V7生成样本的AI视觉演化模型预测
更多请点击: https://intelliparadigm.com 第一章:Midjourney 2026审美趋势白皮书导论 人工智能图像生成正从“可用”迈向“可策展”阶段。Midjourney v6.5 及其预发布的 Beta-2026 引擎已展现出对文化语境、跨媒介质感与时间性美学的深层建模能力——这…...
OSINT自动化框架openeir:模块化设计与情报收集流水线构建
1. 项目概述:一个面向开源情报的现代化工具箱最近在整理自己的技术栈时,发现一个挺有意思的项目,叫heyeir/openeir。乍一看这个名字,可能会有点摸不着头脑,但如果你对开源情报(OSINT)领域有所涉…...
研究生必备|5款主流文献引用工具深度测评:从课程论文到毕业答辩,哪款能让你省下20小时格式调整时间?
凌晨3点,你盯着Word里200多条参考文献发呆:导师刚通知改用APA格式,而你手动调了一整天的GB/T 7714全得推倒重来。投稿被拒,只因参考文献格式不符合期刊要求。课程论文、小论文、开题报告、毕业大论文……每一次都是格式地狱。本文…...
解决Modelsim SE 10.6c仿真Vivado 2019乘法器IP核的“.vhd only”难题(附完整脚本)
解决Modelsim SE 10.6c仿真Vivado 2019乘法器IP核的“.vhd only”难题(附完整脚本) 在FPGA设计流程中,Xilinx Vivado与Mentor Modelsim的组合是许多工程师的首选工具链。但当Vivado 2019生成的乘法器IP核仅提供VHDL接口文件(.vhd)时ÿ…...
使用remote2mac实现Windows远程开发macOS:VSCode SSH配置与优化指南
1. 项目概述与核心价值最近在折腾远程开发环境,特别是需要在不同操作系统间无缝切换时,遇到了一个挺典型的痛点:手头的主力开发机是Windows,但项目部署和测试环境往往是macOS或Linux服务器。传统的远程桌面方案要么延迟高得没法写…...
深度解析VinXiangQi:基于深度学习的中国象棋AI连线工具终极指南
深度解析VinXiangQi:基于深度学习的中国象棋AI连线工具终极指南 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi VinXiangQi是一款基于YOLOv5深…...
League Akari:英雄联盟玩家的终极智能助手,5大核心功能全面解析
League Akari:英雄联盟玩家的终极智能助手,5大核心功能全面解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为…...
我们给大模型接上了CI/CD流水线,测试通过率从60%飙升到95%
在软件测试领域,质量保障体系的进化从未停歇。当大语言模型(LLM)从实验性项目走向生产环境,测试团队面临一个尖锐的矛盾:模型迭代速度以天甚至小时计,而传统的人工评估与回归测试却需要数周。我们团队在将大…...
Corvus Robotics推出可在零下仓库中自主盘点库存的新型无人机
物理AI机器人系统提供商Corvus Robotics近日发布了Corvus One冷链版——一款专为在零下20华氏度至常温环境下持续运行而设计的自主库存管理系统。该系统专为抵御极端低温、气流、霜冻和冷凝水而打造,能够在无需人工干预的情况下,对库存进行高频次、高精度…...
