C# 利用Xejen框架源碼,我們來開發一個基于Dapper技術的數據庫通用的幫助訪問類,通過Dapper的增刪改查,可以訪問Sqlite數據庫

Dapper 是一個輕量級的對象關系映射(ORM)工具,適用于 .NET 平臺。它由 Stack Overflow 團隊開發,旨在提供簡單、高效的數據訪問功能。與其他重量級 ORM(如 Entity Framework)相比,Dapper 更加輕量級,并且性能極高,因為它在底層直接使用 ADO.NET。

Dapper 是一個輕量級、高性能的 ORM 工具,適合需要直接控制 SQL 查詢但又希望簡化數據訪問代碼的開發者。通過 Dapper,可以以接近原生 ADO.NET 的性能輕松執行數據庫操作,并將結果映射到 C# 對象中。

主要特點

  1. 性能優越

    • Dapper 通過動態生成 SQL 查詢并使用 ADO.NET 執行這些查詢,提供了極高的性能。它通常被認為是最接近原生 ADO.NET 性能的 ORM。
  2. 簡單易用

    • Dapper 具有簡單的 API,開發者可以輕松地執行 SQL 查詢并將結果映射到 C# 對象。
  3. 靈活性

    • 它不強制使用特定的架構或模式,開發者可以自由地構建自己的查詢和命令。
  4. 輕量級

    • Dapper 沒有復雜的設置和配置,可以很容易地集成到現有的項目中。

核心功能

  1. 查詢

    • Query<T> 方法用于執行 SQL 查詢并將結果映射到指定類型的對象列表。
  2. 單一查詢

    • QueryFirstOrDefault<T>QuerySingle<T> 等方法用于執行 SQL 查詢并返回單個對象。
  3. 執行命令

    • Execute 方法用于執行非查詢命令(如插入、更新、刪除)。
  4. 事務支持

    • 通過 ADO.NET 提供的事務機制,Dapper 可以在事務中執行多個命令。
  5. 存儲過程

    • Dapper 支持執行存儲過程,并且可以將結果映射到 C# 對象。

一、創建項目結構

如上圖,基于Xejen框架,我們創建2個項目:
Xejen.Database.Dapper
Xejen.Database.Dapper.Sqlite

并引用需要的數據庫包,以及引用Xejen框架項目,主要接入的包或項目如下:
Dapper:這是使用Dapper技術的核心關鍵nuget包
Xejen.Database:這是Xejen的框架中的數據庫基礎項目
System.Data.SQLite.Core:用于將Dapper跟微軟體系結合起來的包

二、構建Dapper的專屬倉儲接口:IRepository<TEntity, TPrimaryKey>

每一種數據庫操作,都應有各自的倉儲接口。
比如Ef技術、SqlSugar技術、FreeSql技術等,他們各自的倉儲功能是不盡一樣的,所以我們應當為了適應未來的情形,得專門為各種技術做獨立的倉儲接口。

我們給Dapper初步設計的接口如下圖所示:

三、我們構建倉儲的抽象實現和具體實現


抽象實現,就是abstract class。。具體實現,就是具體的倉儲類了。

由于Dapper是可以支持多種數據庫的。
我們這里是使用Sqlite,所以,專門起了一個Xejen.Database.Dapper.Sqlite的項目來做實現。

為什么要專門起了一個Xejen.Database.Dapper.Sqlite的項目來做實現呢?

因為Sqlite和SqlServer等數據庫各自的一些語句寫法及特殊功能是不同的。所以,他們大部分可以共用,但小部分是有獨特需求的,這就是要有獨立的Sqlite工程項目的原因。如上圖所示。

三、數據庫上下文


Dapper的數據庫上下文,都是實現自微軟的IDbConnection。
所以,我們在構建數據庫上下文 的驅動器接口:IDbContextProvider<TDbContext>時,只要限定TDbContext是來自于IDbConnection即可,這是非常簡單的事情。

四、將倉儲的實現與數據庫驅動器(上下文)關聯依賴起來

如上圖,只需要簡單的構造函數中依賴IDbContextProvider接口即可實現依賴,然后就可以實現各種各樣的倉儲需求了。

那么我們為什么要依賴IDbContextProvider接口,而不是直接依賴類似DbContext這種對象呢?
這是為了最大的抽象依賴,可以讓系統不用改動,就可以切換數據庫。這樣做后,你不管是SqlServer還是Sqlite,都可以實現一套的倉儲。
?

五、工作單元


