dapper

ASP.NET Core 5 EP 15:使用Dapper輕量級ORM存取資料庫

ORM是什麼?

ORM,Object Relational Mapping,在程式的資料模型與資料庫中間插入一層用於連接兩者的角色,程式設計師不用為了因為應用程式想要跨多種資料庫而分別撰寫多個相容的SQL語法,減少負擔,白話的說,就是將程式與讀取資料庫的關聯,使用ORM的概念去解耦。

優點與缺點

優點

  1. 簡單:透過實作ORM的各種套件,可以快速生成符合各種資料庫的SQL語法。
  2. 安全:SQL語法最怕遇到SQL Injection的弱點,ORM可以協助降低或避免風險。
  3. 精確:與程式的資料模型對應,甚至是強型別。

缺點

  1. 效能缺失:透過ORM產生的SQL語法只是”一般化”,並不是最佳化、最優化,所以效能並不能保證。
  2. 適應性:ORM可以簡單快速的解決相對簡單的資料存取需求,但若是一個複雜的查詢,那ORM產生出的SQL語法將可能會是個大問題!

Dapper vs. Entity Framework

只說結果,選擇Dapper,只有一個原因:Dapper比Entity Framework的執行效率要高!

根據一篇Google到的文章,於2019年的實驗,比較了Dapper與Entity Framework,如下圖(原文連結):

Dapper在幾個常見的情況之下,都有顯著的高效率,所以多年來也都選擇Dapper作為ORM的實作,再者,使用Dapper,可以非常依賴SQL,這也是我個人撰寫軟體所樂見與習慣的。

安裝Dapper

使用Dapper需要安裝Dapper以及System.Data.SqlClient。

步驟1:使用組合鍵(Windows: Control+P macOS: Command+P)叫出對話筐,並輸入”> Add Package”以此啟動NuGet管理工具。

步驟2:輸入”dapper”來搜尋NuGet上的Dapper安裝包。

步驟3:NuGet會列出所有搜尋結果,點選”Dapper”。

步驟4:NuGet會列出所有可用的版本,沒特別需求,就選擇最新的版本。

步驟5:重複步驟2,輸入”sqlclient”。

步驟6:選擇”System.Data.SqlClient”。

步驟7:基本上,選擇最新版本。

步驟8:稍待一下,等待安裝完成,畫面右下角的Restore點下去,完成Dapper與System.Data.SqlClient的載入。

實作Dapper

Select

// 宣告一個資料模型
public class Resipe
{
    public string ID { get; set; }
    public string NAME { get; set; }
    public string DISCRIPTION { get; set; }
}

public Resipe[] GetAllResipes()
{
    // 使用資料模型宣告一個陣列
    Resipe[] myResipes = null;

    // 設計SQL語法
    string strSqlQuery = @"SELECT ID, NAME, DISCRIPTION FROM RESIPES_MAIN WITH (NOLOCK) ORDER BY NAME;";

    // 宣告資料庫連線
    using (var connection = new SqlConnection("put ur conection string here."))
    {
        // 使用Dapper執行SQL語法,並將得到的資料放入宣告的資料模型陣列中
        myResipes = connection.Query<Resipe>(strSqlQuery).ToArray();
    }

    return myResipes;
}

Insert, Update, Delete

public void Execution()
{
    // 設計SQL語法
    string strSqlQuery = @"INSERT INTO RESIPES_MAIN(ID, NAME, DISCRIPTION) VALUES (@ID, @NAME, @DISCRIPTION);";
    // string strSqlQuery = @"UPDATE RESIPES_MAIN SET NAME=@NAME, DISCRIPTION=@DISCRIPTION WHERE ID=@ID;";
    // string strSqlQuery = @"DELETE FROM RESIPES_MAIN WHERE ID=@ID AND NAME=@NAME AND DISCRIPTION=@DISCRIPTION";
            
    // 宣告資料庫連線
    using (var connection = new SqlConnection("put ur conection string here."))
    {
        // 執行Insert與法,並將參數帶入
        var count = connection.Execute(strSqlQuery, new Resipe { ID = @"ur para here", NAME = @"ur para here", DISCRIPTION = @"ur para here" });
    }
}

Many Insert, Update, Delete at a Time

public void Execution_Many()
{
    // 設計SQL語法
    string strSqlQuery = @"INSERT INTO RESIPES_MAIN(ID, NAME, DISCRIPTION) VALUES (@ID, @NAME, @DISCRIPTION);";
    // string strSqlQuery = @"UPDATE RESIPES_MAIN SET NAME=@NAME, DISCRIPTION=@DISCRIPTION WHERE ID=@ID;";
    // string strSqlQuery = @"DELETE FROM RESIPES_MAIN WHERE ID=@ID AND NAME=@NAME AND DISCRIPTION=@DISCRIPTION";

    // 宣告資料庫連線
    using (var connection = new SqlConnection("put ur conection string here."))
    {
        // 執行Insert與法,並將參數帶入,參數可以是以陣列但放入多筆
        var count = connection.Execute(strSqlQuery, new[] {
            new Resipe { ID = @"ur para here", NAME = @"ur para here", DISCRIPTION = @"ur para here" },
            new Resipe { ID = @"ur para here", NAME = @"ur para here", DISCRIPTION = @"ur para here" },
            new Resipe { ID = @"ur para here", NAME = @"ur para here", DISCRIPTION = @"ur para here" }
            });
    }
}

~ END ~

, , , , , ,

Related posts

Latest posts