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

news2024/9/20 19:27:57

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

在C#开发领域中,数据访问层(DAL)的设计和实现是项目成功的关键之一。随着技术的演进,对象关系映射(ORM)框架因其能够简化数据库操作、提高开发效率而备受青睐。Dapper,作为一款专为.NET设计的轻量级ORM框架,以其高效的性能和简洁的API赢得了众多开发者的喜爱。本文将详细介绍Dapper在C#中的使用方法、核心原理以及在实际开发中的应用场景。

一、Dapper概述

Dapper是一个基于.NET平台的轻量级ORM框架,它通过扩展ADO.NET的IDbConnection接口,为开发者提供了一种简便的方式来执行SQL查询,并将查询结果映射到C#对象模型中。与Entity Framework等重量级ORM框架相比,Dapper更加轻量,没有复杂的上下文管理和变化跟踪机制,从而减少了性能开销。Dapper直接执行原生SQL查询,支持参数化查询,有效防止SQL注入,同时提供了丰富的功能来满足复杂的数据库操作需求。

二、Dapper的核心原理

Dapper的核心原理是通过扩展IDbConnection接口来简化数据访问过程。具体来说,它提供了QueryExecute等扩展方法,这些方法允许开发者以链式调用的方式执行SQL查询和命令,并将结果集映射到C#对象模型中。以下是Dapper工作的主要步骤:

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

三、Dapper的基本使用

1. 安装Dapper

在.NET项目中,你可以通过NuGet包管理器来安装Dapper。在Visual Studio中,你可以通过“工具”->“NuGet包管理器”->“程序包管理器控制台”输入以下命令来安装Dapper:

Install-Package Dapper
2. 执行SQL查询

Dapper提供了Query方法用于执行SQL查询并返回结果集。以下是一个简单的示例,展示了如何使用Dapper查询数据库中的学生信息:

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

在这个示例中,connectionString是数据库连接字符串,Student是一个C#类,其属性与数据库中的Students表列相对应。Dapper会自动将查询结果映射到Student对象的实例中。

3. 执行插入、更新和删除操作

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 });
}
  • 更新操作
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 });
}
  • 删除操作
using (IDbConnection db = new SqlConnection(connectionString))
{
    string sql = "DELETE FROM Students WHERE Id = @Id";
    var result = db.Execute(sql, new { Id = 1 });
}
4. 调用存储过程

Dapper也支持调用存储过程。以下是一个调用存储过程获取学生信息的示例:

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

四、Dapper的高级功能

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

1. 多表查询与结果映射

Dapper支持多表查询,并将结果映射到多个对象中。以下是一个示例,展示了如何将学生和班级信息一起查询并映射到相应的C#对象中:

string sql = "SELECT * FROM Students s INNER JOINClasses c ON s.ClassId = c.Id";

using (IDbConnection db = new SqlConnection(connectionString))
{
    var results = db.Query<Student, Class, StudentWithClass>(
        sql,
        (student, @class) =>
        {
            student.Class = @class;
            return student;
        },
        splitOn: "ClassId" // 假设ClassId是班级表的Id字段,用于分割结果集
    ).ToList();
}

// 定义StudentWithClass类
public class StudentWithClass : Student
{
    public Class Class { get; set; }
}

在上面的示例中,我们使用了Dapper的Query方法的重载版本来处理多表查询。我们传递了一个自定义的映射函数,该函数接受两个参数(StudentClass的实例),并将Class实例赋值给Student实例的Class属性。splitOn参数指定了用于分割结果集的字段名,Dapper将根据这个字段名来区分哪些列属于Student,哪些列属于Class

2. 动态参数

Dapper支持动态参数,这使得在构建SQL查询时更加灵活。你可以使用匿名类型或DynamicParameters类来传递参数。

using (IDbConnection db = new SqlConnection(connectionString))
{
    DynamicParameters parameters = new DynamicParameters();
    parameters.Add("@Name", "John");
    parameters.Add("@Age", 22);

    string sql = "SELECT * FROM Students WHERE Name = @Name AND Age = @Age";
    var students = db.Query<Student>(sql, parameters).ToList();
}
3. 事务处理

Dapper支持事务处理,允许你在单个事务中执行多个数据库操作。

using (IDbConnection db = new SqlConnection(connectionString))
{
    db.Open();
    using (IDbTransaction transaction = db.BeginTransaction())
    {
        try
        {
            // 执行插入操作
            string insertSql = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";
            db.Execute(insertSql, new { Name = "Jane", Age = 21 }, transaction);

            // 执行更新操作
            string updateSql = "UPDATE Students SET Age = Age + 1 WHERE Name = @Name";
            db.Execute(updateSql, new { Name = "John" }, transaction);

            // 提交事务
            transaction.Commit();
        }
        catch (Exception ex)
        {
            // 发生异常时回滚事务
            transaction.Rollback();
            throw;
        }
    }
}

