Dapper-小型ORM之王(C#.NET)

ORM:對象關係映射器,它直接將數據庫映射到C#對象。git

有不少ORM框架可用,Dapper是其中之一,被稱爲ORM之王。github

下面是Dapper主要的一些功能:數據庫

  • 速度快,性能好;
  • 更少的代碼行
  • 對象映射
  • 靜態對象綁定
  • 動態對象綁定
  • 易於處理Sql語句
  • 易於處理存儲過程
  • 直接操做IDBConnection類,該類直接向數據庫提供平滑性和運行查詢,而不是像在EF和ADO.NET中那樣使用各類對象傳遞數據。
  • 多個查詢支持
  • 支持存儲過程
  • 批量處理數據插入
  • 容許基於多個輸入獲取多個數據

爲何選擇Dapperc#

  • Dapper是第二快的ORM

圖片參照: Dapper dotnet.數組

  • 直接使用IDBConnection對象執行CRUD操做;
  • 經過數據庫提供查詢靜態和動態數據;
  • 獲取簡單或複雜數據類型的通用結果;
  • Dapper容許同時存儲批量數據。

如何安裝Dapperapp

在Visual Studio中,建立一個新的控制檯項目,並在解決方案資源管理器中右鍵單擊引用,選擇 「管理Nuget包...」包管理器,而後搜索Dapper,並使用NuGet包管理器控制檯命令「install-package Dapper」,這將在項目中安裝Dapper。框架

Dapper如何工做ide

主要包含三個步驟性能

第一步:使用鏈接字符串建立一個IDBConnection對象;spa

第二步:編寫一個查詢並將其存儲在一個普通的字符串變量中;

第三步:調用db.execute()並傳遞查詢,完成。

在下面的示例中,咱們還將探索許多其餘的方法。

對於本例,我有一個名爲「ContactDB」的數據庫,庫中包含一個名爲「Contacts」的表,讓咱們使用Dapper對Contacts表進行CRUD操做。

建立一個控制檯應用程序並安裝Dapper,幷包含Dapper的命名空間。

複製代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;

namespace DapperORMBlog
{
   public class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
複製代碼

示例1:

獲取全部數據並打印到控制檯

第一步:建立IDbConnection類的對象和SqlConnection的新實例。

static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);

SqlServerConnString是鏈接字符串名稱,能夠配置在程序中的App.config中。

<connectionStrings>
    <add name="SqlServerConnString" providerName="System.Data.SqlClient" connectionString="Data Source=.\;Initial Catalog=ContactDB;Integrated Security=True;MultipleActiveResultSets=True" />
  </connectionStrings>

第二步:寫一個查詢,並將其存儲到一個string類型的變量中

String query = "select * from contacts"; 

第三步:在db實例上啓動查詢,並將泛型返回類型轉換爲聯繫人實體List

(List<Contact>)db.Query<Contact>(query)

只要使用這三個步驟,咱們就能夠從Contacts表中檢索出全部的數據,能夠在須要的地方去填充這些數據。能夠將整個列表打印到Winform程序的GridView或者WPF,更或者將整個列表傳遞給任何外部的WCF.

對於這個示例,咱們將其打印到控制檯

複製代碼
List<Contact> lstContact= (List<Contact>)db.Query<Contact>(query);
            foreach (var item in lstContact)
            {
                Console.WriteLine(item.FirstName + " " + item.LastName+"\n");
            }
            Console.ReadKey();
複製代碼

結果:

示例2:

給Contacts表中插入數據,一樣包含三步

 第一步:建立IDbConnection類的對象和SqlConnection的新實例。

static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);

第二步:

  string query = @"Insert into contacts values (@FirstName, @LastName, @Email, @Company, @Title);  
Select Cast (Scope_Identity() as int)";

在這裏,咱們包含兩個查詢來獲取Contacts表最後插入的id值。

在db實例上啓動查詢,咱們將得到一個int類型的返回值,所以將其存儲到int變量中,並將contact對象和查詢語句傳遞過去,以下所示。

 int id = db.Query<int>(query, contact).Single();

在這三個簡單步驟中,數據將被插入到數據庫中。

按 Ctrl+C 複製代碼
按 Ctrl+C 複製代碼

查看數據庫多了一條記錄,說明插入成功

示例3:如今,讓咱們經過在where子句中傳遞一個id,從Contacts表中獲取一條記錄

 第一步:建立IDbConnection類的對象和SqlConnection的新實例。

static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);

第二步:

    string query = "select * from contacts where id = @id";

第三步:在db實例上啓動查詢,咱們將得到一條聯繫人記錄,並將其傳給contact對象進行保存

            Contact cont = (Contact)db.Query<Contact>(query, new { id = 7 }).SingleOrDefault();

