Selamlar,
Dapper Nedir?
Dapper, Stack Overflow ekibi tarafından geliştirilmiş açık kaynak kodlu hafif (LightWeight) bir micro ORM aracıdır. Herhangi bir relation mapping (eşleme) yapmaz ya da konfigürasyon işlemi yoktur ve projeye nuget package olarak dahil edildiğinde tek bir .dll olarak eklenir.
Dapper GitHub projesine buradan, tüm işlevlerine ait örneklere (Tutorial) buradan ulaşabilirsiniz.
ORM de Nedir? Dediğinizi duyar gibiyim. Şöyleki; ORM (Object Relation Mapper) database ile model sınıflar arasında ilişki kurarak eşlemeyi sağlayan araçtır.
Bu sayede veritabanı nesneleri, sınıflar (class) ve sınıf özelliklerine (property) bağlandığından kod yazımı kolaylaşır ve standartlaşır.
Veritabanı tarafında herhangi bir değişim olduğunda ise migration update işlemi yapılarak eşleme güncellenmiş olur.
En bilinen ORM’ler olarak ise Entity Framework, NHibernate ‘i sayabiliriz.
Neden Başka Bir ORM Değil de Dapper?
Çünkü hızlı, hafif, kolay ve tip dönüşüm bağımlılığı yok. Yani doğrudan bir sql sorgusu yapıp .toList() metodu ile sorgu sonucunu herhangi bir Poco, Dto, model, dynamic ile dönebilirsiniz. Bu sayede işler çok daha hızlı ilerler. Aynı şekilde veriyi kabul ederken de bir modeli olduğu gibi atabilirsiniz yada sql sorgusu oluşturacak şekilde string birleştirme de yapabilirsiniz. CRUD işlemlerinde kolaylık sağlar.
Aynı zamanda SQL Server, MySQL, SQLite, SQLCE, FireBird gibi birçok veritabanı için desteği vardır.
Dapper’ın projeye dahil edilmesi ve kullanılması
Dapper kütüphanesini projenize dahil etmek için Visual Studio’da proje üzerinde sağ tuşa tıklayarak açılan menüden “Manage Nugget Packages” seçilir ve Browse sekmesinden Dapper yazılarak aratılır. Sonuçlardan Dapper seçilir ve kurulum yapılır. Kurum sonrasında Dapper kütüphanesi kendi metodlarını Connection objesine extended methodlar olarak ekler. Örneğin Query metodu gibi.
Dapper kütüphanesini projenize dahil ettikten sonra ilgili namespace’i sayfanıza dahil ederek kullanabilirsiniz.
Aşağıdaki örnekte, bir .Net Core Web API projesinde appsettings.json dosyasında connectionstring tanımı ve bu tanıma göre veritabanından stored procedure çağıran dapper Query metodu var.
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"dbConn": "Server=.;Database=testDb; User Id=sa; Password=12345;"
}
}
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using API.Entities.Concrete;
using API.Entities.Context;
using API.Entities.Dtos;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using API.Utilty;
using System.Reflection;
using Microsoft.Extensions.Configuration;
using Dapper;
using Microsoft.Data.SqlClient;
namespace API.Controllers
{
[Route("[controller]")]
[ApiController]
public class DataController : Controller
{
private readonly IConfiguration _configuration;
private string conStr;
public DataController(IConfiguration configuration)
{
_configuration = configuration;
conStr = _configuration.GetConnectionString("dbConn");
}
[HttpGet("getData/{dataId}")]
public async Task getData(string dataId)
{
IEnumerable items = new List();
using (var conn = new SqlConnection(conStr))
{
conn.Open();
items = conn.Query("exec spGetData " + dataId).ToList();
conn.Close();
}
return Ok(await Task.FromResult(items));
}
}
}
Yukarıdaki örnekte gördüğünüz gibi asenkron olarak çalışan getData metodu dataId parametresini alarak spGetData isimli stored procedure ü çağırıyor ve Query metodu ile sonucu dynamic türdeki obje ile geri dönüyor.
Eğer veritabanından dönen veriler farklı senaryolara göre farklı modelde olacaklarsa (tip bağımsız) dynamic kullanmanız işinizi kolaylaştıracaktır.
Bu örnek benzerinde Http Post metodu ile bir sınıf modeli (poco) parametre olarak gönderip yada query string ile gönderip işlemler yapabilirsiniz.
public class araba
{
public int id { get; set; }
public string marka { get; set; }
public int modelYili { get; set; }
}
araba arabaEkle = new araba();
arabaEkle.id = 1;
arabaEkle.marka = "Toyota";
arabaEkle.modelYili = 2021;
using (var conn = new SqlConnection(conStr))
{
conn.Open();
var result = conn.Execute("arabaEkleSp", arabaEkle, commandType: CommandType.StoredProcedure);
conn.Close();
}
Transactions, multi recordset (birden fazla sorgu sonucunu aynı anda getirmek), dynamic parameters, asenkron sorgular gibi bir çok özellik dapper ile kullanılabilmektedir.
Query, Execute, QueryFirst, QueryFirstOrDefault, QueryMultiple gibi çok kullanılan methodlarının dışında aynı methodların Async son eki ile biten asenkron olarak çalışan methodları da vardır.
Sağlıklı kalın.
“Micro ORM Dapper Nedir?” hakkında 4 yorum
güzel bir uygulama öğretiyor güzel
Teşekkürler Furkan Bey 🙂
Güzel anlatım. Teşekkürler hocam.
Rica ederim. Keyifli okumalar 🙂