说明

该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。

该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。

说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。

友情提醒:本篇文章是属于系列文章,看该文章前,建议先看之前文章,可以更好理解项目结构。

有兴趣的朋友,请关注我吧(*^▽^*)。

关注我,学不会你来打我

安装Dapper

1、在使用的地方,安装最新版Dapper。

2、在使用的地方,安装最新版的Microsoft.Extensions.Configuration

3、在使用的地方,安装最新版的Microsoft.Extensions.Configuration.Json

4、在使用的地方,安装最新版的System.Data.SqlClient

最终安装包如下:

创建数据库连接类

在创建数据库连接类之前,我们要先在appsettings.json中配置我们的数据库连接字符串。

SqlConnection": "Server=SQLOLEDB;Data Source=你的sqlServer名称;uid=你的数据库账号;pwd=你的数据库密码;DataBase=你的数据库名字

如下图:

配置好数据库连接之后,我们需要一个读取数据库的类,所以我们需要在基础设施层(Infrastructure)创建。

创建文件夹DataBaseConnect然后在创建一个类DataBaseConnectConfig.cs。

内容如下:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
using System.Data;
using System.Data.SqlClient; namespace Infrastructure.DataBaseConnect
{
/// <summary>
/// 数据库连接类
/// </summary>
public static class DataBaseConnectConfig
{
/// <summary>
/// 声明静态连接
/// </summary>
public static IConfiguration Configuration { get; set; } /// <summary>
/// 静态构造函数
/// </summary>
static DataBaseConnectConfig()
{
//ReloadOnChange = true 当appsettings.json被修改时重新加载
Configuration = new ConfigurationBuilder()
.Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
.Build();
} /// <summary>
/// 连接数据库
/// </summary>
/// <param name="sqlConnectionStr">连接数据库字符串</param>
/// <returns></returns>
public static SqlConnection GetSqlConnection(string? sqlConnectionStr = null)
{ if (string.IsNullOrWhiteSpace(sqlConnectionStr))
{
sqlConnectionStr = Configuration["ConnectionStrings:SqlConnection"];
}
var connection = new SqlConnection(sqlConnectionStr);
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
return connection;
}
}
}
GetSqlConnection方法会读取appsettings.json中的连接配置,并打开数据库。

创建仓储

有了数据库连接类后,我们就要开始着手搭建底层仓储,结构如下:

根据以上结构,我们分别创建IRepository.cs仓储接口和Repository.cs仓储接口的实现

IRepository.cs内容如下:

 /// <summary>
/// 仓储接口定义
/// </summary>
public interface IRepository
{
}
/// <summary>
/// 定义泛型仓储接口
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <typeparam name="object">主键类型</typeparam>
public interface IRepository<T> : IRepository where T : class, new()
{
/// <summary>
/// 新增
/// </summary>
/// <param name="entity">实体</param>
/// <param name="innserSql">新增sql</param>
/// <returns></returns>
int Insert(T entity, string innserSql); /// <summary>
/// 修改
/// </summary>
/// <param name="entity">实体</param>
/// <param name="updateSql">更新sql</param>
/// <returns></returns>
int Update(T entity, string updateSql); /// <summary>
/// 删除
/// </summary>
/// <param name="deleteSql">删除sql</param>
/// <returns></returns>
int Delete(string key, string deleteSql); /// <summary>
/// 根据主键获取模型
/// </summary>
/// <param name="key">主键</param>
/// <param name="selectSql">查询sql</param>
/// <returns></returns>
T GetByKey(string key, string selectSql); /// <summary>
/// 获取所有数据
/// </summary>
/// <param name="selectAllSql">查询sql</param>
/// <returns></returns>
List<T> GetAll(string selectAllSql); /// <summary>
/// 根据唯一主键验证数据是否存在
/// </summary>
/// <param name="id">主键</param>
/// <param name="selectSql">查询sql</param>
/// <returns>返回true存在,false不存在</returns>
bool IsExist(string id, string selectSql);

说明1:该仓储接口是我们常用的crud(增删改查)的接口,它适用于所有的表结构,让我们不再重复的编写一样的sql语句。

说明2:该仓储接口可以自定义通用的接口,列如分页查询、批量新增、批量修改等。

Repository.cs结构如下

