Dapper Nedir?

Selamlar;

Bugün Micro Ormler içinde en hızlısından biri olan Dapper’ı bir Mvc projesi ile inceleyeceğiz. Aşağıda hızı ile ilgili performans testi gözükmektedir.

dapper

Genelde Orm araçları biraz hantal çalışır. Özellikle yoğun trafik alan portallarda pek de tercih edilmez. Ancak bu gibi durumlarda bir “Micro Orm” bir çok soruna çözüm olabilir. Örneğin “Dapper“sadece tek bir “Dll”dir. Çok hızlıdır. LightWeight dir. Yani, ne mapping yapmak için bir ara yüzü vardır ne de herhangi bir konfigurasyon dosyasına ihtiyaç duymaktadır. Kısaca basit ve çok hızlıdır. Ayrıca bize aynı entity framework’de olduğun gibi kolayca Query yazma olanağı sağlamaktadır. Bana en güven veren durumlardan biri de “Stack Overflow” geliştiricileri tarafından yazılmış olan bir Orm Tool’u olmasıdır.

Nuget’den aşağıdaki paket indirilerek kolaylıkla “Dapper” projeye eklenebilir.

Dapper

Dapper projeye eklendikten sonra referanslar kısmına bakıldığında, aşağıdaki dosyadan başka birşey gözükmemektedir:)

dapperRef

Şimdi gelin pocolarımızı yani Data Modellerimizi oluşturalım. Yorum ve Kategori sınıfları aşağıdaki gibi tanımlanır. Bu sınıflar “HaberContext” adındaki bir MsSql database’deki tablolara karşılık gelmektedir. Dapper’da işlem yapılacak DB’deki tabloların sınıf karşılıkları ilgili projede tek tek tanımlanmalıdır.

Mvc projesine aşağıdaki kütüpahaneler eklenir.

Web.config dosyasına tanımlanan “connection string” local bir makina için aşağıdaki gibidir.

Dapper’da öncelikle bir “SqlConnection” tanımlanmalıdır. Daha sonra aşağıdaki örnek de olduğu gibi ilgili connection içinde istenen “Query”ler çekilebilir. İlgili örnekte “Join” işlemleri yapılarak 2 farklı tablodan bilgi çekilebilir. Ayrıca 2 farklı sorgu ile birden fazla query result dönülebilir. Çoklu sorgu çekmek için Dapper’da “QueryMultiple()” methodu kullanılır. Ayrıca asenkron yapıyı da “Dapper” desteklemektedir. Dönen farklı query resultlar, herbir Query sonucu için “Read()” methodu çalıştırılarak sıra ile alınabilir. Örneğin aşağıdaki örnekte “Habers” ve “Kategoris” tablolarından ayrı ayrı sorgular çekilmiştir.

GetYorumByHaber: MsSql tarafında haber’e ait yorumları çekmek için yazılan procedure.

Dapper’da Procedure Desteği: Aşağıda görüldüğü gibi “GetYorumHaber” procedure ile girilen “HaberID” parametresine göre ilgili yorumlar asenkron olarak çekilmektedir. Ayrıca procedure’ün dönüş tipinin “<Yorum>” olduğu aşağıda görüldüğü gibi belirtilmiştir.

SaveCommand: Haber’e ait yorumun kaydedilmesi amacı ile yazılan procedure.

Procedure’e Dynamic Parameter Tanımlama: “Dynamic” parametre tanımı ile procedure’e yeni oluşturulan “Yorum” sınıfı parametre olarak atanır. “Parametre”‘ye atanan her bir değişkenin data tipi “DbType” ile  belirtildikten sonra “@” ile başlıyan procedure’deki adı ile ilgili isim atanır.”@Id” parametresi “OutPut” parametre olarak atanmıştır. Yeni oluşturulan yorum sınıfı “SaveCommand” procedure ile kaydedilmiş ve bu yeni “Yorum” kaydına ait ID değeri “parameter.Get<int>(‘@id’)” methodu ile çekilerek, yeni oluşturulan yorum sınıfının “id” değerine atanmıştır.

