Dapper Nedir? Nasıl Kullanılır ?

Kağan Saygın
4 min readJun 11, 2021

--

Micro ORM Kralı ve En Hızlısı Dapper ORM

Dapper Orm
Dapper MİCRO ORM

Dapper Nedir ?

Micro Ormlerin en hızlısı hatta King of Micro ORM ünvanına sahip olan Dapper’ı inceleyeceğiz. Dapper, Stack Overflow geliştiricileri tarafından yazılmış ve açık kaynak kodlu bir Micro Orm kütüphanesidir. Dapper Hafif - Light Weight bir yapısı olduğu için herhangi bir konfigürasyon dosyasına ihtiyacı yoktur ve tek DLL dosyasıdır.

Dapper Github: https://github.com/DapperLib/Dapper

Genelde performansa ihtiyaç duyduğumuz projelerde Orm araçları biraz yavaş kalabilir Entity Framework Core gibi.

Dapper, tüm nesne ilişkisel eşlemelerle karşılaştırıldığında ikinci en hızlı ORM’dir.

Speed Benchmark — Dapper vs EF Core 3

Dapper ve Entity Framework Core Select Sorgu Karşılaştırması
Dapper ve Entity Framework Core Insert Sorgu Karşılaştırması

Dapper Nasıl Kullanılır ?

.Net Core Web API ile Dapper kullanarak bir örnek yapalım.

Kurulum

Nuget paket yöneticisinden Dapper’ı kuralım.

Dilerseniz Package Manager Console aşağıdaki kodu yazarak da kurabilirsiniz.

Install-Package Dapper

Paketimiz kurulduğuna göre kullanımına geçebiliriz.

Dapper Kullanımı

Örneğimizde efsane Northwind veritabanını kullanacağız.

Models adında bir klasör oluşturuyoruz ve altına ürünlerimizin modeli olacak Product adında sınıf oluşturuyoruz.

public class Product
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public int SupplierId { get; set; }
public int CategoryId { get; set; }
public string QuantityPerUnit { get; set; }
public decimal UnitPrice { get; set; }
public int UnitsInStock { get; set; }
public int UnitsOnOrder { get; set; }
public int ReorderLevel { get; set; }
public bool Discontinued { get; set; }
}

Veritabanı bağlantımız için appsettings.json içerisine connection stringimizi ekliyoruz.

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Server= ;Database= ;User Id= ;Password= ;"
}
}

Controllers klasöründe ProductController oluşturuyoruz.

using Dapper;
using DapperExamples.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
namespace DapperExamples.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ProductController : ControllerBase
{
//appsettings içerisindeki connection stringimizi alıyoruz.
private readonly IConfiguration _configuration;
private string conn;
public ProductController(IConfiguration configuration)
{
_configuration = configuration;
conn = configuration.GetConnectionString("SqlConnection");
}
[HttpGet("getall")]
public IActionResult GetAll()
{
using (IDbConnection cnn = new SqlConnection(conn))
{
string sqlSelectProducts = "SELECT ProductId, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel FROM Products";
var result = cnn.Query<Product>(sqlSelectProducts).ToList();
return Ok(result);
}
return BadRequest();
}
}
}

Şimdi projemizi çalıştıralım ve Postman üzerinden bir test edelim.

Gördüğünüz gibi Dapper üzerinden Sql select sorgumuzu çalıştırdık ve ürünlerimizi listeledik. Eğer kodları yazdığınızda hata alıyorsanız System.Data.SqlClient ekli olmayabilir. Nugetten yükleyebilirsiz.

Dapper ile Veri Ekleme

Kullanıma geçmeden önce önemli bir hatırlatma yapmak isterim. Dapper kullanırken sql sorgularının saf halini yazıyoruz bu da bize SQL INJECTION zafiyetini oluşturacaktır, sorgularımızı parametreli olarak yazmalıyız.

Insert Sorgumuz

string sqlAddProducts = "INSERT INTO Products (ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued) VALUES (@ProductName,@SupplierID,@CategoryID,@QuantityPerUnit,@UnitPrice,@UnitsInStock,@UnitsOnOrder,@ReorderLevel,@Discontinued)";//Burada sorgumuzu parametreleri ile çalıştırıyoruz.
var result = cnn.Execute(sqlAddProducts, new
{
ProductName = product.ProductName,
SupplierID = product.SupplierId,
CategoryID = product.CategoryId,
QuantityPerUnit = product.QuantityPerUnit,
UnitPrice = product.UnitPrice,
UnitsInStock = product.UnitsInStock,
UnitsOnOrder = product.UnitsOnOrder,
ReorderLevel = product.ReorderLevel,
Discontinued = product.Discontinued
});

Kodlarımızı şu şekilde toparlıyoruz.

[HttpPost("add")]
public IActionResult Add(Product product)
{
using (IDbConnection cnn = new SqlConnection(conn))
{
string sqlAddProducts = "INSERT INTO Products (ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued) VALUES (@ProductName,@SupplierID,@CategoryID,@QuantityPerUnit,@UnitPrice,@UnitsInStock,@UnitsOnOrder,@ReorderLevel,@Discontinued)";
//Burada sorgumuzu parametreleri ile çalıştırıyoruz.
var result = cnn.Execute(sqlAddProducts, new
{
ProductName = product.ProductName,
SupplierID = product.SupplierId,
CategoryID = product.CategoryId,
QuantityPerUnit = product.QuantityPerUnit,
UnitPrice = product.UnitPrice,
UnitsInStock = product.UnitsInStock,
UnitsOnOrder = product.UnitsOnOrder,
ReorderLevel = product.ReorderLevel,
Discontinued = product.Discontinued
})
return Ok("Ürün Eklendi");
}
return BadRequest();
}

Projemizi çalıştırıp postman ile test edelim.

Ürün Eklendi
Ürün listemizde Elma ürünümüz listeniyor.

--

--