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
项目位置在下图的地方:
祝您用餐愉快