1. 程式人生 > 其它 >.NET6之MiniAPI(二十五):Dapper

.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] = @SujectTypeID
 WHERE 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

  想要更快更方便的瞭解相關知識,可以關注微信公眾號