Dapper介绍及特性

一、Dapper介绍及特性
Dapper是一个.NET平台上的轻量级对象关系映射(ORM)工具,它通过扩展IDbConnection接口,提供了一系列的扩展方法来执行SQL查询并将结果映射到.NET对象中。Dapper以其高性能和简单易用著称,特别适合需要快速开发和对性能有较高要求的场景。
Dapper的主要特点
- 高性能:Dapper执行的是原始SQL查询,避免了复杂的查询生成过程,因此性能接近于手写ADO.NET代码。
- 简单易用:Dapper的API简洁直观,学习曲线低,可以快速上手。
- 轻量级:没有复杂的上下文管理和变化跟踪机制,减少了性能开销。
- 参数化查询:支持参数化查询,有效防止SQL注入攻击。
- 事务支持:支持事务处理,确保数据操作的一致性。
- 灵活性:允许开发者完全控制SQL语句,实现更复杂的查询逻辑。
Dapper的基本用法
- 查询数据:使用
Query方法执行SQL查询并返回结果集。 - 插入数据:使用
Execute方法执行插入操作。 - 更新数据:使用
Execute方法执行更新操作。 - 删除数据:使用
Execute方法执行删除操作。 - 存储过程:通过指定
commandType: CommandType.StoredProcedure来执行存储过程。
Dapper的高级功能
- 多映射:支持多表查询并将结果映射到多个对象。
- 动态对象:支持动态对象,适用于不确定返回结构的查询。
- 缓存功能:内置简单的缓存功能,可以提高查询性能。
Dapper的使用场景
Dapper适合于需要高效数据访问的应用场景,尤其是在已有数据库项目中快速集成和使用。它的优势在于高性能、简单易用和灵活性,但不适合复杂的业务逻辑处理场景,因为没有复杂的对象关系映射和LINQ支持。

二、安装Dapper
Dapper可以通过NuGet包管理器安装:
PM> Install-Package Dapper
Dapper的工作原理
Dapper通过扩展IDbConnection接口,提供了Query、Execute、QueryFirst、QueryFirstOrDefault、QuerySingle、QuerySingleOrDefault、QueryMultiple等一系列扩展方法来执行数据库操作。它缓存了SQL查询计划,减少了SQL解析和执行的开销。
Dapper与其他ORM框架的比较
与Entity Framework、NHibernate等ORM框架相比,Dapper在性能、易用性和配置灵活性方面具有优势,但在映射能力和LINQ支持方面则较为简单。与ADO.NET相比,Dapper提供了更简单的API和对象映射功能,但性能相当。
总的来说,Dapper是一个在性能和易用性之间找到平衡点的ORM框架,适合于多种数据库操作需求。
GitHub - DapperLib/Dapper: Dapper - a simple object mapper for .Net
https://github.com/DapperLib/Dapper
三、Dapper性能优势
Dapper 是一个高性能的微 ORM,它通过提供一组映射和查询扩展方法来使用。与 Entity Framework 或 NHibernate 这样的全功能 ORM 相比,Dapper 的性能优势主要体现在以下几个方面:
-
执行效率:Dapper 的性能接近原生 ADO.NET,因为它不会像其他 ORM 那样生成额外的查询来跟踪更改或处理延迟加载 。
-
轻量级:Dapper 作为一个微型 ORM,它不需要复杂的配置和上下文管理,这减少了内存消耗和性能开销 。
-
直接执行 SQL:Dapper 允许开发者编写原始 SQL 语句,这意味着可以精确控制查询和优化性能,避免了 ORM 自动生成的低效 SQL 语句 。
-
映射缓存:Dapper 能够缓存 SQL 查询结果的映射信息,这样在后续的查询中可以快速反序列化结果,提高了重复查询的性能 。
-
批量操作:Dapper 支持批量插入和更新操作,这些操作通常比逐条处理数据要快得多 。
-
避免不必要的对象创建:Dapper 只有在必要时才会创建对象,这意味着它能够最小化内存中对象的数量,从而提高性能 。
-
扩展性:Dapper 允许开发者通过扩展方法来增加新功能,而不需要改动核心库,这样可以保持库的轻量级和高性能 。
-
多数据库支持:Dapper 支持多种数据库系统,开发者可以根据项目需求选择最合适的数据库,而不会因为 ORM 的限制而牺牲性能 。
-
控制权:Dapper 提供了对 SQL 语句的完全控制权,开发者可以优化查询以适应特定的数据库和索引设计,从而获得更好的性能 。

