Fala galera, o post de hoje é para tratar de um assunto de extrema importância e fonte eterna de perguntas para muitos desenvolvedores(eu incluso!), a escolha e o uso da biblioteca de mapeamento objeto relacional (ORM – Object-Relational Mapping) para seu projeto. Por definição um ORM é a técnica que você utilizará para converter um formato de dados em linguagem orientada a objetos, ou seja, como você vai transformar aquelas tabelas que criou no seu banco de dados favorito em classes/objetos para uso na linguagem que escolheu para sua aplicação. Conhecem o Dapper?!
No mercado existem centenas de opções conhecidas de ORM para os mais diversos bancos de dados e linguagem de programação, sendo os mais conhecidos o Hibernate/NHibernate , Java e .NET respectivamente, e o queridinho da Microsoft, o EntityFramework. A estrela de hoje é o micro-ORM open-source criado e utilizado pelo pessoal do Stackoverflow, o DotNet Dapper.
Abaixo segue meu primeiro contato com o Dapper e como funciona a criação de estruturas de consulta, gravação, atualização e exclusão de dados.
Instalando o Dapper com Nuget
A instalação é simples, acessar o gerenciador do Nuget(Manage Nuget Packages) no seu projeto, procura por Dapper na aba “Online”, até o momento que fiz este post a última versão é a 1.50.2 sw 22/07/2016. Feita a instalação, a dll irá aparecer nas referências do projeto e podemos começar.

Tela de gerenciamento de packages do Nuget.
Obs: ao rodar o Dapper instalado via nuget pode se deparar com um erro em “SqlMapper.cs”, neste caso recomendo baixar o projeto do github e adicionar manualmente os arquivos .cs direto no projeto de teste e compilar.
Criando um SELECT
Inicialmente vamos fazer um select básico em uma tabela, instanciamos uma conexão com a declaração using que irá gerenciar a abertura e fechamento da mesma, passamos a query em string para o método Query() e imprimimos a quantidade de linhas resultantes. Simples né?
string conString = ConfigurationManager.ConnectionStrings["Conexao"] .ConnectionString; Console.WriteLine(" ===== Projeto Dapper ====="); Console.WriteLine(); using (SqlConnection con = new SqlConnection(conString)) { var rows = con.Query("select * from ESTOQUE.Campanha"); Console.WriteLine("Número de campanhas: " + rows.Count()); }
Criando um SELECT com filtros
using (SqlConnection con = new SqlConnection(conString)) { var sql = @"select * from ESTOQUE.Campanha where idCampanha = @id"; using (var multi = con.QueryMultiple(sql, new { id = 15042015 })) { var campanha = multi.Read<Campanha>().Single(); Console.WriteLine("Nome da campanha: " + campanha.nmCampanha); } }
Criando um UPDATE
using (SqlConnection con = new SqlConnection(conString)) { var comando = @"update ESTOQUE.Campanha Set nmCampanha = @novoNome Where idCampanha = @idCampanha"; con.Execute(comando, new { novoNome = "CampanhaTeste01", idCampanha = 15042015 }); }
Criando um INSERT
using (SqlConnection con = new SqlConnection(conString)) { var campanha = new Campanha() { nmCampanha = "Camp01", dtInicio = DateTime.Now, dtFim = DateTime.Now.AddMonths(2), tipo = 6 }; var id = con.Query( @" insert ESTOQUE.Campanha(nmCampanha, dtInicio, dtFim, tipo) values (@nmCampanha, @dtInicio, @dtFim, @tipo) select cast(SCOPE_IDENTITY() as int) ", campanha).First(); }
Criando um DELETE
using (SqlConnection con = new SqlConnection(conString)) { var id = con.Execute("delete from ESTOQUE.Campanha where idCampanha = @id", new { id = 15042030 }); }
Obviamente que acima não está todo o poder do Dapper, os exemplos acima são bem simples e não exigem muito em termos de performance, mas então a pergunta que fica é se o ORM é eficiente quando se depara com consultas complexa e um volume grande de dados. Veja na tabela seguinte um benchmark feito com relação a outros métodos de consulta:
Método | Duração |
Hand coded (using a SqlDataReader) | 47ms |
Dapper ExecuteMapperQuery | 49ms |
ServiceStack.OrmLite (QueryById) | 50ms |
PetaPoco | 52ms |
BLToolkit | 80ms |
SubSonic CodingHorror | 107ms |
NHibernate SQL | 104ms |
Linq 2 SQL ExecuteQuery | 181ms |
Entity framework ExecuteStoreQuery | 631ms |
Fonte: https://github.com/StackExchange/dapper-dot-net
Veja que o Dapper se sai quase tão bem quanto uma consulta feita “na mão”, sem intermediários. Se você precisa de algo leve, rápido e fácil de usar, ao invés de usar o Entity Framework como normalmente faria, considere experimentar o Dapper para criar aquela “telinha” que o seu tio pediu.
Pingback: [Dapper] Objetos Complexos – Dicas e tutoriais em .NET
Fala Rodrigo, muito bom seu artigo, eu citei em um que eu criei específico para objetos complexos no Dapper.. https://thiagodevnet.wordpress.com/2017/09/13/dapper-objetos-complexos/
abraço!
CurtirCurtir
Agradeço o comentário e a referência Thiago, seu post sobre Dapper ficou bem claro e objetivo, parabéns. Espero ver mais posts seus em breve. 🙂
CurtirCurtido por 1 pessoa
Rodrigo, sou novo na programação, mas gostei muito da sua forma de abordar sobre o uso do Dapper. Estou com um dúvida que deve ser ridícula para você, mas não estou conseguindo encontrar uma resposta/exemplo que me ajude. Tenho uma tabela no SQL de nome TB_Volume, com as colunas Id (int – chave primária), Volume_Inferior (decimal) e Volume_Superior (decimal). Como faço para ler essas informações no SQL e gravar em um array (ou três) utilizando o Dapper, Estou trabalhando com c#. Antecipo agradecimentos.
CurtirCurtir
Uau. Bem massa esse esquema. Irei aplicar em próximos projetos! Obrigado.
CurtirCurtir