Dapper有自己的數據庫事務,我們在他的基礎上做一個簡單的工作單元即可。

六、示例演練

如上圖,先將倉儲進行依賴注入,便可以使用倉儲了。
當然,這是Xejen框架本身有的主機功能,所以,我們可以直接注入倉儲。Xejen框架初始化主機的代碼如下,很簡單:

接下來是增刪改查和事務的測試,貼圖你直接看下,對于喜歡使用原生Sql語句的人來說,Dapper應該會讓你喜歡上:

基于Xejen框架構建的Dapper數據庫項目,就介紹到這里。
所有源碼,可以自行下載交流學習。

https://gitee.com/mazhiyuan1981/xejen-open.git

項目位置在下圖的地方:

祝您用餐愉快

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14918.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14918.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14918.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Python圖像增強算法:低光增強+圖像修復+超分辨率重建

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 在圖像處理與計算機視覺領域&#xff0c;圖像增強技術是提高圖像質量和可用性的重要手段。在實…

單片機io擴展

輸入輸出擴展 i2c擴展 方案1:PCF8575 PCF8575雙向IO口擴展模塊 16位輸入輸出I2C通訊 單片機級聯擴展板 方案2&#xff1a;PCA955A 輸出擴展 74HC595 io口擴展模塊輸出口擴展 參考鏈接 中微愛芯發[2004] 1號           簽發人&#xff1a; (szlcsc.com)https://…

? Vscode和Idea都可以使用的-AI插件(官方-百度出的)

? Vscode和Idea都可以使用的-AI插件&#xff08;官方-百度出的&#xff09; 最新AI特別火&#xff0c;給大家推薦一下最新出的VScode插件&#xff0c;輔助我們寫代碼&#xff01; 1、下載地址&#xff1a; > https://comate.baidu.com/zh/shopping?inviteCodefkzlak8f …

jmeter中Ultimate Thread Group設計梯度壓測場景

Ultimate Thread Group Ultimate Thread Group 線程組是模擬波浪式壓測或者階梯式負載壓測 1、Start Threads Count&#xff1a;線程數量 2、Initial Delay&#xff0c;sec&#xff1a;每組開始添加到測試執行之前的延遲&#xff08;xx秒開始啟動線程&#xff09; 3、Startu…

python中的線程并行

文章目錄 1. 單線程2. 線程池ThreadPoolExecutor 1. 單線程 現在有1154張圖片需要順時針旋轉后保存到本地&#xff0c;一般使用循環1154次處理&#xff0c;具體代碼如下所示&#xff0c;img_paths中存儲1154個圖片路徑&#xff0c;該代碼段耗時約用97ms。 t1time.time() for …

Python筑基之旅-MySQL數據庫(四)

目錄 一、數據表操作 1、新增記錄 1-1、用mysql-connector-python庫 1-2、用PyMySQL庫 1-3、用PeeWee庫 1-4、用SQLAlchemy庫 2、刪除記錄 2-1、用mysql-connector-python庫 2-2、用PyMySQL庫 2-3、用PeeWee庫 2-4、用SQLAlchemy庫 3、修改記錄 3-1、用mysql-conn…

Java輕松轉換Markdown文件到Word和PDF文檔

Markdown 憑借其簡潔易用的特性&#xff0c;成為創建和編輯純文本文檔的常用選擇。但某些時候我們需要更加精致的展示效果&#xff0c;例如在專業分享文檔或打印成離線使用的紙質版時&#xff0c;就需要將Markdown文件以其他固定的文檔格式呈現。通過將 Markdown 轉換為 Word 和…

OpenHarmony實戰開發——網絡組件axios可以在OpenHarmony上使用了

什么是axios 上古瀏覽器頁面在向服務器請求數據時&#xff0c;因為返回的是整個頁面的數據&#xff0c;頁面都會強制刷新一下&#xff0c;這對于用戶來講并不是很友好。并且我們只是需要修改頁面的部分數據&#xff0c;但是從服務器端發送的卻是整個頁面的數據&#xff0c;十分…

高效寫代碼java-推薦插件1(格式轉化 ConverterX )-日后待更新

