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 .Nethttps://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过期时间删除策略详解 一、引言 在许多应用程序中,我们经常需要缓…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

Ray框架:分布式AI训练与调参实践
Ray框架:分布式AI训练与调参实践 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 Ray框架:分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...