当前位置: 首页 > 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的高效和简洁使其成为处理简单到中等复杂度数据库操作的理想选择,但对于复杂的业务场景,仍需结合其他框架或工具进行综合使用。

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • NineData云原生智能数据管理平台新功能发布|2024年7月版
  • vue2怎么上传文件夹,并展示文件夹内的图片?
  • 7.怎么配置一个axios来拦截前后端请求
  • 计算机网络学习:TCP握手挥手强制连接中断
  • postman查询单条数据Get方法,无任何输出,idea后端也没有任何数据和提示的解决方法
  • Table SQL connectors以及FileSystem、JDBC connector
  • Redis学习[6] ——Redis缓存设计
  • 付费进群系统源码原版最新修复全开源版
  • C#中静态方法与动态方法的区别
  • Node Red 与axios简易测试环境的搭建
  • 用TensorFlow训练自己的第一个模型
  • 【传知代码】辅助任务改进社交帖子多模态分类(论文复现)
  • 离线安装MeterSphere遇到的问题
  • LabVIEW做二次开发时应该注意哪些方面?
  • TS中什么是字面量类型?
  • hexo+github搭建个人博客
  • 3.7、@ResponseBody 和 @RestController
  • es6--symbol
  • HashMap ConcurrentHashMap
  • JavaScript异步流程控制的前世今生
  • Java读取Properties文件的六种方法
  • js数组之filter
  • mysql innodb 索引使用指南
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Service Worker
  • Vim 折腾记
  • 检测对象或数组
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 嵌入式文件系统
  • 深入浏览器事件循环的本质
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 系统认识JavaScript正则表达式
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • "无招胜有招"nbsp;史上最全的互…
  • ###C语言程序设计-----C语言学习(6)#
  • (AngularJS)Angular 控制器之间通信初探
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (poj1.2.1)1970(筛选法模拟)
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)setTimeout 和 setInterval 的区别
  • .NET Core中的去虚
  • .NET Framework .NET Core与 .NET 的区别
  • .NET MVC之AOP