以SQLserver為例的Dapper詳細講解

2023-04-24 15:01:03

Dapper是一種輕量級的ORM(物件關係對映)工具,它提供了高效且易於使用的方式來執行資料庫操作。
Dapper是由Stack Overflow團隊開發並維護的,它的主要目標是提供比EF更快、更直接的方式存取資料庫。
Dapper的主要特點包括:
基於純ADO.NET而不是EF,因此效能更高
支援多種資料庫,如SQL Server、MySQL、Oracle等
通過使用動態SQL和強型別引數,可以有效地減少程式碼量
提供了多種簡單易用的方法,在大多數情況下,只需一兩行程式碼就可以完成常見的CRUD操作
接下來,我們將詳細介紹如何使用Dapper進行資料庫操作。

一、安裝Dapper:

       Dapper可以通過NuGet包管理器安裝。開啟Visual Studio,選擇「專案」選單下的「管理NuGet程式包」,在搜尋欄中輸入「Dapper」,然後點選「安裝」按鈕即可。
       你也可以手動在專案中新增以下參照:

using Dapper;
using System.Data.SqlClient;
View Code

二、連線資料庫
     在使用Dapper之前,我們需要先連線資料庫。Dapper支援多種資料庫,本文以SQL Server為例。
     建立一個 SqlConnection 物件,然後使用該物件開啟資料庫連線。

string connectionString = "your connection string";
using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    // 這裡執行資料庫操作
}
View Code

三、執行查詢操作
     Dapper提供了多種方法來執行查詢操作。其中,最常見的方法是 Query 和 QueryFirstOrDefault。
     Query
     Query 方法返回一個包含查詢結果的 IEnumerable<T>(T為查詢結果對映的型別)。

var products = connection.Query<Product>("SELECT * FROM Products");
foreach (var product in products)
{
    // 處理查詢結果
}
View Code

     如果你需要使用引數化查詢,可以像下面這樣使用命名引數:

var products = connection.Query<Product>("SELECT * FROM Products WHERE CategoryId = @CategoryId", new { CategoryId = 1 });
foreach (var product in products)
{
    // 處理查詢結果
}
View Code

     或者使用匿名物件:

var parameters = new { CategoryId = 1 };
var products = connection.Query<Product>("SELECT * FROM Products WHERE CategoryId = @CategoryId", parameters);
foreach (var product in products)
{
    // 處理查詢結果
}
View Code

    QueryFirstOrDefault 

    QueryFirstOrDefault 方法返回一個單個實體物件,如果未找到任何記錄,則返回 null。

var product = connection.QueryFirstOrDefault<Product>("SELECT * FROM Products WHERE Id = @Id", new { Id = 1 });
if (product != null)
{
    // 處理查詢結果
}
View Code

    QueryMultiple
    如果你需要一次性執行多個查詢語句,可以使用 QueryMultiple 方法。該方法返回一個 SqlMapper.GridReader 物件,通過該物件可以依次獲取各個查詢語句的結果。
    以下範例中,我們首先執行兩個查詢語句,獲取商品和商品分類的資料。然後,我們使用 Read 方法分別獲取這兩個結果集,並將它們轉換為實體物件列表。

var multi = connection.QueryMultiple("SELECT * FROM Products; SELECT * FROM Categories");
var products = multi.Read<Product>().ToList();
var categories = multi.Read<Category>().ToList();
View Code

四、執行插入、更新和刪除操作
      Dapper還提供了多種方法來執行插入、更新和刪除操作。其中,最常見的方法是 Execute 和 ExecuteScalar。
      Execute
      Execute 方法返回受影響行數。

var rowsAffected = connection.Execute("INSERT INTO Products (Name, Price) VALUES (@Name, @Price)", new { Name = "Product 1", Price = 9.99m });
View Code

     你也可以使用命名引數或匿名物件:

var parameters = new { Name = "Product 1", Price = 9.99m };
var rowsAffected = connection.Execute("INSERT INTO Products (Name, Price) VALUES (@Name, @Price)", parameters);
View Code


     ExecuteScalar
     ExecuteScalar方法返回一個單一的值,通常用於執行插入操作並返回插入記錄的主鍵。

var productId = connection.ExecuteScalar<int>("INSERT INTO Products (Name, Price) VALUES (@Name, @Price); SELECT CAST(SCOPE_IDENTITY() as int)", new { Name = "Product 2", Price = 19.99m });
View Code

    與 Query 和 Execute 方法一樣,你也可以使用命名引數或匿名物件。
物件對映
    Dapper支援自動將查詢結果對映到實體物件上。在使用Dapper時,我們需要確保查詢語句中的列名與實體類的屬性名相對應。
    以下是一個簡單的範例:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

// 查詢商品資料
var products = connection.Query<Product>("SELECT Id, Name, Price FROM Products");
View Code

     注意,如果查詢語句中的列名與實體類的屬性名不匹配,則無法自動對映。此時,你需要手動指定對映關係。
     以下是一個手動對映的範例:

public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public decimal ProductPrice { get; set; }
}

// 查詢商品資料
var products = connection.Query<Product>("SELECT Id as ProductId, Name as ProductName, Price as ProductPrice FROM Products");
View Code

 總結
      Dapper是一種簡單易用、高效的ORM工具,它提供了多種方法來執行資料庫操作,能夠滿足大多數開發人員的需求。在使用Dapper時,我們需要先連線資料庫,然後使用 Query、QueryFirstOrDefault、QueryMultiple、Execute 或 ExecuteScalar 等方法執行相應的資料庫          操作。同時,Dapper還支援自動將查詢結果對映到實體物件上,從而進一步簡化了程式碼編寫。