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

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

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无疑是一个值得考虑的选择。

相关文章:

  • 基于MFC对话框吸管实验
  • 嵌入式初学-C语言-练习三
  • 【51单片机仿真】基于51单片机设计的整数/小数计算器系统仿真源码文档——文末资料下载
  • Leetcode第136场双周赛题解(c++)
  • 云原生应用程序简介
  • 《计算机网络》(第8版)第1章 概述 复习笔记
  • 【JavaScript】栈功能(先进后出)
  • WebSocket 协议介绍
  • 谷粒商城实战笔记-103~104-全文检索-ElasticSearch-Docker安装ES和Kibana
  • 什么是嵌入式
  • uniapp中实现语音识别(app+小程序)
  • C++解决:早餐组合
  • 抽象代数精解【4】
  • Web开发:用C#的逻辑理解VUE语法(VUE + Webapi小白开发笔记)
  • k8s安装ingress-nginx
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [case10]使用RSQL实现端到端的动态查询
  • 【前端学习】-粗谈选择器
  • 3.7、@ResponseBody 和 @RestController
  • ERLANG 网工修炼笔记 ---- UDP
  • Flannel解读
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Mocha测试初探
  • Vue.js-Day01
  • Vue2.0 实现互斥
  • 人脸识别最新开发经验demo
  • 微信开放平台全网发布【失败】的几点排查方法
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 原生Ajax
  • 怎么把视频里的音乐提取出来
  • !!Dom4j 学习笔记
  • ## 1.3.Git命令
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • (function(){})()的分步解析
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (区间dp) (经典例题) 石子合并
  • (十三)Maven插件解析运行机制
  • (学习日记)2024.01.09
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • . Flume面试题
  • .bat批处理(六):替换字符串中匹配的子串
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 5种线程安全集合
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • /proc/stat文件详解(翻译)
  • @ConditionalOnProperty注解使用说明
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [100天算法】-实现 strStr()(day 52)