四、Dapper支持哪些数据库
- SQL Server:通过使用
System.Data.SqlClient.SqlConnection来连接SQL Server数据库。 - MySQL:通过使用
MySql.Data.MySqlClient.MySqlConnection来连接MySQL数据库。 - PostgreSQL:通过使用
Npgsql.NpgsqlConnection来连接PostgreSQL数据库。 - SQLite:通过使用
System.Data.SQLite.SQLiteConnection来连接SQLite数据库。 - Oracle:通过使用
Oracle.ManagedDataAccess.Client.OracleConnection来连接Oracle数据库。 - IBM DB2:可以通过使用
System.Data.OleDb.OleDbConnection(或其他相应的DB2连接类)来连接IBM DB2数据库。
五、示例代码
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Dapper;public class Program
{private static readonly string ConnectionString = "your_connection_string_here";public static void Main(){// 查询示例var users = QueryUsers();Console.WriteLine("查询到的用户:");foreach (var user in users){Console.WriteLine($"ID: {user.Id}, Name: {user.Name}");}// 插入示例var newUser = new User { Name = "John Doe" };int affectedRows = InsertUser(newUser);Console.WriteLine($"插入新用户,影响行数:{affectedRows}");// 更新示例newUser.Name = "Jane Doe";affectedRows = UpdateUser(newUser);Console.WriteLine($"更新用户,影响行数:{affectedRows}");// 删除示例affectedRows = DeleteUser(newUser.Id);Console.WriteLine($"删除用户,影响行数:{affectedRows}");}public static List<User> QueryUsers(){using (var connection = new SqlConnection(ConnectionString)){return connection.Query<User>("SELECT * FROM Users").ToList();}}public static int InsertUser(User user){using (var connection = new SqlConnection(ConnectionString)){string sql = "INSERT INTO Users (Name) VALUES (@Name);";return connection.Execute(sql, user);}}public static int UpdateUser(User user){using (var connection = new SqlConnection(ConnectionString)){string sql = "UPDATE Users SET Name = @Name WHERE Id = @Id;";return connection.Execute(sql, user);}}public static int DeleteUser(int id){using (var connection = new SqlConnection(ConnectionString)){string sql = "DELETE FROM Users WHERE Id = @Id;";return connection.Execute(sql, new { Id = id });}}
}public class User
{public int Id { get; set; }public string Name { get; set; }
}相关文章:
Dapper介绍及特性
一、Dapper介绍及特性 Dapper是一个.NET平台上的轻量级对象关系映射(ORM)工具,它通过扩展IDbConnection接口,提供了一系列的扩展方法来执行SQL查询并将结果映射到.NET对象中。Dapper以其高性能和简单易用著称,特别适合…...
LeetCode 149. 直线上最多的点数
LeetCode 149. 直线上最多的点数 给你一个数组 points ,其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1: 输入:points [[1,1],[2,2],[3,3]] 输出:3 示例 2: 输入&…...
案例研究丨国控星鲨利用DataEase释放数据潜能,重塑业务视野
国药控股星鲨制药(厦门)有限公司(以下简称为国控星鲨)始创于1952年,前身为厦门鱼肝油厂,距今已经有70余年历史,是国家商务部认定的“中华老字号”企业。2011年,国药控股与厦门轻工集…...
网络基础概念和 socket 编程
网络基础概念和 socket 编程 学习目标: 了解 OSI 七层模型、TCP/IP 四层模型结构了解常见的网络协议格式掌握网络字节序和主机字节序之间的转换理解 TCP 服务器端通信流程理解 TCP 客户端通信流程实现 TCP 服务器端和客户端的代码 推荐一个非常好的学习资料仓库 协…...
TypeScript 中的接口、泛型与自定义类型
TypeScript 是一种超集语言,它为 JavaScript 添加了静态类型检查。通过 TypeScript,开发者可以获得更好的工具支持,并且能够编写出更加健壮的代码。本文将探讨 TypeScript 中的几个关键特性:接口、泛型以及如何创建自定义类型。 …...
常州威雅学校:跟随这场音乐盛宴,溯回她的音乐之路
时同学 常州威雅2021届毕业生 英国皇家北方音乐学院 钢琴系 西太湖畔清凉的晚风送来阵阵悦耳的钢琴声,时同学在母校的个人钢琴独奏悄然拉开序幕。这是她自毕业三年后,在常州威雅的首场钢琴独奏会。 随着第一个音符落下,她用手指在黑白键盘…...
【YashanDB知识库】由于hist_head$中analyze time小于tab$中analyze time导致的sql语句执行慢
本文内容来自YashanDB官网,具体内容请见https://www.yashandb.com/newsinfo/7459465.html?templateId1718516 问题现象 某局点yashandb cpu使用率100%,经线上分析是由于几个sql执行慢,其中一个sql为简单的单行等值绑定变量过滤排序。 经分…...
【有啥问啥】深度理解主动学习:机器学习的高效策略
深度理解主动学习:机器学习的高效策略 在大数据时代,数据量的爆炸性增长与有限的标注资源之间的矛盾日益凸显。如何高效地利用标注资源来训练高质量的模型,成为了机器学习领域亟待解决的问题。主动学习(Active Learning, AL&…...
智能守护者X100 - 自动化生产线智能机器人安全监控管理系统
1.产品介绍 产品名称: 智能守护者X100 - 自动化生产线智能机器人安全监控管理系统 主要功能: 全方位实时监控:智能守护者X100采用高清摄像头与红外夜视技术,实现对自动化生产线及智能机器人的360无死角监控。系统能自动识别并追踪生产线上的机器人活动轨迹,确保生产安全…...
harmonyos面试题
你在项目中用过线程通信吗,线程是怎么进行通信的? 页面的生命周期有哪些? UAbility的生命周期呢? 你在项目中使用首选项主要用来数什么 组件通信的方式有息些 弹室UI是怎么在页面UI中使用的 常用的修饰符有愿些介绍一下 缓冲区是什么与16进制和数组有什么关…...
神经网络介绍及其在Python中的应用(一)
作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~ 个人主页:小高要坚强的博客 当前专栏:Python之机器学习 本文内容:神经网络介绍及其在Python中的线性回归应用 作者“三要”格言:要坚…...
数据流处理技术与Flink框架
一数据流 数据流定义: 数据流(Data Stream)是指数据以连续不断的方式到达和处理的序列。在现实世界中,许多数据来源都是以流的形式存在,比如: 1. 用户行为:用户在网站上的点击流、移动应用中…...
qt中QTatlewidget类常用操作表格的函数有哪些?
在Qt中,QTableWidget 类提供了丰富的函数来操作表格数据。以下是一些常用的操作表格的函数: 1. 初始化与配置 构造函数:QTableWidget(int rows, int columns, QWidget *parent nullptr):创建一个指定行数和列数的表格控件。设置…...
Linux上的C/C++编程
Linux上的C/C编程 yum软件包管理器Linux编辑器-vimvim命令模式指令集vim末行模式指令集 gcc/g的使用Linux自动化编译工具-make/MakefileLinux调试器-gdb调试命令 多人合作工具git yum软件包管理器 yum 是Linux上常用的包管理器,类似于Windows上的“应用商店”。 语…...
注意 秋季饮酒的正确打开方式
选择合适的白酒1.秋季气候干燥,适合选择一些口感醇厚、温润的白酒。比如酱香型白酒,它具有浓郁的香气和醇厚的口感,能在秋季给你带来温暖的感觉。2.浓香型白酒也是不错的选择,香气扑鼻,口感绵甜,能为秋季增…...
Python如何配置环境变量详解
一、概述 前提:已安装 Python,如下图: 1.1 检查是否已配置成功(选) 1 2 3 4 5 1. 打开运行窗口 (1) 快捷键 : Win r,并输入 cmd (2) 直接输入: Python 2. 若有下列提示,即为 安装成功…...
Linux驱动开发(速记版)--并发与竞争
第十八章 并发与竞争 18.1 并发与竞争 18.1.1 并发 早期计算机 CPU单核心时,由于 CPU执行速度快于I/O操作,常因等待 I/O而空闲。 为提高 CPU利用率,引入了并发执行理论。并发通过算法在CPU执行I/O等待时切换至其他任务,使多个任…...
AI赋能,数字技术服务平台促进产业协同发展
在当今数字化浪潮席卷全球的时代,数字技术服务平台应运而生,成为推动各行业发展的强大引擎。数字技术服务平台是一个汇聚了众多先进数字技术和资源的综合性服务体系。它就像是一个功能强大的百宝箱,为用户提供了全方位的数字技术支持。 在这…...
RabbitMQ下载安装运行环境搭建
RabbitMQ运行环境搭建 1、Erlang及RabbitMQ安装版本的选择2、下载安装Erlang2.1、下载Erlang2.2、安装Erlang2.2.1、安装Erlang前先安装Linux依赖库2.2.2、解压Erlang压缩包文件2.2.3、配置2.2.4、编译2.2.5、安装2.2.6、验证erlang是否安装成功 3、RabbitMQ下载安装3.1、下载3…...
Redis过期时间删除策略详解
文章目录 Redis过期时间删除策略详解一、引言二、Redis过期键删除策略1、定时删除2、惰性删除3、定期删除 三、Redis实际采用的策略1、惰性删除Java 伪代码 2、定期删除Java 伪代码 四、总结 Redis过期时间删除策略详解 一、引言 在许多应用程序中,我们经常需要缓…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