Dapper’da Insert: “Insert” cümleciği ile “Yorum” sınıfına ait propertyler “@” işareti ile başlıyan değişkenler ile tanımlanmış alanlara parametre olarak yeni oluşturulan yorum sınıfı(yrm3) atanmıştır. Son olarak “Select SCOPE_IDENTITY” ile insert edilen en son yorum datasının “@@identity” degeri yani “id” kolonu geri dönülür.

Böylece gerçekten çok hızlı olan Micro Orm Dapper’ı hep beraber inceledik. Pocoların tanımlanması ve yazılacak Queryler biraz daha zahmetli olmasına karşılık sadeliği ve performansı ile kesinlikle tercih edilebilir.

Geldik bir makalenin daha sonuna. Yeni bir makalede görüşmek üzere hoşçakalın.

Herkes Görsün:

Sevebilirsin...

10 Yanıt

  1. Yiğit dedi ki:

    Hocam elinize saglik.
    Benim icin cok faydali bir teknoloji ogrenimi oldu.

    Tesekkurler.

  2. Kaan dedi ki:

    Anladığım kadarıyla githubtaki readmesini incelediğimde .Nette Ado.Net karşılığına geliyor diyebiliriz. Query lerde linq’dan farklı olarak syntax biraz farklı görünüyor. Onun dışında multi thread işlemlerde EF de de batch Request yapabiliyorsunuz, burada bir farkı göremedim. Asıl sorum micro ORM’ler gerçekten büyük projelerde de beklenen performansı sağlıyor mu?

    • borsoft dedi ki:

      Selam Kaan,

      Queryler bildiğin MsSql Query. Ve soruna gelince evet zaten büyük projelerde performans amaçlı kesinlikle kullanılıyor. Mesela stackoverflow.com bunlardan biri.
      Bence yeterince güven verici.

      İyi çalışmalar.

  3. Hüseyin Özgül dedi ki:

    Merhabalar,

    Daha önce test etme imkanı bulduğum Uni.ORM yi de bir inceleyip yorum yaparsanız sevinirim.

  4. Romario dedi ki:

    StackExchange kullanıyorsa muhakkak kullanışlı birşeydir. Görüldüğü kadarıyla DB bağlantısı ve sorgular için kodlama elle yapılan , onun haricindeki ORM işlemlerini halleden birşey.

    Bu arada Benchmark listesinde Devexpress dahil edilmemiş gibi görünüyor. Devexpress’in eXpress Persistent Objects’inde (XPO) DB bağlantısı ve sorgular XPO’nun içinde gömülü.

  5. Faruk Yeşil dedi ki:

    Merhabalar,
    Performans gibi sıkıntınız varsa, Dapper güzel bir seçenek.
    İyi çalışmalar.

  6. Merhaba,

    Bloğunuzdaki her değerli yazıdan faydalanmaya çalışıyorum. Bu projede şunu yapabiliyor muyuz? Mesela bir güncelleme paketindeki execute sql kodlarını programın kendi veritabanına dump edebiliyor muyuz?

    Mesela mysql source çıktısından sqlite a veya sqlite dan sqlite a aktarabiliyor muyuz?

    Şimdiden çok teşekkürler.

    • borsoft dedi ki:

      Selamlar Halil,
      Öncelikle güzel yorumun için teşekkürler.
      Sadece Dapper kullanarak yukarıda yazdığın işleri doğrudan yapamazsın. Ya bu kümülatif dataları MSSql üzerinden atacaksın ya da bunlar için bir app yazıp tüm data kümesini istersen dapper kullanarak atacaksın.

      Yanlış anlamadı isem senin aradığın cevap bu.
      İyi çalışmalar.

      • Cevabınız için çok teşekkürler.

        Peki güncelleme paketlerini işleyebilmem için nasıl bir yöntem kullanmalıyım sizce? Yani güncelleme verirken 40 mb lik bir güncelleme paketinde database’i tekrardan güncelletmek yerine sadece eklediğim veya güncellediğim sql kodlarını gönderip güncelletebileceğim bir yöntem yok mudur? Tecrübeleriniz benim için çok değerli lütfen yardımcı olursanız ok sevinirim.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir