dotnetcore中使用dapper

来源:https://www.cnblogs.com/taotaozhuanyong/archive/2019/10/29/11757738.html
-Advertisement-
Play Games

我們都知道,ORM全稱是,Object Relationship Mapper,即,對象關係映射。也就是可以用object來map我們的db,而且市面上的orm框架有很多,其中有一個框架叫做dapper,而且被稱為the king of ORM。 市場上,也有一些其他的ORM,比如EF Core,N ...


  我們都知道,ORM全稱是,Object Relationship Mapper,即,對象關係映射。也就是可以用object來map我們的db,而且市面上的orm框架有很多,其中有一個框架叫做dapper,而且被稱為the king of ORM。

  市場上,也有一些其他的ORM,比如EF Core,NHibernate 、FreeSQL等等,來處理大數據訪問及關係映射。既然官方推出了EF Core,說明其對框架的支持會很友好,為什麼又會有那麼多的ORM框架供我們使用呢?其實,每一個框架都有其適用的場景。如果你在小的項目中,使用Entity Framework、Entity Framework Core、NHibernate 來處理大數據訪問及關係映射,未免有點殺雞用牛刀。你又覺得ORM省時省力,這時Dapper 將是你不二的選擇。其實,Entity Framework Core的性能並不是很高,當對性能有要求的時候,一般公司都會自己封裝一套ORM。

為什麼選擇Dapper?

  1. 輕量。只有一個文件(SqlMapper.cs),編譯完成之後只有120k(好象是變胖了)
  2. 速度快。Dapper的速度接近與IDataReader,取列表的數據超過了DataTable。
  3. 支持多種資料庫。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
  4. 可以映射一對一,一對多,多對多等多種關係。
  5. 性能高。通過Emit反射IDataReader的序列隊列,來快速的得到和產生對象,性能不錯。
  6. 支持FrameWork2.0,3.0,3.5,4.0,4.5

在這裡,我們在dotnet core下麵使用Dapper操作MySQL。

首先,既然是演示,就先創建一個core MVC的項目,這裡選擇有模板的。因為公司使用的是dotnet core2.2的版本,我就基於core2.2版本創建一個項目。

Dapper安裝,使用NuGet來安裝Dapper程式包

使用NuGet安裝MySQL.Data的程式包 

 

 安裝這些程式包之後,在appsettings.json文件中添加鏈接資料庫的字元串:

"ConnectionStrings": {
    "DefaultConnection": "server=伺服器;port=埠號;database=regatta{0};SslMode=None;uid=userName;pwd=passWord;Allow User Variables=true"
  }

然後,封裝一個工具類,來獲得我們的連接字元串,和管理連接池。

public class BaseRepository : IDisposable
{
    public static IConfigurationRoot Configuration { get; set; }

    public static MySqlConnection conn;

    public static MySqlConnection GetMySqlConnection(bool open = true,
        bool convertZeroDatetime = false, bool allowZeroDatetime = false)
    {
        var builder = new ConfigurationBuilder()
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("appsettings.json")
          .Build();
        var cs = builder.GetSection("ConnectionStrings:DefaultConnection").Value;
        var csb = new MySqlConnectionStringBuilder(cs)
        {
            AllowZeroDateTime = allowZeroDatetime,
            ConvertZeroDateTime = convertZeroDatetime
        };
        conn = new MySqlConnection(csb.ConnectionString);
        return conn;
    }

    public void Dispose()
    {
        if (conn != null && conn.State != System.Data.ConnectionState.Closed)
        {
            conn.Close();
        }
    }
}

或者, 在startup中註冊dapper倉儲,並現時註冊資料庫類型和資料庫連接串,因為在mysql和sqlserver中,它們的連接串是不同的,模塊化設計請看大叔這篇文章,DotNetCore跨平臺~組件化時代來了

services.UseLog4Logger(o =>
            {
                o.Log4ConfigFileName = "log4.config";
                o.ProjectName = "test";
            }).UseDapper(o =>
            {
                o.ConnString = "server=伺服器;port=埠號;database=regatta{0};SslMode=None;uid=userName;pwd=passWord;Allow User Variables=true";
                o.DbType = DbType.MySql;
            }).UseDefaultMQ();

創建資料庫中的一個需要映射的實體類:

public class Area
{
    public int ID { get; set; }

    public string Name { get; set; }

    public int ParentID { get; set; }
}

當有些時候,資料庫中的表名,與我們定義的實體類的類名,可能會不一致。這個時候,就需要加一個特性標簽來聲明瞭:

[Display(Name = "tbl_area")]
public class Area
{
    public int ID { get; set; }

    public string Name { get; set; }

    public int ParentID { get; set; }
}

當然,有些表中的欄位與實體類中的自己定義的屬性,也不一樣,其實有好多解決方法,可以在使用T-SQL的時候,使用別名。比如,SELECT id AS ID FROM TABLE..,或者使用特性標簽,具體請參考:https://www.cnblogs.com/efreer/p/8277329.html

查詢操作

/// <summary>
/// 查詢單個數據
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public static Area QueryFirstOrDefault(int Id)
{
    var sql = "SELECT * from Area where id =@ID";
    using (IDbConnection connection = BaseRepository.GetMySqlConnection())
    {
        return connection.QueryFirstOrDefault<Area>(sql, new { ID = Id });
    }
}

 

/// <summary>
/// 查詢所有數據
/// </summary>
/// <returns></returns>
public static List<Area> QueryList()
{
    var sql = "select * from Area";
    using (IDbConnection connection = BaseRepository.GetMySqlConnection())
    {
        return connection.Query<Area>(sql).ToList();
    }
}
/// <summary>
/// In操作
/// </summary>
public static List<Area> QueryIn()
{
    using (IDbConnection connection = BaseRepository.GetMySqlConnection())
    {
        var sql = "select * from Area where id in @ids";
        //參數類型是Array的時候,dappper會自動將其轉化
        return connection.Query<Area>(sql, new { ids = new int[2] { 1, 2 }, }).ToList();
    }
}

public static List<Area> QueryIn(int[] ids)
{
    using (IDbConnection connection = BaseRepository.GetMySqlConnection())
    {
        var sql = "select * from Area where id in @ids";
        //參數類型是Array的時候,dappper會自動將其轉化
        return connection.Query<Area>(sql, new { ids }).ToList();
    }
}

插入操作

/// <summary>
/// 插入一條數據
/// </summary>
/// <param name="Area"></param>
/// <returns></returns>
public static int Insert(Area Area)
{
    using (IDbConnection connection = BaseRepository.GetMySqlConnection())
    {
        return connection.Execute($"INSERT INTO Area(Name,ParentID) VALUES(@Name,@ParentID)", Area);
    }
}

/// <summary>
/// 批量插入Area數據,返回影響行數
/// </summary>
/// <param name="Areas"></param>
/// <returns></returns>
public static int Insert(List<Area> Areas)
{
    using (IDbConnection connection = BaseRepository.GetMySqlConnection())
    {
        return connection.Execute("INSERT INTO Area(ID,Name,ParentID) VALUES(@ID,@Name,@ParentID)", Areas);
    }
}

刪除操作

/// <summary>
/// 刪除一條
/// </summary>
/// <param name="Area"></param>
/// <returns></returns>
public static int Delete(Area Area)
{
    using (IDbConnection connection = BaseRepository.GetMySqlConnection())
    {
        return connection.Execute("DELETE FROM Area WHERE id=@ID", Area);
    }
}

/// <summary>
/// 批量刪除
/// </summary>
/// <param name="Areas"></param>
/// <returns></returns>
public static int Delete(List<Area> Areas)
{
    using (IDbConnection connection = BaseRepository.GetMySqlConnection())
    {
        return connection.Execute("DELETE FROM Area WHERE id=@ID", Areas);
    }
}

修改操作

/// <summary>
/// 修改
/// </summary>
/// <param name="Area"></param>
/// <returns></returns>
public static int Update(Area Area)
{
    using (IDbConnection connection = BaseRepository.GetMySqlConnection())
    {
        return connection.Execute("update Area set name=@name where id=@ID", Area);
    }
}

/// <summary>
/// 批量修改
/// </summary>
/// <param name="Areas"></param>
/// <returns></returns>
public static int Update(List<Area> Areas)
{
    using (IDbConnection connection = BaseRepository.GetMySqlConnection())
    {
        return connection.Execute("update Area set name=@name where id=@ID", Areas);
    }
}

Join操作

  我們是面向對象編程,所以一個對象裡面會有許多其他子對象,這個子對象裡面又有其自己的子對象,這種關係在資料庫里的表示就是外鍵。
