Dapper 是一個輕量級的對象關系映射(ORM)工具,適用于 .NET 平臺。它由 Stack Overflow 團隊開發,旨在提供簡單、高效的數據訪問功能。與其他重量級 ORM(如 Entity Framework)相比,Dapper 更加輕量級,并且性能極高,因為它在底層直接使用 ADO.NET。
Dapper 是一個輕量級、高性能的 ORM 工具,適合需要直接控制 SQL 查詢但又希望簡化數據訪問代碼的開發者。通過 Dapper,可以以接近原生 ADO.NET 的性能輕松執行數據庫操作,并將結果映射到 C# 對象中。
主要特點
-
性能優越:
- Dapper 通過動態生成 SQL 查詢并使用 ADO.NET 執行這些查詢,提供了極高的性能。它通常被認為是最接近原生 ADO.NET 性能的 ORM。
-
簡單易用:
- Dapper 具有簡單的 API,開發者可以輕松地執行 SQL 查詢并將結果映射到 C# 對象。
-
靈活性:
- 它不強制使用特定的架構或模式,開發者可以自由地構建自己的查詢和命令。
-
輕量級:
- Dapper 沒有復雜的設置和配置,可以很容易地集成到現有的項目中。
核心功能
-
查詢:
Query<T>
方法用于執行 SQL 查詢并將結果映射到指定類型的對象列表。
-
單一查詢:
QueryFirstOrDefault<T>
、QuerySingle<T>
等方法用于執行 SQL 查詢并返回單個對象。
-
執行命令:
Execute
方法用于執行非查詢命令(如插入、更新、刪除)。
-
事務支持:
- 通過 ADO.NET 提供的事務機制,Dapper 可以在事務中執行多個命令。
-
存儲過程:
- 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
項目位置在下圖的地方:
祝您用餐愉快