五、Dapper的优势与不足

优势:
  1. 轻量级:与Entity Framework等重量级ORM框架相比,Dapper更加轻量,减少了性能开销。
  2. 高效:Dapper直接执行原生SQL查询,减少了ORM框架中的中间层转换,提高了执行效率。
  3. 灵活:Dapper提供了丰富的功能,支持多表查询、动态参数、事务处理等复杂数据库操作。
  4. 简洁:Dapper的API设计简洁明了,易于上手和使用。
不足:
  1. 需要编写SQL:与某些ORM框架不同,Dapper需要开发者自行编写SQL查询,这要求开发者对数据库有一定的了解。
  2. 缺乏变化跟踪:Dapper没有内置的变化跟踪机制,需要开发者自行管理实体的状态。
  3. 安全性:虽然Dapper支持参数化查询,但如果不正确使用,仍有可能导致SQL注入等安全问题。

六、总结

Dapper作为一款轻量级的ORM框架,在C#开发中展现出了其独特的优势。通过提供简洁的API和高效的性能,Dapper帮助开发者简化了数据访问层的开发过程。然而,它也需要开发者具备一定的数据库知识和SQL编写能力。在实际开发中,我们可以根据项目的需求和团队的实际情况来选择合适的ORM框架。对于追求高性能和灵活性的项目来说,Dapper无疑是一个值得考虑的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1977545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE 第2节 线程安全知识铺垫1

目录 一、通过jconsole.exe查看线程状态的方法 二、Thread类的几种常见属性 三、线程状态 一、通过jconsole.exe查看线程状态的方法 通过jconsole查看线程状态非常实用的方式 只要你安装了jdk&#xff0c;大致按照这个目录就可以找到这个可执行程序&#xff1a; 然后双击这…

YOLOv10改进 | 注意力篇 | YOLOv10引入24年最新的上下文锚注意力机制(CAA),并构建C2f_CAA(适用于小目标检测)

1. CAA介绍 1.1 摘要:遥感图像中的目标检测面临着越来越多的挑战,包括目标尺度的变化和背景的多样性。先前的方法试图通过扩大骨干的空间感受野来解决这些挑战,无论是通过大核卷积还是扩张卷积。然而,前者通常会引入相当大的背景噪声,而后者则会产生过于稀疏的特征表示。…

[CTF]-PWN:ORW题型综合解析

经典ORW&#xff1a; 例题&#xff08;极客大挑战 2019 Not Bad&#xff09;&#xff1a; 这里使用mmap函数创造了一个内存映射区域 从地址0x123000开始&#xff0c;大小位0x1000 权限为可写可执行&#xff08;可读0x1&#xff0c;可写0x2&#xff0c;可执行0x3&#xff09;…

Halcon 二维匹配

匹配&#xff1a;在训练图像中呈现一个所谓的模板。系统从这个模板中派生出一个模型&#xff0c;通过使用该模型来定位于搜索图像中的相似模板对象。此方法能够处理打光、杂乱、位置和旋转变换的图像。 匹配优点&#xff1a;鲁棒性和灵活性。匹配不需要对目标进行任何形式的分割…

50 选择结构

常见的选择结构有单分支选择结构、双分支选择结构、多分支选择结构及嵌套的分支结构&#xff0c;也可以构造跳转表来实现类似的逻辑。循环结构和异常处理结构中也可以实现带有 else 子句&#xff0c;可以看作特殊形式的选择结构。 所有的 Python 合法表达式都可以作为条件表达…

MySQL数据库入门:掌握数据管理的关键步骤!

前言 竹竹零将带您深入探索MySQL数据库的基础知识和实用技能&#xff0c;一同走进Java逻辑控制语句的 学习吧&#xff01;&#xff01;&#xff01; 本节目标 数据库的操作&#xff1a;创建数据库、删除数据库常用数据类型表的操作&#xff1a;创建表、删除表 1. 数据库的操作…

跨域以及解决方案

禹神&#xff1a;一小时彻底搞懂跨域&解决方案_哔哩哔哩_bilibili该直播回放对跨域的多种解决方案进行了梳理&#xff0c;内容包括&#xff1a;分析同源策略、分析预检请求、跨域的多种解决方案&#xff08;CORS、JSONP、代理&#xff09;、同时也从后端人员角度梳理了各种…

