Acesso a dados em APIs com .NET 6, Dapper e SQL Server

Neste artigo vou falar sobre a biblioteca Dapper, explicar seus principais conceitos e apresentar um exemplo prático de uso, integrando com um banco de dados SQL.

O código-fonte é baseado no projeto desenvolvido na Jornada .NET Direto ao Ponto 6.0: https://github.com/luisdeol/poupadev-api/tree/artigo-dapper

Sobre o Dapper

O Dapper é um Micro ORM. Mas o que isso significa?

Vamos começar pelo conceito de ORM. ORM significa Object Relational Mapper, ou seja, uma ferramenta/biblioteca que auxilia no mapeamento entre o modelo relacional de bancos de dados (como SQL Server, ou PostgreSQL) para objetos que lidamos em nossas aplicações.

Ou seja, uma ORM auxilia em tarefas como abstrair a conversão entre tipos de dados em um banco de dados para tipos em nossa linguagem/plataforma.

Voltando ao ponto inicial. O Dapper é um Micro ORM, não tendo tantas funcionalidades/abstrações que um ORM completo como o Entity Framework Core tem. Enquanto ele foca no mapeamento de consultas para objetos, ele não tem algumas funcionalidades de ORM completos como Change Tracking, Lazy Loading, Migrations, entre outras.

Ele é composto basicamente por métodos de extensão em cima de um SqlConnection, simplificando bem mais o acesso a dados do que se estivéssemos usando o ADO.NET, por exemplo.

Existem alguns benefícios e razões de utilizar o Dapper, e deixo claro que aqui não estou fazendo comparações com outros ORMs e Micro ORMs. Alguns deles são naturais de ORMs.

  • Boa performance;
  • Sintaxe fácil para utilização com consultas SQL e Stored Procedures;
  • Praticidade ao utilizar métodos de extensão ao IDbConnection;
  • Funcionalidade de Bulk Insert;
  • Entre outros.

Ele tem suporte aos providers do ADO NET, ou seja, inclui SQLite, MySQL, PostgreSQL, MySQL, Oracle!

Principais métodos

Vou listar alguns dos principais métodos que você pode utilizar com o Dapper:

  • ExecuteScalar e ExecuteScalar<T>: executa uma consulta e retorna um único valor dela, podendo ser tipado ou não (retornando um dynamic);
  • Execute, ExecuteAsync: executa uma consulta e retorna um valor int representando o número de registros afetados;
  • QuerySingle, QuerySingle<T>, QuerySingleOrDefault, QuerySingleOrDefault<T>: utilizada quando se espera um único registrado retornado, sendo tipado ou não (dynamic). A versão que não contém “OrDefault” lança exceção caso tenha zero registros retornados, enquanto a que contém “OrDefault” retorna um valor padrão para o tipo definido;
  • Query, Query<T>, QueryAsync, QueryAsync<T>: executa uma consulta e retorna múltiplos registros, retornando IEnumerable<dynamic> (no caso de Query e QueryAsync) ou IEnumerable do tipo definido.

Exemplo Prático

A seguir, vou mostrar um exemplo prático em ASP.NET Core 6, realizando uma consulta e também um cadastro com Dapper.

Note que iniciamos com a instância de SqlConnection, utilizando uma cadeia de conexão de dados, e a partir daí já conseguimos utilizar os métodos de extensão que o Dapper oferece.

Outro ponto de atenção é que para a consulta de lista de registros eu utilizei o QueryAsync<T>, e para o INSERT eu utilizei o ExecuteScalarAsync. Com isso eu consegui tipar o retorno de registros, e no cadastro consigo obter o identificador recém gerado por nossa consulta.

Controller ASP.NET Core utilizando Dapper e EF Core

No código-fonte eu já utilizava o Entity Framework Core, e por razões didáticas eu deixei o GetPorId utilizando o DbContext do EF Core para mostrar que ambos podem coexistir em um sistema (e não é raro isso!).


Quer alavancar sua carreira como Desenvolvedor(a) .NET?

Além de Desenvolvedor .NET Sênior, eu sou instrutor de mais de 700 alunos e também tenho dezenas de mentorados.

Conheça o Método .NET Direto ao Ponto, minha plataforma com mais de 800 videoaulas, com cursos cobrindo temas relacionados a linguagem C# e Programação Orientada a Objetos, APIs REST com ASP NET Core, Microsserviços com ASP NET Core, HTML, CSS e JavaScript, Desenvolvimento Front-end com Angular, Desenvolvimento Front-end com React, JavaScript Intermediário, TypeScript, Formação Arquitetura de Software, Microsoft Azure, Agile, SQL, e muito mais.

Inclui comunidade de centenas de alunos, suporte por ela, plataforma e e-mail, atualizações regulares e muito mais.

Clique aqui para ter mais informações e garantir sua vaga


Conclusão

Neste artigo eu apresentei o Dapper, seus principais conceitos, métodos e como utilizá-lo na prática em uma API com ASP.NET Core 6.