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

项目位置在下图的地方:

祝您用餐愉快

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/641442.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用这8种方法在海外媒体推广发稿平台上获得突破-华媒舍

在今天的数字时代&#xff0c;海外媒体推广发稿平台已经成为了许多机构和个人宣传和推广的有效途径。如何在这些平台上获得突破并吸引更多的关注是一个关键问题。本文将介绍8种方法&#xff0c;帮助您在海外媒体推广发稿平台上实现突破。 1. 确定目标受众 在开始使用海外媒体推…

C++语法|虚函数与多态详细讲解(六)|如何解释多态?(面试向)

系列汇总讲解&#xff0c;请移步&#xff1a; C语法&#xff5c;虚函数与多态详细讲解系列&#xff08;包含多重继承内容&#xff09; 多态分为了两种&#xff0c;一种是静态的多态&#xff0c;一种是动态的多态。 静态&#xff08;编译时期&#xff09;的多态 函数重载 boo…

pands使用openpyxl引擎实现EXCEL条件格式

通过python的openpyxl库&#xff0c;实现公式条件格式。 实现内容&#xff1a;D列单元格不等于E列同行单元格时标红。 #重点是formula后面的公式不需要“”号。 from openpyxl.styles import Color, PatternFill, Font, Border from openpyxl.styles.differential import Dif…

【设计模式】JAVA Design Patterns——Bytecode(字节码模式)

&#x1f50d;目的 允许编码行为作为虚拟机的指令 &#x1f50d;解释 真实世界例子 一个团队正在开发一款新的巫师对战游戏。巫师的行为需要经过精心的调整和上百次的游玩测试。每次当游戏设计师想改变巫师行为时都让程序员去修改代码这是不妥的&#xff0c;所以巫师行为以数据…

git push后一直卡在在Writing objects:问题

git push后一直卡在Writing objects: 解决&#xff1a;设置 git config --global http.postBuffer 5242880000在执行git push。 一般设置后就可以成功了&#xff0c;后面不用看。 2. 我这里结果又报错&#xff1a; fatal: protocol error: bad line length 8192 MiB | 107.46 …

【C++】d1

关键字&#xff1a; 运行、前缀、输入输出、换行 运行f10 前缀必须项&#xff1a; #include <iostream> using namespace std; 输入/输出&#xff1a; cin >> 输入 cout << 输出 语句通过>>或<<分开 换行 endl或者"\n"

想当安卓开发工程师?学习路线分享!

安卓开发学习路线 在前几篇文章中,对安卓开发岗位的岗位要求做了一些科普,本节文章将介绍安卓开发岗位的学习路线。 目前,网络上有很多面经、算法题解、算法课等学习资料,如何合理利用这些资料成为技术求职者的一大困惑。笔者整理了一份安卓开发岗位学习路线供大家参考,…

第四课 communcation服务-can配置第二弹

Davinci配置目标: 介绍DBC基本属性,并且配置出一个DBC。 将DBC导入到vector的davinci工具,生成我们想要的代码。 Davinci配置步骤: 1. 编辑DBC文件 DBC文件是一种非常重要的工具,所谓DBC就是Database CAN,CAN网络的数据库文件,定义了CAN网络的节点、消息、信号的所有…

网络安全知识核心20要点

1、什么是SQL注入攻击 概述 攻击者在 HTTP 请求中注入恶意的 SQL 代码&#xff0c;服务器使用参数构建数据库 SQL 命令时&#xff0c;恶意SQL 被一起构造&#xff0c;并在数据库中执行。 注入方法 用户登录&#xff0c;输入用户名 lianggzone&#xff0c;密码‘ or ‘1’’…

axios如何传递数组作为参数,后端又如何接收呢????

前端的参数是一个数组。 前端编写&#xff1a; 后端接收&#xff1a;

git解决版本冲突 -git pull

当在Git中遇到版本冲突时&#xff0c;通常是因为两个或更多的开发者在同一时间修改了同一个文件的相同部分&#xff0c;并将这些修改推送到远程仓库。Git无法自动合并这些修改&#xff0c;因此会产生冲突。以下是解决Git版本冲突的基本步骤&#xff1a; 拉取最新代码&#xff…

mybatis-plus 优雅的写service接口中方法(3)

多表联查 上文讲过了自定义sql &#xff0c;和wrapper的使用&#xff0c;但是我们可以发现 我们查询的都是数据库中的一张表&#xff0c;那么怎么进行多表联查呢&#xff0c;当然也是用自定义sql来进行实现 比如说 查询 id 为 1 2 4 的用户 并且 地址在北京 的 用户名称 普…

AI崛起,掌握它,开启智能新生活!

AI崛起&#xff0c;掌握它&#xff0c;开启智能新生活&#xff01; &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &…

LDAP: error code 32 - No Such Object

目前我的项目版本&#xff1a; Spring版本:5.3.15SpringBoot版本:2.6.3 完整错误 org.springframework.ldap.NameNotFoundException: [LDAP: error code 32 - No Such Object]; nested exception is javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Objec…

Java进阶学习笔记9——子类中访问其他成员遵循就近原则

正确访问成员的方法。 在子类方法中访问其他成员&#xff08;成员变量、成员方法&#xff09;&#xff0c;是依照就近原则的。 F类&#xff1a; package cn.ensource.d13_extends_visit;public class F {String name "父类名字";public void print() {System.out.p…

[算法][前缀和] [leetcode]724. 寻找数组的中心下标

题目地址 https://leetcode.cn/problems/find-pivot-index/description/ 题目描述 代码 class Solution {public int pivotIndex(int[] nums) {int total Arrays.stream(nums).sum();//前缀和int prefixSum 0;int len nums.length;for(int i 0;i<len;i){if (i-1>0){p…

【已解决】C#设置Halcon显示区域Region的颜色

前言 在开发过程中&#xff0c;突然发现我需要显示的筛选区域的颜色是白色的&#xff0c;如下图示&#xff0c;这对我们来说不明显会导致我的二值化筛选的时候存在误差&#xff0c;因此我们需要更换成红色显示这样的话就可以更加的明显&#xff0c;二值化筛选更加的准确。 解…

若依 Ruoyi-Vue PageHelper 分页失效 total为记录数

分页插件PageHelper返回记录总数total竟然出错了 执行控制台的SQL&#xff0c;查询出来的total数量是对的&#xff0c;很奇怪分页的total设置为查询到的记录数。 怀疑对list.stream操作&#xff0c;影响了分页&#xff0c;代码发现确实是这样&#xff0c;debug&#xff0c;居然…

【Mac】跑猫RunCat for mac(菜单栏Cpu可视化监测工具) v10.3免费版安装教程

软件介绍 RunCat是一款为菜单栏提供关键帧动画的软件。动画速度会根据Mac的CPU使用情况而变化。奔跑的小猫通过运行速度告诉您Mac的CPU使用率。 这是一款好玩的软件&#xff0c;可以为您的Mac使用添加一点小确幸。感兴趣的朋友可以试试哦。 安装步骤 1.打开安装包&#xff0…