WebAPI项目框架仓储模式+导入SqlSuag

news/2024/7/7 1:08:25/文章来源:https://www.cnblogs.com/leon1128/p/18280611

仓储(Respository)是对数据库访问的一个封装

解决方案新建Respository文件夹,新建类库Web.Core.IRepository,Web.Core.Repository

解决方案新建Services文件夹,新建类库Web.Core.IServices,Web.Core.Services

在类库Web.Core.Model下面新建Entity文件夹

SqlSugar是国人开发者开发的一款高性能、轻量级 ORM框架,官网 SqlSugar ORM 5.X 官网 、文档、教程 - SqlSugar 5x - .NET果糖网

Respository层和Model层引入SqlSugarCore

Repository层新建suger文件夹,

新建BaseDBConfig.cs 数据库连接字符串

1 public class BaseDBConfig
2     {
3         /// <summary>
4         /// 数据库连接字符串
5         /// </summary>
6         public static string ConnectionString { get; set; }
7 
8     }

新建DBConext.cs帮助类

 1 public class DbContext<T> where T : class, new()
 2     {
 3         public DbContext()
 4         {
 5             Db = new SqlSugarClient(new ConnectionConfig()
 6             {
 7                 ConnectionString = BaseDBConfig.ConnectionString,
 8                 DbType = DbType.SqlServer,
 9                 InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息
10                 IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样我就不多解释了
11 
12             });
13             //调式代码 用来打印SQL 
14             Db.Aop.OnLogExecuting = (sql, pars) =>
15             {
16                 Console.WriteLine(sql + "\r\n" +
17                     Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
18                 Console.WriteLine();
19             };
20 
21         }
22         //注意:不能写成静态的
23         public SqlSugarClient Db;//用来处理事务多表查询和复杂的操作
24         public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }//用来操作当前表的数据
25 
26 
27 
28 
29     }

在program.cs里面增加读取appsettings.json中保存的数据库连接字符串

 1 //数据库配置

2 BaseDBConfig.ConnectionString = builder.Configuration.GetSection("AppSettings:ConnectionString").Value; 

IRepository 层中添加Base文件夹,并添加基类接口 IBaseRepository.cs

 1 /// <summary>
 2     /// 基类接口,其他接口继承该接口
 3     /// </summary>
 4     /// <typeparam name="TEntity"></typeparam>
 5    public interface IBaseRepository<TEntity> where TEntity : class
 6     {
 7         /// <summary>
 8         /// 根据ID列表查询
 9         /// </summary>
10         /// <param name="objId"></param>
11         /// <returns></returns>
12         Task<TEntity> QueryByID(object objId);
13 
14         /// <summary>
15         /// 查询所有数据
16         /// </summary>
17         /// <param name="objId"></param>
18         /// <returns></returns>
19         Task<List<TEntity>> Query();
20 
21         /// <summary>
22         /// 添加
23         /// </summary>
24         /// <param name="model"></param>
25         /// <returns></returns>
26         Task<long> Add(TEntity model);
27 
28         /// <summary>
29         /// 修改
30         /// </summary>
31         /// <param name="model"></param>
32         /// <returns></returns>
33         Task<bool> Update(TEntity model);
34 
35         /// <summary>
36         /// 根据id列表删除
37         /// </summary>
38         /// <param name="ids"></param>
39         /// <returns></returns>
40         Task<bool> DeleteByIds(object[] ids);
41 
42         /// <summary>
43         /// 根据ID删除
44         /// </summary>
45         /// <param name="id"></param>
46         /// <returns></returns>
47         Task<bool> DeleteById(object id);
48 
49     }

Repository 层中,添加Base文件夹,并添加 BaseRepository.cs 基类

 1 public class BaseRepository<TEntity> : DbContext<TEntity>, IBaseRepository<TEntity> where TEntity : class, new()
 2     {
 3         /// <summary>
 4         /// 写入实体数据
 5         /// </summary>
 6         /// <param name="model"></param>
 7         /// <returns></returns>
 8         public async Task<long> Add(TEntity model)
 9         {
10             var i = await Task.Run(() => Db.Insertable(model).ExecuteCommand());
11             //返回的i是long类型,这里你可以根据你的业务需要进行处理
12             return i;
13         }
14 
15         /// <summary>
16         /// 根据ID列表删除
17         /// </summary>
18         /// <param name="ids"></param>
19         /// <returns></returns>
20         public async Task<bool> DeleteByIds(object[] ids)
21         {
22             var i = await Task.Run(() => Db.Deleteable<TEntity>().In(ids).ExecuteCommand());
23             return i > 0;
24         }
25 
26         /// <summary>
27         /// 根据ID删除
28         /// </summary>
29         /// <param name="ids"></param>
30         /// <returns></returns>
31         public async Task<bool> DeleteById(object id)
32         {
33             var i = await Task.Run(() => Db.Deleteable<TEntity>().In(id).ExecuteCommand());
34             return i > 0;
35         }
36         /// <summary>
37         /// 根据ID查询一条数据
38         /// </summary>
39         /// <param name="objId"></param>
40         /// <returns></returns>
41         public async Task<TEntity> QueryByID(object objId)
42         {
43             return await Task.Run(() => Db.Queryable<TEntity>().InSingle(objId));
44         }
45 
46         /// <summary>
47         /// 查询所有数据
48         /// </summary>
49         /// <param name="objId"></param>
50         /// <returns></returns>
51         public async Task<List<TEntity>> Query()
52         {
53             return await Task.Run(() => Db.Queryable<TEntity>().ToListAsync());
54         }
55         /// <summary>
56         /// 更新实体数据
57         /// </summary>
58         /// <param name="model"></param>
59         /// <returns></returns>
60         public async Task<bool> Update(TEntity model)
61         {
62             //这种方式会以主键为条件
63             var i = await Task.Run(() => Db.Updateable(model).ExecuteCommand());
64             return i > 0;
65         }
66     }

IService 层中添加Base文件夹,并添加接口 IBaseService.cs。

 1 public interface IBaseServices<TEntity> where TEntity : class
 2     {
 3         /// <summary>
 4         /// 根据ID列表删除
 5         /// </summary>
 6         /// <param name="ids"></param>
 7         /// <returns></returns>
 8         Task<bool> DeleteByIds(object[] ids);
 9 
10         /// <summary>
11         /// 根据ID删除
12         /// </summary>
13         /// <param name="id"></param>
14         /// <returns></returns>
15         Task<bool> DeleteById(string id);
16         /// <summary>
17         /// 根据ID查询
18         /// </summary>
19         /// <param name="objId"></param>
20         /// <returns></returns>
21         Task<TEntity> QueryByID(object objId);
22 
23         /// <summary>
24         /// 查询所有数据
25         /// </summary>
26         /// <returns></returns>
27         Task<List<TEntity>> Query();
28 
29         /// <summary>
30         /// 添加实体
31         /// </summary>
32         /// <param name="model"></param>
33         /// <returns></returns>
34         Task<long> Add(TEntity model);
35 
36         /// <summary>
37         /// 更新实体
38         /// </summary>
39         /// <param name="model"></param>
40         /// <returns></returns>
41 
42         Task<bool> Update(TEntity model);
43     }

Service 层中添加Base文件夹,并添加接口 BaseService.cs。

 1 public class BaseServices<TEntity> : IBaseServices<TEntity> where TEntity : class, new()
 2     {
 3         public IBaseRepository<TEntity> baseDal = new BaseRepository<TEntity>();
 4 
 5         /// <summary>
 6         /// 写入实体
 7         /// </summary>
 8         /// <param name="model"></param>
 9         /// <returns></returns>
10         public async Task<long> Add(TEntity model)
11         {
12             return await baseDal.Add(model);
13         }
14 
15         /// <summary>
16         /// 根据ID删除
17         /// </summary>
18         /// <param name="ids"></param>
19         /// <returns></returns>
20 
21         public async Task<bool> DeleteByIds(object[] ids)
22         {
23             return await baseDal.DeleteByIds(ids);
24         }
25 
26         /// <summary>
27         /// 根据ID查询
28         /// </summary>
29         /// <param name="objId"></param>
30         /// <returns></returns>
31         public async Task<TEntity> QueryByID(object objId)
32         {
33             return await baseDal.QueryByID(objId);
34         }
35 
36         /// <summary>
37         /// 更新实体
38         /// </summary>
39         /// <param name="model"></param>
40         /// <returns></returns>
41         public async Task<bool> Update(TEntity model)
42         {
43             return await baseDal.Update(model);
44         }
45 
46         /// <summary>
47         /// 查询所有数据
48         /// </summary>
49         /// <returns></returns>
50         public async Task<List<TEntity>> Query()
51         {
52             return await baseDal.Query();
53         }
54 
55         /// <summary>
56         /// 根据ID删除
57         /// </summary>
58         /// <param name="ids"></param>
59         /// <returns></returns>
60         public async Task<bool> DeleteById(string id)
61         {
62             return await baseDal.DeleteById(id);
63         }
64     }

