注:如果你使用Dapper一段时间了,这篇你可以跳过去了

在第十二篇中,我们聊过官方的ORM——EntityFramework,它可以把SQL细节都隐藏,这对于一些标准化的关系数据库项目非常便捷。今天,介绍另外一个流行的ORM——Dapper,Dapper是通过扩展IDbConnection方法来达到对数据的处理的,特点是灵活,高效。

还是通过项目看看Dapper的使用。首先安装两个NuGet包,我们还是使用之前的Exam项目的表来说明Dapper使用,库是SQL Server。

安装Dapper和SqlClient:

Install-Package Dapper

Install-Package Microsoft.Data.SqlClient

下面是对Question进行增删改查

using Dapper;
using Microsoft.Data.SqlClient;var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IQuestionService, QuestionService>();
var app = builder.Build();app.MapPost("/question", async (IQuestionService questionService, QuestionModel question) =>
{return await questionService.AddQuestionAsync(question);
});app.MapPut("/question", async (IQuestionService questionService, QuestionModel question) =>
{return await questionService.ModifyQuestionAsync(question);
});app.MapGet("/question/{id}", async (IQuestionService questionService, int id) =>
{return await questionService.GetQuestionAsync(id);});app.MapDelete("/question/{id}", async (IQuestionService questionService, int id) =>
{return await questionService.DeleteQuestionAsync(id);
});app.Run();public interface IQuestionService
{Task<QuestionModel> GetQuestionAsync(int id);Task<bool> AddQuestionAsync(QuestionModel question);Task<bool> DeleteQuestionAsync(int id);Task<bool> ModifyQuestionAsync(QuestionModel question);
}
public class QuestionService : IQuestionService
{private readonly SqlConnection _connection;public QuestionService(IConfiguration configuration){var connectionString = configuration.GetConnectionString("ExamDatabase");_connection = new SqlConnection(connectionString);}public async Task<bool> AddQuestionAsync(QuestionModel question){var sql = @"INSERT INTO [Questions]([Question],[Score],[QuestionTypeID],[SujectTypeID])VALUES(@Question,@Score,@QuestionTypeID,@SujectTypeID)";return (await _connection.ExecuteAsync(sql, question)) > 0;}public async Task<bool> DeleteQuestionAsync(int id){var sql = @"delete from questions where id=@id";return (await _connection.ExecuteAsync(sql, new { id })) > 0;}public async Task<QuestionModel> GetQuestionAsync(int id){var sql = @"select * from questions where id=@id";return await _connection.QuerySingleAsync<QuestionModel>(sql, new { id });}public async Task<bool> ModifyQuestionAsync(QuestionModel question){var sql = @"UPDATE [dbo].[Questions]SET [Question] = @Question,[Score] = @Score,[QuestionTypeID] = @QuestionTypeID,[SujectTypeID] = @SujectTypeIDWHERE ID=@ID";return (await _connection.ExecuteAsync(sql, question)) > 0;}
}

通过上面事例,可以看到Dapper通过扩展IDbConnection的扩展方法来提供功能,基本上查询用Query<T>(sql,Param,...),增删改用Execute(sql,T,...),Dapper的方便之处是T全部是自运映射到sql中的参数的,这样就能做到sql我们可以灵活且更高效语法编写,参数可以方便的进出sql,达到一个平衡点。如下图示:

关于更丰富多彩的Dapper使用,详见Github仓库说明文档:https://github.com/DapperLib/Dapper

.NET6之MiniAPI(二十五):Dapper相关推荐

  1. .NET6之MiniAPI(二十九):UnitTest

    MiniAPI的单元测试与asp.net web api的单元测试大体是相同的(毕竟都是asp.net core),只是在小细节上有一些差异,文章中会说到这点. 本文测试框架是XUnit,Mock框架 ...

  2. .NET6之MiniAPI(二十四):用Polly重试

    为了保障系统的稳定和安全,在调用三方服务时,可以增加重试和熔断.重试是调用一次失败后再试几试,避免下游服务一次闪断,就把整个链路终止:熔断是为了防止太多的次数的无效访问,导致系统不可知异常. Poll ...

  3. .NET6之MiniAPI(二十二):HttpClient

    说明:本篇不是说明HttpClient怎么使用,而以分享在asp.net core mini api框架下,HttpClient的引入和使用方式. 我们在业务开发中,免不了调用三方的服务,这时就会用到 ...

  4. .NET6之MiniAPI(二十):实体验证FluentValidation

    为了验证api post上来的数据的有效性,我们可以引入FluentValidation(详见https://fluentvalidation.net).在asp.net mvc中,使用的是模型验证, ...

  5. .NET6之MiniAPI(三十):结束篇(附链接)

    不知不觉来到了<.NET6之MiniAPI>的第三十篇,回顾之前的篇幅,主要涉及如下: HTTP请求,应答 Request 桂素伟,公众号:桂迹.NET6之MiniAPI(二):reque ...

  6. 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 YARN通俗介绍和基本架构 Yarn通俗介绍 Yarn基本 ...

  7. VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池

    VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...

  8. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  9. linux exec 二程序,二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

最新文章

  1. 如何在SharePoint2007中实现下拉列表(DropDownList)的级联菜单效果
  2. lvs主从服务器转发风暴(广播风暴、大流量)
  3. Linux:文件描述符
  4. 【DP】【递归】分离与合体
  5. css32D、3D、动画、过渡
  6. RTT的线程同步篇——事件
  7. 阿里巴巴整理的python_阿里P8大佬整理的2020年最全99道python面试题,文末附答案...
  8. 【数据结构基础复习】二叉树的非递归遍历(二)
  9. 小兔的棋盘 (卡特兰数) 递推动规
  10. getHibernateTemplate()为NUll
  11. Python常用正则表达式语法和写法
  12. [模板]线性筛素数(欧拉筛法)
  13. 黑马程序员顺义校区php_2018黑马整套php视频教程
  14. 华为手机隐藏app图标_华为手机怎么隐藏应用图标
  15. linux 查看日志最后100行
  16. Linux实用命令杂集
  17. java调用百望税控NISEC_SKSC.dll发送xml报文
  18. 前端项目添加自定义icont图标步骤
  19. Kafka 如何给集群配置Scram账户认证
  20. 如何快速深度写论文?

热门文章

  1. tomcat不能多次startup.sh,异常时直接,分析logs目录下的日志。
  2. 5.1 入门整合案例(SpringBoot+Spring-data-elasticsearch) ---- good
  3. 最常用的动态sql语句梳理Mybatis(转)
  4. Android loading进度条使用简单总结
  5. Windows 8.1 新增控件之 CommandBar
  6. 【编程好习惯】将常量放在“==”之前
  7. 线切割机上的DOS系统
  8. Gestalt - 在浏览器里用 python/ruby 写客户端脚本
  9. 让Windows XP系统快上几倍的三个绝招
  10. [CQOI2012]模拟工厂 题解(搜索+贪心)