计算机毕业设计选题推荐-学生作业管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

一次性下发100w的优惠券/短信/二维码,兼顾线程池参数可配置

1、场景需求分析 针对6.18,11.11这种场景,平台一次性发布500w张优惠券,或者对于锁单用户统一发下100w张确认信息,同时我们平时有抢购茅台的场景,京东一次性发布10w个验证码,主要是针对高并发多线程大数据批处理任务的场景,一般用于二维码、优惠券、邮件、短信等场景。 …

MyBatis的适用场合与优势

MyBatis的适用场合与优势 1、适用场合2、优势 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、适用场合 SQL灵活控制&#xff1a; 适合需要精确控制SQL语句生成和执行的项目。 高性能需求&#xff1a; 对于性能要求高的系统&#xff0c;…

02:【stm32】工程模板的创建

工程模板的创建 1、创建工程文件2、创建STM32的启动文件3、Keil软件里面添加启动文件4、创建我们编写程序的文件夹5、创建存放标准库函数的文件夹6、Keil软件的一些设置 1、创建工程文件 2、创建STM32的启动文件 ①创建Start文件夹用来保存STM32的启动文件 ②下载STM32的固件库…

Apple在Swift中引入同态加密

--->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<--- 在计算过程中确保数据隐私和安全性很重要&#xff0c;尤其是在使用云服务。传统的加密方法要求在处理数据之前对数据进行解密&#xff0c;使其面临潜在风险。同态加密是隐私计算的分支&#xf…

C Primer Plus 第5章——第二篇

你该逆袭了 第5 章:重点摘录 三、表达式和语句1、表达式2、语句&#xff08;1&#xff09;副作用 和 序列点&#xff08;a&#xff09;副作用&#xff08;b&#xff09;序列点1、完整表达式 3、复合语句&#xff08;块&#xff09; 四、类型转换1、强制类型转换运算符2、总结&a…

修改 WSL 安装的子系统的位置,节约C盘空间

问题描述 由于 WSL 玩了一阵子&#xff0c;发现C盘的磁盘空间快没了&#xff0c;如下图所示 感觉以后还是不要磁盘分区了&#xff0c;全部在C盘也没什么不好的。 挪动子系统方法 如下图所示&#xff0c;为了方便演示&#xff0c;我们安装了 ubuntu 子系统&#xff0c;并且打…

快讯 | AI牙医震撼登场:15分钟完成牙冠准备,速度超人类8倍!

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

计算几何 点乘 两点间距离 两向量夹角

点乘 点乘&#xff08;也称为内积、标量积或数量积&#xff09;是线性代数中两个向量之间的一种运算&#xff0c;其结果是一个标量&#xff08;即一个单一的数&#xff0c;而不是向量&#xff09;。对于两个n维向量a(a 1 ,a 2 ,…,a n )和b(b 1 ,b 2 ,…,b n )&#xff0c;它们…

翻译: 梯度下降 深度学习神经网络如何学习一

在上一节影片里我讲解了神经网络的结构 首先我们来快速回顾一下 在本节影片里&#xff0c;我们有两个目标 首介绍梯度下降的概念 它不仅是神经网络工作的基础 也是很多其他机器学习方法的基础 然后我们会研究一下这个特别的网络是如何工作的 以及这些隐藏的神经元层究竟在寻找什…

【RDMA项目】如何使用rdma-core进行调用开发一个实战项目

RDMA (Remote Direct Memory Access) 是一种网络协议&#xff0c;可以在计算节点之间实现高效的内存数据传输&#xff0c;而无需CPU的干预。rdma-core 是 RDMA 的一个用户空间库&#xff0c;提供了一些简单易用的接口来使用 RDMA 功能。 开发了一套高级 RDMA&#xff08;远程直…

浅谈Trie树算法(c++)

文章目录 于是他错误的点名开始了题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路AC代码 01Trie求n个数两两异或的最大值AC代码 Nikitosh 和异或思路AC代码 The XOR-longest Path思路AC代码 又称字典树&#xff0c;用边来代表字母&#xff0c;而从根结…

《最终幻想14》手游版已获准在中国发行

上个月&#xff0c;有传言称史克威尔和腾讯正在合作开发前者大获成功的MMORPG《最终幻想14》的手机版。Niko Partners分析师丹尼尔艾哈迈德在推特上提到&#xff0c;中国国家新闻出版署已批准发行新一批进口游戏&#xff0c;其中包括《最终幻想14》的手机版&#xff0c;名为《最…