C# 利用Xejen框架源码,我们来开发一个基于Dapper技术的数据库通用的帮助访问类,通过Dapper的增删改查,可以访问Sqlite数据库

news2025/1/15 12:53:44

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.coloradmin.cn/o/1691207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法例题】n元钱买n只鸡

题目描述&#xff1a;公鸡5元1只&#xff0c;母鸡3元1只&#xff0c;小鸡1元3只&#xff0c;问&#xff1a;n元钱买n只鸡&#xff0c;怎么买&#xff1f; 解题思路&#xff1a;这题要用枚举算法&#xff0c;枚举鸡的数量&#xff0c;代码如下&#xff1a; ​#include <bit…

博客系统(Servlet实现)

目录 1.准备工作 2.数据库设计 2.1表设计 2.2封装数据库操作代码 2.3创建 Blog 类 和 User 类 2.4创建 BlogDao 类和 UserDao 类 3.读取博客列表功能 3.1约定前后端交互接口 3.2实现服务器代码 3.3实现客户端代码 4.实现博客详情 4.1约定前后端交互接口 4.2实现服…

jmeter之线程组教程

一、线程组的作用 线程组是测试计划的子控件&#xff0c;也是取样器的父控件setup线程组&#xff0c;在所有线程组之前运行&#xff0c;类似于unittest框架中的SetUp函数&#xff0c;初始化环境teardown线程组&#xff0c;在所有线程组之后运行&#xff0c;类似于unittest中的…

如何在Windows 11和10上检查计算机的正常运行时间,这里有两种方法

序言 你的计算机的正常运行时间告诉你打开计算机已经有多长时间了。如果你需要这些信息进行故障排除或其他操作&#xff0c;那么很容易在Windows 11和Windows 10操作系统上找到你的正常运行时间。我们将向你展示图形和命令行方法。让我们开始吧。 使用任务管理器查找Windows正…

YoloV9实战与改进——专栏目录

摘要 &#x1f525;&#x1f680;本专栏教你如何嗨翻Yolov9&#xff01;&#x1f680;&#x1f525; &#x1f680;炸裂升级&#xff1a;嗨&#xff0c;小伙伴们&#xff01;这里有一波Yolov9的升级大招&#xff0c;带你领略最新论文的精华&#xff01;&#x1f4a5; 什么注意…

Star CCM+在电池热管理中SOC计算、充电Map调用、电池内阻调用的方法

前言 众所周知电池充电电流是随着电池温度与容量变化查表获得(形式见下表),其中电池的充电倍率(电流)是阶梯变化的,而内阻是线型变化的。因此为了仿真的准确定,需要在软件中实现数据的调用,计算电池的发热量。 电池内阻/充电倍率表 一 SOC计算 SOC的估算方法有开路电…

fpga 提高有什么进阶书推荐?

到FPGA中后期的时候就要开始接触&#xff0c;如&#xff1a;高速接口、光纤数字信号处理等项目实践了&#xff0c;那么我们可以读一些书进行提升&#xff0c;大家可以收藏下。 高速接口项目《嵌入式高速串行总线技术:基于FPGA实现与应用》作者&#xff1a;张锋 FPGA提升书籍推…

探索切片索引:列表反转的艺术

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;列表反转的挑战 二、切片索引的基本概念 三、切片索引实现列表反转 …

【微信小程序开发】小程序前后端交互--发送网络请求实战解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【计算机视觉(1)】

基于Python的OpenCV基础入门——图像的处理 计算机视觉简介OpenCV介绍图像的读取图像的显示图像窗口等待时间图像窗口的全部销毁图像的保存 图像的基本操作代码实现 计算机视觉简介 计算机视觉是人工智能 (AI) 的一个领域&#xff0c;是指让计算机和系统能够从图像、视频和其他…

Logstash笔记

目录​​​​​​​ 一、简介 二、单个输入和输出插件 三、多个输入和输出插件 四、pipeline结构 五、队列和数据弹性 六、内存队列 七、持久化队列 八、死信队列 (DLQ) 九、输入插件 1)、beats 2)、dead_letter_queue 3)、elasticsearch 4)、file 5)、redis 十、…

LESS IS MORE: ONE-SHOT-SUBGRAPH LINK PREDICTION ON LARGE-SCALE KNOWLEDGE GRAPHS

LESS IS MORE: ONE-SHOT-SUBGRAPH LINK PREDICTION ON LARGE-SCALE KNOWLEDGE GRAPHS&#xff08;ICLR2024&#xff09; 论文地址&#xff1a;https://arxiv.org/html/2403.10231v1 源码地址&#xff1a;https://github.com/tmlr-group/one-shot-subgraph ABSTRACT 为了推断知…

2024最新 Jenkins + Docker 实战教程(六)- Jenkins配置邮箱接收构建通知

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

软件设计:基于 python 代码快速生成 UML 图

1. 官方文档 PlantUML Language Reference Guide Comate | 百度研发编码助手 百度 Comate (Coding Mate Powered by AI) 是基于文心大模型的智能代码助手&#xff0c;结合百度积累多年的编程现场大数据和外部优秀开源数据&#xff0c;可以生成更符合实际研发场景的优质代码。…

element-plus表格的表单校验如何实现,重点在model和prop

文章目录 vue&#xff1a;3.x element-plus&#xff1a;2.7.3 重点&#xff1a; 1) tableData放到form对象里 2) form-item的prop要写成tableData.序号.属性 <!--table-表单校验--> <template><el-form ref"forms" :model"form"><e…

【Linux系列】软链接使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 ADRC原理 4.2 线性误差反馈控制律(LSEF) 4.3 ADRC-LSEF融合系统 5.完整工程文件 1.课题概述 基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真。 2.系统仿真结果 …

基于Java的地震震中附近城市分析实战

目录 前言 一、空间数据说明 1、空间查询 二、Java后台开发 1、模型层设计与实现 2、控制层设计与实现 三、Leaflet地图开发 1、地震震中位置展示 2、附近城市展示 3、成果展示 总结 前言 随着全球气候变化和地壳活动的不断演变&#xff0c;地震作为一种自然灾害&…

“AIGC行业投资时机分析:评估当前市场发展阶段与未来需求趋势“

文章目录 每日一句正能量前言行业前景当前发展前景相关领域的发展趋势行业潜力竞争情况结论 市场需求人才需求情况机会挑战结论 选择与规划自我评估行业调研职业规划风险管理个人陈述示例 后记 每日一句正能量 胖了就减&#xff0c;没钱就赚&#xff0c;不会就学&#xff0c;不…

rtk技术的使用, test ok

1. 什么是gnss 2 rtk定位