Dapper: Un ORM diferente y muy rápido

[forCode]

En mi primera aportación a [forCode] voy a hablaros de Dapper.

¿Qué es Dapper?

Podríamos definir Dapper como un Micro ORM (o ORM ligero) que se encarga de manejar el acceso a datos, la ejecución de consultas y de operaciones de inserción, actualización y borrado de datos.

Entrando más en detalle podemos ver que Dapper es una clase estática llamada SqlMapper en la que podemos encontrar un conjunto de métodos extensores sobre la interfaz IDbConnection que nos van a permitir la ejecución de consultas genéricas (<T>) y las operaciones de modificación de datos de una forma sencilla. Hacer una extensión de la interfaz IDbConnection va a permitirnos que cualquier clase de conexión a base de datos que implemente dicha interfaz,por ejemplo: SqlConnection (entre otros), disponga de manera automática de todos estos métodos extensores.

Algunas de las cosas que me gustaría destacar dentro de Dapper son:

  • Ejecución de consultas parametrizadas: Uno de los principales problemas que podemos encontrarnos al hacer uso de bases de datos dentro de nuestras aplicaciones, es la inyección de SQL que a grosso modo es un problema que permite la ejecución de código no deseado en nuestras consultas a través de la incorrecta utilización de las comillas simples y la no utilización de parámetros en las consultas.
  • El automapeo de las consultas a los tipos en las consultas genéricas.
  • La ejecución de varias consultas en un único viaje.

Show me the Code!

Toda la explicación está muy bien… pero sin ejemplos esto no vale para nada, ¿verdad?

Vamos a partir de un pequeño ejemplo utilizando SQL Server:

Ejemplo 1: Obtención de datos

   var query = "SELECT [Id],[Role],[Username],[Password],[Email] "
               + "FROM [USER]";
   return _connection.Query<User>(new CommandDefinition(query)).ToList();

Ejemplo 2: Obtención de datos con parámetros

var query = "SELECT [Id],[Role],[Username],[Password],[Email] "
            + "FROM [USER] "
            + "WHERE [EMAIL] = @EMAIL";
var dynamicParameters = new DynamicParameters();
dynamicParameters.Add("@EMAIL", model.Email);
var data = _connection.Query(new CommandDefinition(query, dynamicParameters));

Ejemplo 3: Inserción de datos


public int Create(User model)
{
var query = "INSERT INTO [USER] ([ROLE],[USERNAME],[PASSWORD],[EMAIL]) "
           + "VALUES (@ROLE,@USERNAME,@PASSWORD,@EMAIL) "
           + "SELECT scope_identity()";

return _connection.ExecuteScalar<int>(new CommandDefinition(query, model));
}

¿Dónde encontrarlo?

La parte buena de Dapper es que podemos encontrarlo en Github, donde podemos ver todo el código fuente, quien hace aportaciones, pero lo que mas me gusta es que tu también puedes aportar tu granito de arena.

Si os preguntáis quien usa Dapper, os llevareis una grata sorpresa, ya que fue creado por y para ser usado en Stackoverflow!.

 

Espero que os guste y practiquéis con el.