Введение в ORM Dapper в C#
Доброго времени суток! Сегодня мы рассмотрим с Вами C# библиотеку Dapper, которая представляет из себя объектно-реляционный маппер (ORM), т.е. с помощью данной библиотеки Вы можете автоматически конвертировать (маппить, отображать) строки из таблицы базы данных в C# объекты.
Целями Dapper являются простота кода и производительность.
У Dapper нет специфичных для базы данных деталей реализации, он работает со всеми реализациями ADO .NET, в том числе SQLite, Firebird, Oracle, MySQL, PostgreSQL и SQL Server.
После такого краткого введения, давайте рассмотрим код простых примеров. Но для начала нам необходимо в проект (проект должен быть создана Вами для начала) добавить две библиотеки:
# сама библиотека Dapper
$ dotnet add package dapper
# драйвер для работы с SqlServer
$ dotnet add package System.Data.SqlClient
Пример таблицы и данных, с которыми будем работать далее:
CREATE TABLE products(pname, price) (
id INT identity(1,1) NOT NULL PRIMARY KEY,
pname VARCHAR(255) NOT NULL,
price INT
)
INSERT INTO products(pname, price) VALUES('prod 1', 126);
INSERT INTO products(pname, price) VALUES('prod 2', 271);
INSERT INTO products(pname, price) VALUES('prod 3', 300);
INSERT INTO products(pname, price) VALUES('prod 4', 290);
INSERT INTO products(pname, price) VALUES('prod 5', 350);
INSERT INTO products(pname, price) VALUES('prod 6', 710);
INSERT INTO products(pname, price) VALUES('prod 7', 414);
INSERT INTO products(pname, price) VALUES('prod 8', 214);
Метод Dapper ExecuteScalar
Метод ExecuteScalar выполняет запрос, который выбирает одно значение.
using System.Data.SqlClient;
using Dapper;
namespace Myrusakov
{
class Program
{
static void Main(string[] args)
{
var connectionString = @"Server=localhost\SQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";
using var con = new SqlConnection(connectionString);
con.Open();
// запрашиваем версию базы данных
var version = con.ExecuteScalar<string>("SELECT @@VERSION");
Console.WriteLine(version);
}
}
}
Метод Dapper Query
Метод Dapper.Query выполняет SQL-запрос и преобразует его в список объектов, переданных через тип шаблона.
using System.Data.SqlClient;
using Dapper;
namespace Myrusakov
{
// класс продукта
class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int Price { get; set; }
public override string ToString()
{
return $"{Id} {Name} {Price}";
}
}
class Program
{
static void Main(string[] args)
{
var connectionString = @"Server=localhost\SQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";
using var con = new SqlConnection(connectionString);
con.Open();
var products = con.Query<Product>("SELECT * FROM products").ToList();
products.ForEach(product => Console.WriteLine(product));
}
}
}
Как видно из примера выше строки из таблицы products автоматически преобразуются в список объектов Product.
Метод Dapper.Execute
Метод Execute выполняет SQL-запрос, например, Insert, Update и т.д.
using System.Data.SqlClient;
using Dapper;
namespace Myrusakov
{
class Program
{
static void Main(string[] args)
{
var connectionString = @"Server=localhost\SQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";
using var con = new SqlConnection(connectionString);
con.Open();
// обновляем продукт
int numberOfRows = con.Execute("UPDATE dbo.[products] SET [price] = 256 WHERE [id] = 1");
Console.WriteLine("Количество измененных строк: ", numberOfRows);
}
}
}
Параметризованные запросы в Dapper
Параметризованные запросы повышают безопасность и производительность кода. При написании параметризованных запросов, мы используем заполнители(начинаются с символа @) вместо прямой записи значений в запросы, что позволяет избежать SQL-инъекций.
using System.Data.SqlClient;
using Dapper;
namespace Myrusakov
{
// класс продукта
class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int Price { get; set; }
public override string ToString()
{
return $"{Id} {Name} {Price}";
}
}
class Program
{
static void Main(string[] args)
{
var connectionString = @"Server=localhost\SQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";
using var con = new SqlConnection(connectionString);
con.Open();
// берем первый элемент с помощью метода QueryFirst
// @id - заполнитель, на место которого подставляется значение из new { id = 1 }
var product = con.QueryFirst<Product>("SELECT * FROM products WHERE Id=@Id", new { Id = 1 });
Console.WriteLine(product);
}
}
}
Удаление строки из таблицы в Dapper
using System.Data.SqlClient;
using Dapper;
namespace Myrusakov
{
class Program
{
static void Main(string[] args)
{
var connectionString = @"Server=localhost\SQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";
using var con = new SqlConnection(connectionString);
con.Open();
// удаляем строку из таблицы
// здесь также данные передаются через заполнители (!)
int res = con.Execute(@"DELETE FROM [products] WHERE Id = @Id", new { Id = 1 });
if (res > 0)
Console.WriteLine("Продукт удален");
}
}
}
Класс DynamicParameters в C# Dapper
Класс DynamicParameters в Dapper представляет собой динамические параметры - набор параметров, которые могут быть переданы методам Query и Execute.
sing System.Data;
using System.Data.SqlClient;
using Dapper;
namespace Myrusakov
{
class Program
{
static void Main(string[] args)
{
var connectionString = @"Server=localhost\SQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";
using var con = new SqlConnection(connectionString);
con.Open();
var query = "INSERT INTO products(pname, price) VALUES(@pname, @price)";
var dynamicParams = new DynamicParameters();
// название продукта
dynamicParams.Add("@pname", "Prod 19", DbType.AnsiString, ParameterDirection.Input, 255);
// цена
dynamicParams.Add("@price", 366);
// выполняем запрос (query) с параметрами (dynamicParams)
int res = con.Execute(query, dynamicParams);
if (res > 0)
Console.WriteLine("Продукт добавлен");
}
}
}
В этой статье мы рассмотрели с Вами, как работать с базой данных на C# с помощью библиотеки Dapper.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.