 /// <summary>
/// 仓储基类
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <typeparam name="TPrimaryKey">主键类型</typeparam>
public abstract class Repository<T> : IRepository<T> where T : class, new()
{
/// <summary>
/// 删除
/// </summary>
/// <param name="deleteSql">删除sql</param>
/// <returns></returns>
public int Delete(string key, string deleteSql)
{
using var connection = DataBaseConnectConfig.GetSqlConnection();
return connection.Execute(deleteSql, new { Key = key });
} /// <summary>
/// 根据主键获取模型
/// </summary>
/// <param name="id">主键</param>
/// <param name="selectSql">查询sql</param>
/// <returns></returns>
public T GetByKey(string id, string selectSql)
{
using var connection = DataBaseConnectConfig.GetSqlConnection();
return connection.QueryFirstOrDefault<T>(selectSql, new { Key = id });
} /// <summary>
/// 获取所有数据
/// </summary>
/// <param name="selectAllSql">查询sql</param>
/// <returns></returns>
public List<T> GetAll(string selectAllSql)
{
using var connection = DataBaseConnectConfig.GetSqlConnection();
return connection.Query<T>(selectAllSql).ToList();
} /// <summary>
/// 新增
/// </summary>
/// <param name="entity">新增实体</param>
/// <param name="innserSql">新增sql</param>
/// <returns></returns>
public int Insert(T entity, string innserSql)
{
using var connection = DataBaseConnectConfig.GetSqlConnection();
return connection.Execute(innserSql, entity);
} /// <summary>
/// 根据唯一主键验证数据是否存在
/// </summary>
/// <param name="id">主键</param>
/// <param name="selectSql">查询sql</param>
/// <returns>返回true存在,false不存在</returns>
public bool IsExist(string id, string selectSql)
{
using var connection = DataBaseConnectConfig.GetSqlConnection();
var count = connection.QueryFirst<int>(selectSql, new { Key = id });
if (count > 0)
return true;
else
return false;
} /// <summary>
/// 更新
/// </summary>
/// <param name="entity">更新实体</param>
/// <param name="updateSql">更新sql</param>
/// <returns></returns>
public int Update(T entity, string updateSql)
{
using var connection = DataBaseConnectConfig.GetSqlConnection();
return connection.Execute(updateSql, entity);
}
}

该类是IRepository.cs仓储接口的实现,它继承于Repository.cs

创建基础sql仓储(可省略)

做完以上操作,我们的底层仓储事实上已经搭建完成,但博主搭建了一个基础sql的仓储,以便管理项目中所有基础的sql语句。

在Infrastructure的根目录创建一个BaseSqlRepository.cs的类。

编写sql的基础语句,现有语句如下。