在Model层下的Entity文件,新建student.cs实体类

 1 /// <summary>
 2     /// 学生表
 3     /// </summary>
 4     public class Student
 5     {
 6         /// <summary>
 7         /// id
 8         /// </summary>
 9         public int Id { get; set; }
10         /// <summary>
11         /// 姓名
12         /// </summary>
13         public string Name { get; set; }
14         /// <summary>
15         /// 年龄
16         /// </summary>
17         public int Age { get; set; }
18     }

在IRepository层中,新建IStudentRepository接口,继承自IBaseRepository<Student>

public interface IStudentRepository:IBaseRepository<Student>
{
}

在Repository层中,新建StudentRepository接口,继承自BaseRepository<Student>, IStudentRepository

public class StudentRepository : BaseRepository<Student>, IStudentRepository
{
}

在IServices层中,新建IStudentService接口,继承自IBaseServices<Student>

public interface IStudentService : IBaseServices<Student>
{
}

在Services层中,新建StudentService接口,继承自BaseService<Student>, IStudentService

public class StudentService : BaseService<Student>, IStudentService
{

}
新建控制器StudentController,新增接口

 1 public class StudentController : BaseApiController
 2     {
 3         /// <summary>
 4         /// 添加数据
 5         /// </summary>
 6         /// <returns></returns>
 7         [HttpGet]
 8         public async Task<IActionResult> Add(Student student)
 9         {
10             IStudentService userService = new StudentService();
11             var count = await userService.Add(student);
12             return Ok(count);
13         }
14     }

运行项目,插入数据成功。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统内存管理学前补充知识

操作系统内存管理学前补充知识 目录操作系统内存管理学前补充知识什么是内存,有什么作用数据的数量单位指令的工作原理3种装入的方式(逻辑地址—>物理地址)绝对装入静态重定位动态重定位从写程序到程序的运行链接的三种方式 什么是内存,有什么作用 手机有内存,电脑中也…

Nginx proxy manager反向代理docker hub

