.NET6之MiniAPI(二十五):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進行增刪改查
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 提的最多的数据库“索引”,先来简单了解一
- 下一篇: ASP.NET Core 6.0对热重载