Dapper – proste i wydajne narzędzie ORM

Nie opisywałbym kolejnego ORM na blogu, ale myślę, że warto zapoznać się z Dapper, ponieważ jest to dość specyficzna biblioteka. Celem Dapper jest prostota i wydajność. Nie może on zastąpić EntityFramework czy nHibernate, ale w wielu przypadkach, nie musimy korzystać z tak ciężkich i zaawansowanych rozwiązań.

Cały kod źródłowy jest dostępny w jednym pliku:

https://github.com/StackExchange/dapper-dot-net/blob/master/Dapper%20NET40/SqlMapper.cs

Osobiście preferuję jednak NuGet:

image

Załóżmy, że obiekt, który chcemy zmapować wygląda następująco:

class Person { public string FirstName { get; set; } public string LastName { get; set; } }

Dapper to nic innego jak metody rozszerzające dla IDbConnection. Jedną z tych metod jest Query:

SqlConnection sqlConnection = new SqlConnection(@"Server=PIOTR-PC\SQLEXPRESS;Database=Test;Trusted_Connection=True;"); Person[] persons = sqlConnection.Query<Person>("select * from Persons").ToArray(); foreach (Person person in persons) { Console.WriteLine("{0} {1}",person.FirstName,person.LastName); }

Powyższy kod to wszystko, co potrzebujemy, aby zmapować tabelę na obiekt POCO. W Query jako typ generyczny przekazujemy Person, a jako parametry zapytanie SQL. Co więcej (odradzam) możemy skorzystać z dynamic:

SqlConnection sqlConnection = new SqlConnection(@"Server=PIOTR-PC\SQLEXPRESS;Database=Test;Trusted_Connection=True;"); dynamic[] persons = sqlConnection.Query<dynamic>("select * from Persons").ToArray(); foreach (dynamic person in persons) { Console.WriteLine("{0} {1}",person.FirstName,person.LastName); }

W każdym razie w większości przypadków nie będziemy korzystać z dynamic.  Dapper implementuje jeszcze metodę Execute:

public static int Execute(this IDbConnection cnn, string sql, object param) { return Execute(cnn, sql, param, null, null, null); }

Korzystamy z niej, gdy chcemy wykonać SQL, a nie interesuje nas wynik (np. Insert albo Update).

Jak widać, Dapper jest prosty i co za tym idzie, wydajność jest wysoka. Wyniki testów wydajnościowych można przeczytać w oficjalnej dokumentacji. W każdym razie jest niewiele wolniejszy od czystego ADO.NET (SqlConnection). Ze względu na fakt, że Dapper to nic innego jak metody rozszerzające, wszystkie typy baz danych są wspierane.

W Dapper nie ma konfiguracji mapowania. Jeśli kolumny w bazie nie pokrywają się z nazwami właściwości, wtedy możemy:

Person[] persons = sqlConnection.Query<Person>("select FirstName,LastName as Surname from Persons").ToArray();

Moim zdaniem, rozwiązanie doskonałe, gdy zależy nam na wydajności, a nie chcemy korzystać z czystego SqlConnection.

Więcej przykładów można znaleźć tutaj:

https://github.com/StackExchange/dapper-dot-net/blob/master/Tests/Tests.cs

4 thoughts on “Dapper – proste i wydajne narzędzie ORM”

  1. A ja mam pytanie,
    czy ktoś korzystał z Dapper’a i OrmLite’a,
    i może pokusić się o jakieś porównanie, wnioski, wrażenia?
    Głównie chodzi mi o wydajność, użytecznośc, prostote.

    Sam w jednym projekcie rozważałem Dapper’a,
    ale ostatecznie wybrałem OrmLite.
    Nie było problemów, ale nie było też dużych wymagań,
    chodziło o zmapowanie 3 prostych tabel.

  2. W jednym z projektów pracowałem z Dapperem.
    Ogólnie microORM całkiem fajny, szybszy od EF, trochę się trzeba namęczyć przy mapowaniu złożonych obiektów, ale i to da się zrobić (trzeba również odpowiednio napisać zapytania SQL bo inaczej albo wyrzuci wyjątek, albo w danym property zwróci nulla). Poza tym jak ktoś zna ADO to z Dapperem raczej nie będzie miał problemów.

Leave a Reply

Your email address will not be published.