ConverterX 主要功能:格式轉化 字符串格式轉換 日期轉換 Json格式轉義 字符格式 快捷鍵 ctrl shiftS Upper(CODEEASE)字符串全部變成大寫Lower(codeease)字符串全部變成小寫Camel(codeEase)字符串變成小駝峰ClassCaemel(CodeEase)字符串變成大駝峰UnderlineUpper(CODE_EAS…

項目管理:Jira,禪道,GitHub Issues對比

Jira、禪道&#xff08;ZenTao&#xff09;和GitHub Issues都是項目管理工具&#xff0c;但它們在功能、適用場景和特性上有所不同。以下是它們之間的對比&#xff1a; 功能&#xff1a; Jira&#xff1a;是一款強大的項目管理工具&#xff0c;適用于各種項目&#xff0c;尤其…

Vue3組件間通信通過回調函數傳遞數據

Vue3組件間通信通過回調函數傳遞數據 一、前言1、使用場景2、實現方法1. 父組件中定義回調方法2. 子組件中觸發回調方法 二、結論 一、前言 在 Vue 3 中&#xff0c;組件之間的通信是一個重要的主題。在許多情況下&#xff0c;你可能需要從子組件向父組件傳遞數據或觸發父組件…

python實用系列:按順序重命名文件

啊&#xff0c;好久沒更博客了&#xff0c;今天偶然想換個桌面壁紙&#xff0c;于是上網搜了兩個比較滿意的桌面壁紙&#xff0c;都是壓縮包&#xff1a; 當我想要給他們放到我的桌面壁紙文件里的時候患了難&#xff0c;因為他們的名字有相同的&#xff1a; anime文件夾里邊&a…

揭秘!亞馬遜、Vinted賣家如何借助自養號測評實現爆單?

?作為一名跨境賣家&#xff0c;你一定夢想著能夠在亞馬遜上實現爆單&#xff0c;讓產品火爆銷售。下面就分享五個秘訣&#xff0c;幫助你實現這個夢想&#xff1a; 1. 優質產品&#xff1a;首先&#xff0c;確保你的產品質量優秀&#xff0c;能夠滿足消費者的需求。品質好的產…

基于Matlab使用BP神經網絡進行電力系統短期負荷預測

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 電力系統的短期負荷預測對于電力調度和能源管理具有至關重要的作用。通過準確地預測電力負荷&…

【產品經理】輸出

引言&#xff1a; ? ? ? ?在最近頻繁的產品管理職位面試中&#xff0c;我深刻體會到了作為產品經理需要的不僅僅是對市場和技術的敏銳洞察&#xff0c;更多的是在復雜多變的環境中&#xff0c;如何運用溝通、領導力和決策能力來引導產品從概念走向市場。這一系列博客將分享…

CAN網絡管理(TJA1145如何實現MCU的休眠喚醒)

節點喚醒方式 本地喚醒&#xff1a; 喚醒源來源于自身模塊&#xff0c;比如常說的KL15&#xff0c;控制器由KL15線供電&#xff0c;即只能在鑰匙置于“ACC”或者“ON”檔時運行軟件和維持CAN通信 對于正在運行的CPU軟件&#xff0c;無論它處在什么狀態&#xff0c;只要Hardwa…

深度學習模型keras第二十五講:使用KerasNLP從零開始預訓練Transformer模型

1、KerasNPL預訓練Transformer模型概念 使用KerasNLP來預訓練一個Transformer模型涉及多個步驟。由于Keras本身并不直接提供NLP的預訓練模型或工具集&#xff0c;我們通常需要結合像TensorFlow Hub、Hugging Face的Transformers庫或自定義的Keras層來實現。 以下是一個簡化的…

Android Baidu地圖SDK只展示藍背景,沒有繪制內容問題解決

背景 項目里接入了Baidu地圖SDK&#xff0c;用于展示信息、選點。 在一個新的Activity中&#xff0c;引入了TextureMapView&#xff0c;用于地圖展示。 選點過程有兩個頁面。 A頁面中有一個不能滑動的地圖&#xff0c;只是用來展示&#xff0c;沒有其他任何操作。 點擊A頁…

Plesk中如何移除之前添加的域名

我這邊想要移除我之前綁定到主機的域名&#xff0c;但是不知道如何在主機上面進行移除&#xff0c;由于我使用的Hostease的Windows虛擬主機產品默認帶普通用戶權限的Plesk面板&#xff0c;但是不知道如何在Plesk上操作移除域名&#xff0c;因為也是對于Hostease主機產品不是很了…

java單元測試:JUnit斷言庫

JUnit斷言庫提供了一組用于驗證測試結果的工具。這些斷言方法幫助開發人員在單元測試中明確表達預期結果&#xff0c;并在實際結果與預期結果不符時報告失敗。 1. JUnit中的斷言 斷言用于驗證測試的預期結果。JUnit 5&#xff08;Jupiter&#xff09;提供了一組靜態方法&…