比如我們有一本書book,它有主人person,book是一個對象,主人又是一個對象。

public class BookWithPerson
{
    public int ID { get; set; }
    public Person Pers { get; set; }
    public string BookName { get; set; }
}

  我們自然想要一個方法把資料庫里複雜的外鍵關係轉成我們需要的對象BookWithArea,所有我們需要的信息都存在裡面,取數據的時候只要找這個對象取數據就行了,比如我們需要一本書的主人的姓名,我們只需要bookWithArea.Pers.Name。如果是一對多的關係我們用數組,如果是多對多我們加一層mapping。
現在我們想根據書的ID查詢書的信息,包括主人信息。那麼

public static BookWithPerson QueryJoin(Book book)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        var sql = @"select b.id,b.bookName,p.id,p.name,p.remark
                        from Person as p
                        join Book as b
                        on p.id = b.personId
                        where b.id = @id;";
        var result = connection.Query<BookWithPerson, Person, BookWithPerson>(sql,
        (bookWithPerson, person) =>
        {
            bookWithPerson.Pers = person;
            return bookWithPerson;
        },
        book);
      //splitOn: "bookName");
      return (BookWithPerson)result;
  }
}

中,Query的三個泛型參數分別是委托回調類型1委托回調類型2返回類型。形參的三個參數分別是sql語句map委托對象參數。所以整句的意思是先根據sql語句查詢;同時把查詢的Area信息賦值給bookWithArea.Pers,並且返回bookWithArea;book是對象參數,提供參數綁定的值。
最終整個方法返回BookWithArea,這樣我們所需要的所有信息就有了。

  這裡只是簡單介紹下同步增刪改查的API的書寫,非同步的API,可以自行去瞭解。

參考地址:https://www.cnblogs.com/flywong/p/9666963.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ASP.NET簡介 簡單來說,ASP.NET 是一個使用 HTML、CSS、JavaScript 和伺服器腳本創建網頁和網站的開發框架。 微軟在2001年開發的第一個版本的ASP.NET,是一種建立在.NET之上的Web運行環境。藉助於ASP.NET,可以創造出內容豐富的、動態的、個性化的Web站點 ...
  • 很早之前就玩過VS裡面的code snippet,相當方便。 今天在用prop自動屬性代碼時,無意中用了一下propa,然後就自動出來了依賴屬性的代碼片段,太方便了,尤其是對於WPF新手來說,比如我這樣的。 ...
  • Aspose.PDF for .NET是一種高級PDF處理和解析API,用於在跨平臺應用程式中執行文檔管理和操作任務。API可以輕鬆用於生成,修改,轉換,渲染,保護和列印PDF文檔,而無需使用Adobe Acrobat。此外,還提供PDF壓縮選項,表格創建和操作,圖形和圖像功能,廣泛的超鏈接功能,印 ...
  • Quartz.Net 刪除Job 來博客園的第一篇文章先寫個簡單的,希望能幫助到大家。 步入正題: Quartz.Net有三個重要的概念,分別是 Scheduler 、Job 、Trigger。 Scheduler包含Job和Trigger。 如果要刪除一個正在運行的Job,需要在Schedule中 ...
  • Aspose.PSD是高級PSD文件格式操作API,沒有任何Adobe Photoshop依賴項。API允許創建或編輯Photoshop文件,並提供更新圖層屬性,添加水印,執行圖形操作或將一種文件格式轉換為另一種文件的功能。 Aspose.PSD for .NET支持PSD和PSB文件格式進行載入和 ...
  • 項目需求:某市級組織考試,在考試前需審核考生採集表中的考生照片是否合格,由於要審核的考生信息採集表有很多,原先進行的是手動人工審核,比較費時費力,審核的要求也很簡單,並不判斷考生是否是圖片本人(身份驗證有另外一套程式來進行),只是看考生採集表中考生頭像是否是人臉(是否存在辨識不清楚,不是人臉)。因此 ...
  • 添加引用 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Tools Pomelo.EntityFrameworkCore.MySql 創建實體對象 創建實體對象 這裡創建兩個實體對象,順便演示添加外鍵的效果 public cl ...
  • linux系統部署.netcore程式後,訪問某台sqlserver 2008 R2資料庫 `` Connection Timeout Expired. The timeout period elapsed during the post login phase. The connection co ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...