Dapper Nedir? Nasıl Kullanılır ?
Micro ORM Kralı ve En Hızlısı Dapper 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 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.
Kaynaklar: