.NET6之Mini API【二十五、Dapper】

内容纲要

注:如果你使用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进行增删改查

  1. using Dapper;
  2. using Microsoft.Data.SqlClient;
  3. var builder = WebApplication.CreateBuilder(args);
  4. builder.Services.AddScoped<IQuestionService, QuestionService>();
  5. var app = builder.Build();
  6. app.MapPost("/question", async (IQuestionService questionService, QuestionModel question) =>
  7. {
  8. return await questionService.AddQuestionAsync(question);
  9. });
  10. app.MapPut("/question", async (IQuestionService questionService, QuestionModel question) =>
  11. {
  12. return await questionService.ModifyQuestionAsync(question);
  13. });
  14. app.MapGet("/question/{id}", async (IQuestionService questionService, int id) =>
  15. {
  16. return await questionService.GetQuestionAsync(id);
  17. });
  18. app.MapDelete("/question/{id}", async (IQuestionService questionService, int id) =>
  19. {
  20. return await questionService.DeleteQuestionAsync(id);
  21. });
  22. app.Run();
  23. public interface IQuestionService
  24. {
  25. Task<QuestionModel> GetQuestionAsync(int id);
  26. Task<bool> AddQuestionAsync(QuestionModel question);
  27. Task<bool> DeleteQuestionAsync(int id);
  28. Task<bool> ModifyQuestionAsync(QuestionModel question);
  29. }
  30. public class QuestionService : IQuestionService
  31. {
  32. private readonly SqlConnection _connection;
  33. public QuestionService(IConfiguration configuration)
  34. {
  35. var connectionString = configuration.GetConnectionString("ExamDatabase");
  36. _connection = new SqlConnection(connectionString);
  37. }
  38. public async Task<bool> AddQuestionAsync(QuestionModel question)
  39. {
  40. var sql = @"INSERT INTO [Questions]
  41. ([Question]
  42. ,[Score]
  43. ,[QuestionTypeID]
  44. ,[SujectTypeID])
  45. VALUES
  46. (@Question
  47. ,@Score
  48. ,@QuestionTypeID
  49. ,@SujectTypeID)";
  50. return (await _connection.ExecuteAsync(sql, question)) > 0;
  51. }
  52. public async Task<bool> DeleteQuestionAsync(int id)
  53. {
  54. var sql = @"delete from questions where id=@id";
  55. return (await _connection.ExecuteAsync(sql, new { id })) > 0;
  56. }
  57. public async Task<QuestionModel> GetQuestionAsync(int id)
  58. {
  59. var sql = @"select * from questions where id=@id";
  60. return await _connection.QuerySingleAsync<QuestionModel>(sql, new { id });
  61. }
  62. public async Task<bool> ModifyQuestionAsync(QuestionModel question)
  63. {
  64. var sql = @"UPDATE [dbo].[Questions]
  65. SET [Question] = @Question
  66. ,[Score] = @Score
  67. ,[QuestionTypeID] = @QuestionTypeID
  68. ,[SujectTypeID] = @SujectTypeID
  69. WHERE ID=@ID";
  70. return (await _connection.ExecuteAsync(sql, question)) > 0;
  71. }
  72. }

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

关于更丰富多彩的Dapper使用,详见Github仓库说明文档:

https://github.com/DapperLib/Dapper

全部.NET6之MiniAPI-PDF版本下载地址 https://club.51aspx.com/circle/10569.html

.NET

.NET6之Mini API【二十四、用Polly重试】

2022-7-12 20:54:32

.NET

.NET6之Mini API【二十六、封装Dapper】

2022-7-12 21:06:49

0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧
个人中心
今日签到
私信列表
搜索