1.域名解析 用作反向代理的域名要提前解析,如果使用外国的DNS域名提供商的话,最好提前一天解析好。 2.配置NPM 2.1.Details选项卡2.2.SSL选项卡2.3.Advanced选项卡 location / {# Docker hub 的官方镜像仓库proxy_pass https://registry-1.docker.io; proxy_set_header Host…

cJSON:构建JSON

使用cJSON库构建比较简单的JSON类型: create_json.c #include <stdio.h> #include <string.h> #include <stdlib.h>#include "cJSON.h"static int create_json_type_1(void) {char *json_str = NULL;cJSON *root = NULL;root = cJSON_CreateObjec…

【esp32 学习笔记】将lvgl融入esp-idf项目中

lvgl科普 lvgl 主要特点:Github库整体了解版本号编排原则屏幕兼容性LVGL 问题处理: lvgl 与 FreeRTOS 由于esp-idf本身带了 FreeRTOS系统,因此需要关注一下操作系统相关的内容:void lvgl_thread(void) {while(1) {uint32_t time_till_next;time_till_next = lv_timer_hand…

QT6 CMake项目配置 (Visual Studio)

QT6 CMake项目配置 (Visual Studio) 上一节已经编译好了动态和静态的QT库,接下来在CMake中引入。 这边主要介绍使用Visual Studio的配置方法 测试环境 首先使用VS创建一个项目来测试CMake能否正常使用。 如果是首次打开VS会有个配置主题的界面,自己选一下就好了 首先我们来创…

ssrf+结合redis 写入crontab或者公钥(两种环境)

REDIS redis作为一种数据库 其实是会真的将数据写入到内存中的 我们利用ssrf请求 请求redis 实现服务器对自己的公钥或任务计划写入 实现无密码登录 或反弹bashredis监听所有地址时 才能被外部访问 否则只能127.0.0.1 本地访问 而且开启保护模式后会导致目标端口只能本地访问 这…

ffmpeg常用命令汇总

最近在学习ffmpeg,将基础命令做一次汇总,便于自己以后查阅: 1. ffmpeg 常用命令 ffmpeg 帮助信息查看 // 查看 ffmpeg 的基础信息。 ffmpeg --help// 查看高级参数部分。 ffmpeg --help long// 查看全部的帮助信息。 ffmpeg --help full转封装 // -hide_banner: 隐去 ffmpeg …

麻烦问一下xpath标签定位的这个索引是做什么用的?

大家好,我是Python进阶者。 一、前言 前几天在Python最强王者交流群【杨又串🍻】问了一个Python网络爬虫的问题,问题如下:老师,麻烦问一下xpath标签定位的这个索引是做什么用的,我听网课把这个知识点跳过了? 二、实现过程 后来【隔壁😼山楂】给了一个指导:这个过去出…

李沐动手学深度学习V2-chap_preliminaries

李沐动手学深度学习V2 文章内容说明 本文主要是自己学习过程中的随手笔记,需要自取 课程参考B站:https://space.bilibili.com/1567748478?spm_id_from=333.788.0.0 课件等信息原视频简介中有CSV文件修改读取成张量tensor 数据预处理 首先(创建一个人工数据集,并存储在CSV(…

C语言打印倒三角形,底边长n作为参数输入,从键盘输入

打印倒三角形,底边长n作为参数输入,从键盘输入。#include <stdio.h> int main(int argc, char const *argv[]) {int i, j, k, l, n;printf("请输入底边长: \n");scanf("%d", &n);while (getchar() != \n);printf("输出图形如下:\n"…

WebAPI项目框架JWT权限验证

JWT是什么?校验逻辑?授权过程?这里就不过多的阐述了,直接上代码 在appsettings.json中配置jwt参数的值 SecretKey必须大于16个字符1 {2 "Logging": {3 "LogLevel": {4 "Default": "Information",5 "Micros…

2.SpringBoot快速上手

2.SpringBoot快速上手 SpringBoot介绍javaEE的开发经常会涉及到3个框架Spring ,SpringMVC,MyBatis.但是这三个框架配置极其繁琐,有大量的xml文件,spring Boot对之前的配置进行极大的简化Spring Boot 是由Pivotal团队提供的基于Spring的全新框架,简化Spring应用的初始搭建和…

RTMP协议

RTMP(Real-Time Messaging Protocol)是一个综合性的协议,不仅可以传输音视频数据,还可以传输信令控制指令。RTMP 使用 TCP 作为传输协议,可以直接在 TCP 连接上传输音视频数据,也可以传输控制指令,实现了音视频流的实时传输和控制。 与RTSP 不同,RTSP(Real-Time S…

yarn install 时显示 node_modules\esbuild: Command failed

可以找一找你的nodejs安装路径是不是中文的,如果是中文的换成英文应该就可以了(记得系统变量里也要改掉)

阿里云个人账号 创建docker仓库

1、创建阿里云账号 2、搜索“容器镜像服务”,进入,点击“管理控制台” 3、选择个人实例,这一步可能会让你创建registry密码(如果没有创建过的话),后面登录需要 4、创建命名空间5、创建镜像仓库 输入信息,点击下一步,选择本地仓库 6、进入管理页面 执行相关命令

Django3在网页上生成二维码

1.安装依赖包pip install django-qr-code2.在django,你项目的settings中,安装app 打开你项目的setting,找到INSTALLED_APPS ,在这里新加一条qr_code INSTALLED_APPS = [...,rest_framework,qr_code,... ] 3.在你打算渲染的html文档中,导入模板 {% load qr_code %}ps:如果…

Hackthebox bagel.dll 代码审计

利用ilspy将bagel.dll打开关于此目录有可以说的内容 目录解析 最上方的bagel是组装名字(assemble name) bagel_server 是命令空间(namespace) 下一级分支是类如File,Base,Handler,Orders等(class) 反序列化导致的命令执行漏洞代码审计思路 首先看主程序Bagel 1.通过明显的英…

2024/7/2 T1

题意:分析: 记 \(S_{i}\) 表示目前第 \(i\) 个集合里的元素个数。 集合之间互不区分,强制钦定必须满足 \(S_{i} \le S_{i+1}(i<k)\)。 经搜索发现,这样的状态数量最多约为 \(1.8 \times 10^5\)。 极差可以这样处理:将 \(a\) 排序,\(S_{i}\) 第一次加入某个元素 \(x\),…

Eplan插件 - 矩形修订云线

前言 在 CAD 中,矩形云线一直是设计师们用于标注修订区域或突出重要部分的得力工具。然而,在 Eplan 中,没有直接绘制矩形云线的功能。为了填补这一空白,开发了专门用于Eplan的矩形修订云线插件。 这款插件保留了Eplan绘制的习惯,可以简洁快速的框选出需要修订或者重点关注…

Nginx配置以及热升级

目录Nginx详解1. Nginx关键特性2. Nginx配置2.1 event2.2 http2.2.1 log_format2.2.2 sendfile2.2.3 tcp_nopush2.2.4 tcp_nodelay2.2.5 keepalive_timeout2.2.6 include2.2.7 default_type2.2.8 server3. 配置Nginx虚拟主机3.1 基于端口3.2 基于IP3.3 基于域名4. Location4.1 …