 /// <summary>
/// 创建继承sql仓储
/// </summary>
public class BaseSqlRepository
{
#region 表Sys_user /// <summary>
/// sys_user新增
/// </summary>
public static string sysUser_insertSql = @"insert into Sys_User (UserName ,Password ,Age,Sex,IsOpen,DepartmentId,CreateTime,CreateUser) values(@UserName ,@Password ,@Age,@Sex,@IsOpen,@DepartmentId,@CreateTime,@CreateUser)"; /// <summary>
/// sys_user更新
/// </summary>
public static string sysUser_updateSql = @"update Sys_User set UserName=@UserName ,Password=@Password ,Age=@Age,Sex=@Sex,DepartmentId=@DepartmentId,CreateTime=@CreateTime,CreateUser=@CreateUser where UserId = @UserId"; /// <summary>
/// sys_user查询
/// </summary>
public static string sysUser_selectByKeySql = @" select * from Sys_User where UserId=@Key"; /// <summary>
/// sys_user表查询全部语句
/// </summary>
public static string sysUser_selectAllSql = @" select * from Sys_User"; #endregion
}

创建表Sys_User模型

结构如下:

/// <summary>
/// 用户表模型
/// </summary>
public class SysUser
{
/// <summary>
/// 用户id
/// </summary>
public int UserId { get; set; } /// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; } /// <summary>
/// 密码
/// </summary>
public string Password { get; set; } /// <summary>
/// 年龄
/// </summary>
public int Age { get; set; } /// <summary>
/// 性别
/// </summary>
public int Sex { get; set; } /// <summary>
/// 是否开启
/// </summary>
public bool IsOpen { get; set; } /// <summary>
/// 部门id
/// </summary>
public int DepartmentId { get; set; } /// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; } /// <summary>
/// 创建人员
/// </summary>
public string CreateUser { get; set; }
}

该结构,同数据库表结构(一会说)

使用仓储

在之前的ISysUserRepository.cs和SysUserRepository.cs中分别继承IRepository.cs 和Repository.cs

/// <summary>
/// 用户服务仓储接口
/// </summary>
public interface ISysUserRepository : IRepository<SysUser>
{
/// <summary>
/// 测试Autofac
/// </summary>
/// <returns></returns>
string TestAutofac();
}
 /// <summary>
/// 用户服务仓储接口实现
/// </summary>
public class SysUserRepository : Repository<SysUser>, ISysUserRepository
{
/// <summary>
/// 测试Autofac
/// </summary>
/// <returns></returns>
public string TestAutofac()
{
return "Autofac使用成功";
}
}

该用户仓储继承IRepository.cs 和Repository.cs之后,它就拥有了该仓储接口下的所有接口。

测试

做完以上工作,我们开始测试

首先,我们需要创建数据库(使用sqlServer数据库)和用户表

表结构和数据代码如下:

USE [OverallAuth]
GO
/****** Object: Table [dbo].[Sys_User] Script Date: 2024/10/6 10:38:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Sys_User](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[UserName] [varchar](50) NOT NULL,
[Password] [varchar](50) NOT NULL,
[Age] [int] NULL,
[Sex] [int] NULL,
[DepartmentId] [int] NOT NULL,
[IsOpen] [bit] NULL,
[CreateTime] [datetime] NULL,
[CreateUser] [varchar](50) NULL,
CONSTRAINT [PK_Sys_User] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Sys_User] ON INSERT [dbo].[Sys_User] ([UserId], [UserName], [Password], [Age], [Sex], [DepartmentId], [IsOpen], [CreateTime], [CreateUser]) VALUES (1, N'张三', N'1', 18, 1, 1, 1, CAST(N'2024-10-06T09:14:13.000' AS DateTime), N'1')
INSERT [dbo].[Sys_User] ([UserId], [UserName], [Password], [Age], [Sex], [DepartmentId], [IsOpen], [CreateTime], [CreateUser]) VALUES (2, N'李四', N'1', 19, 1, 1, 1, CAST(N'2024-10-06T09:15:08.000' AS DateTime), N'1')
SET IDENTITY_INSERT [dbo].[Sys_User] OFF
ALTER TABLE [dbo].[Sys_User] ADD DEFAULT ((0)) FOR [IsOpen]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_User', @level2type=N'COLUMN',@level2name=N'UserName'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户密码' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_User', @level2type=N'COLUMN',@level2name=N'Password'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户年龄' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_User', @level2type=N'COLUMN',@level2name=N'Age'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户年龄 1:男 2:女' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_User', @level2type=N'COLUMN',@level2name=N'Sex'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'部门id(表Department主键)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_User', @level2type=N'COLUMN',@level2name=N'DepartmentId'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_User', @level2type=N'COLUMN',@level2name=N'CreateTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建人员' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_User', @level2type=N'COLUMN',@level2name=N'CreateUser'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'人员表' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_User'
GO

服务层编写接口调用

说明:以下这些类,都在上一期中有说道,这里不再多说。

 /// <summary>
/// 用户服务接口
/// </summary>
public interface ISysUserService
{
/// <summary>
/// 测试Autofac
/// </summary>
/// <returns></returns>
string TestAutofac(); /// <summary>
/// 查询所有用户
/// </summary>
/// <returns></returns>
List<SysUser> GetAllUser();
}
/// <summary>
/// 用户服务接口实现
/// </summary>
public class SysUserService : ISysUserService
{
#region 构造实例化 private readonly ISysUserRepository _sysUserRepository; public SysUserService(ISysUserRepository sysUserRepository)
{
_sysUserRepository = sysUserRepository;
} #endregion /// <summary>
/// 测试Autofac
/// </summary>
/// <returns></returns>
public string TestAutofac()
{
return _sysUserRepository.TestAutofac();
} /// <summary>
/// 查询所有用户
/// </summary>
/// <returns></returns>
public List<SysUser> GetAllUser()
{
return _sysUserRepository.GetAll(BaseSqlRepository.sysUser_selectAllSql);
}
}

在控制器(SysUserController)中添加如下接口

   /// <summary>
/// 查询所有用户
/// </summary>
/// <returns></returns>
[HttpGet]
public List<SysUser> GetAllUser()
{
return _userService.GetAllUser();
}

好了,启动项目,进行测试

可以看到,数据获取成功,到这里,我们使用Dapper搭建底层仓储连接数据库成功。

源代码地址:https://gitee.com/yangguangchenjie/overall-auth2.0-web-api  

预览地址:http://139.155.137.144:8880/swagger/index.html

帮我Star,谢谢。

有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。

关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界

(系列五).net8 中使用Dapper搭建底层仓储连接数据库(附源码)的更多相关文章

  1. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  2. Entity Framework在Asp.net MVC中的实现One Context Per Request(附源码)

    上篇中"Entity Framework中的Identity map和Unit of Work模式", 由于EF中的Identity map和Unit of Work模式,EF体现 ...

  3. arcgis api 3.x for js 入门开发系列批量叠加 zip 压缩 SHP 图层优化篇(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  4. [五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的

      Launcher启动类 本文是双亲委派机制的源码分析部分,类加载机制中的双亲委派模型对于jvm的稳定运行是非常重要的 不过源码其实比较简单,接下来简单介绍一下   我们先从启动类说起 有一个Lau ...

  5. vue系列---理解Vue中的computed,watch,methods的区别及源码实现(六)

    _ 阅读目录 一. 理解Vue中的computed用法 二:computed 和 methods的区别? 三:Vue中的watch的用法 四:computed的基本原理及源码实现 回到顶部 一. 理解 ...

  6. 教你搭建SpringMVC框架( 附源码)

    一.项目目录结构 二.SpringMVC需要使用的jar包 commons-logging-1.2.jar junit-4.10.jar log4j-api-2.0.2.jar log4j-core- ...

  7. Springboot系列:Springboot与Thymeleaf模板引擎整合基础教程(附源码)

    前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的时间里做一些基础整合的介绍,当然,可能也 ...

  8. JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)

    [我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...

  9. 教你搭建SpringSecurity3框架(附源码)

    源码下载地址:http://pan.baidu.com/s/1qWsgIg0 一.web.xml <?xml version="1.0" encoding="UTF ...

  10. leaflet-webpack 入门开发系列二加载不同在线地图切换显示(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

随机推荐

  1. RHCA rh442 007 hugetlbfs strace命令追踪 脏页设置 内存分配

    内存管理 虚拟内存 --- 物理内存 应用程序申请虚拟内存 --- RAM + SWAP (真正主板上的设备) 他们之间有一张映射表 page table 页表 PTE: 页表条目 虚拟内存和物理内存 ...

  2. 【JS】04 DOM 文档对象模型 P1 查找元素、改变内容、绑定事件

    什么是DOM? Document Object Model 文档指的是HTML文档 当浏览器打开一个网页的时候,实际上把HTML文档读取到内存中进行解析 整个HTML文档被封装为document文档对 ...

  3. 【JDBC】Extra04 Mirosoft-Access-JDBC

    MS没提供Jdbc驱动,有一个第三方的UcanAcess驱动包 <!-- https://mvnrepository.com/artifact/net.sf.ucanaccess/ucanacc ...

  4. 【FastDFS】05 Java程序测试上传

    创建普通Maven工程 导入所需依赖坐标: <dependencies> <!-- https://mvnrepository.com/artifact/net.oschina.zc ...

  5. 蒸馏网络中的bias是指什么? —— 论文《Distilling the Knowledge in a Neural Network》—— 知识蒸馏

    论文地址: https://arxiv.org/pdf/1503.02531.pdf 在蒸馏网络中会遇到手动调整bias的说法,但是这个bias在论文中又没有明细说明是怎么个bias,具体论文出处: ...

  6. windows10开启电源模式中的休眠选项

    使用管理员权限开启PowerShell,输入命令: powercfg -h on

  7. Kotlin 控制流和数组操作详解

    Kotlin when 与编写许多 if..else 表达式相比,您可以使用 when 表达式,它更易读. 它用于选择要执行的多个代码块中的一个: 示例 使用星期几的编号来计算星期几的名称: val ...

  8. 使用Typora编写后的md文件优雅的上传到博客(插件dotnet-cnblog的使用)

    一.Typora的设置 如下图,设置图片上传位置 之后文章上的图片都会临时存放到文件同级目录下的xxx.Asster文件夹下面. 二.下载插件dotnet-cnblog 1.安装.Net Core S ...

  9. 09-canvas绘制坐标系

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  10. Linux内核 自旋锁spin lock,教你如何用自旋锁让ubuntu死锁

    背景 由于在多处理器环境中某些资源的有限性,有时需要互斥访问(mutual exclusion),这时候就需要引入锁的概念,只有获取了锁的任务才能够对资源进行访问,由于多线程的核心是CPU的时间分片, ...