備註:一樣的方法,咱們能夠對數據庫進行Update和Delete操做

咱們甚至能夠用db.Execute()

db.Query()和db.Execute()之間主要的區別是,用db.Query()咱們能夠按照咱們的設計獲取返回值,由於它是一個通用的方法,而db.Execute()不是一個通用的方法,所以它只能返回int

進一步使用Dapper

  • 咱們也會遇到一次須要處理多個表的需求,例如一次查詢多個表或者之外鍵獲取數據
  • 咱們能夠用Dapper同時訪問多個表,而且十分平滑
  • 傳遞對象列表,Dapper本事能夠識別出是批量插入
  • 根據各類參數獲取數據,Dapper會自動將數組轉換成CSV,並返回一個List對象

示例4:

下面假如說我已經有另外一張名爲「Address」的表

咱們將在兩個表上同時執行CRUD操做,使用相同的ContactId,即Contacts表中的主鍵,Adress表中的外鍵

如今讓咱們經過傳遞Id從Contacts表和Adress表中獲取多條數據

第一步和以前全部示例的第一步相同,咱們從第二步開始

第二步:

string query = "select * from contacts where id = @id ; select * from address where ContactId = @id;";

第三步:db實例上啓動查詢

複製代碼
using (var multipleresult = db.QueryMultiple(query, new { id = 1 }))
            {
                var contact = multipleresult.Read<Contact>().SingleOrDefault();
                var Addresses = multipleresult.Read<Address>().ToList();
                if (contact != null && Addresses != null)
                {
                    contact.Addresses.AddRange(Addresses);
                }
            }
複製代碼

以上三步你將 能夠從多個表中得到多條記錄

示例5:

讓咱們使用存儲過程訪問數據庫

我有一個存儲過程,聲明一個參數(ID),而且基於ID返回Contact數據和Address數據

複製代碼
Use ContactDB
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[sp_GetContact_Address]  
    @Id int 
AS
BEGIN
select * from contacts where id = @Id ;   
select * from Address where ContactId = @Id; 
END
GO
複製代碼

用Dapper調用存儲過程

第一步同其餘示例

在這裏咱們不須要寫任何的query語句,相反的咱們將調用數據庫內的存儲過程

在這裏咱們將作的更改是傳遞一個存儲過程的名稱而不是查詢語句,並傳遞一個名稱爲command type的參數。

第二步:在db實例上啓動查詢

複製代碼
using (var multipleresult = db.QueryMultiple("sp_GetContact_Address", new { id = 1 }, commandType: CommandType.StoredProcedure))
            {
                var contact = multipleresult.Read<Contact>().SingleOrDefault();
                var Addresses = multipleresult.Read<Address>().ToList();
                if (contact != null && Addresses != null)
                {
                    contact.Addresses.AddRange(Addresses);
                }
            }
複製代碼

僅僅兩步,就 能夠成功的調用數據庫中的存儲過程

示例6:

當咱們須要處理運行時對象時,還能夠將動態對象或者值傳遞給存儲過程

下面這個存儲過程會給Contacts表裏增長一條記錄

複製代碼
use ContactDB
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[SaveContact] 
    @Id int output,
    @FirstName nvarchar(50),
    @LastName nvarchar(50),
    @Email nvarchar(50),
    @Company nvarchar(50),
    @Title nvarchar(50)


AS
BEGIN
    INSERT INTO [dbo].[Contacts]  
           ([FirstName],[LastName],[Company],[Title],[Email]) VALUES  
           (@FirstName, @LastName, @Company, @Title, @Email);  
        SET @Id = cast(scope_identity() as int)  
END
GO
複製代碼

下面演示瞭如何使用Dapper經過傳遞動態參數調用存儲過程

第一步同其餘示例

第二步:建立一個動態對象並將值傳遞給該對象

複製代碼
var parameter = new DynamicParameters();
            parameter.Add("@Id", con.Id, dbType: DbType.Int32, direction: ParameterDirection.InputOutput);
            parameter.Add("@FirstName", con.FirstName);
            parameter.Add("@LastName", con.LastName);
            parameter.Add("@Company", con.Company);
            parameter.Add("@Title", con.Title);
            parameter.Add("@Email", con.Email);
複製代碼

第三步:用db.Execute()調用存儲過程

db.Execute("SaveContact",parameter,commandType:CommandType.StoredProcedure);  
  
//To get newly created ID back  
con.Id = parameter.Get<int>("@Id");  

這些是使用c#動態對象操做數據庫的方法。

原文連接:https://www.c-sharpcorner.com/UploadFile/e4e3f7/dapper-king-of-micro-orm-C-Sharp-net/?

相關文章
相關標籤/搜索