翼度科技»论坛 编程开发 .net 查看内容

(系列五).net8 中使用Dapper搭建底层仓储连接数据库(附源码)

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
说明

    该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。
    该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。
    说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。
友情提醒:本篇文章是属于系列文章,看该文章前,建议先看之前文章,可以更好理解项目结构。
有兴趣的朋友,请关注我吧(*^▽^*)。

关注我,学不会你来打我
安装Dapper
1、在使用的地方,安装最新版Dapper。
2、在使用的地方,安装最新版的Microsoft.Extensions.Configuration
3、在使用的地方,安装最新版的Microsoft.Extensions.Configuration.Json
4、在使用的地方,安装最新版的System.Data.SqlClient
最终安装包如下:

 
创建数据库连接类
在创建数据库连接类之前,我们要先在appsettings.json中配置我们的数据库连接字符串。
  1. SqlConnection": "Server=SQLOLEDB;Data Source=你的sqlServer名称;uid=你的数据库账号;pwd=你的数据库密码;DataBase=你的数据库名字
复制代码
如下图:

配置好数据库连接之后,我们需要一个读取数据库的类,所以我们需要在基础设施层(Infrastructure)创建。
创建文件夹DataBaseConnect然后在创建一个类DataBaseConnectConfig.cs。
内容如下:
  1. using Microsoft.Extensions.Configuration;
  2. using Microsoft.Extensions.Configuration.Json;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. namespace Infrastructure.DataBaseConnect
  6. {
  7.     /// <summary>
  8.     /// 数据库连接类
  9.     /// </summary>
  10.     public static class DataBaseConnectConfig
  11.     {
  12.         /// <summary>
  13.         /// 声明静态连接
  14.         /// </summary>
  15.         public static IConfiguration Configuration { get; set; }
  16.         /// <summary>
  17.         /// 静态构造函数
  18.         /// </summary>
  19.         static DataBaseConnectConfig()
  20.         {
  21.             //ReloadOnChange = true 当appsettings.json被修改时重新加载            
  22.             Configuration = new ConfigurationBuilder()
  23.             .Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
  24.             .Build();
  25.         }
  26.         /// <summary>
  27.         /// 连接数据库
  28.         /// </summary>
  29.         /// <param name="sqlConnectionStr">连接数据库字符串</param>
  30.         /// <returns></returns>
  31.         public static SqlConnection GetSqlConnection(string? sqlConnectionStr = null)
  32.         {
  33.             if (string.IsNullOrWhiteSpace(sqlConnectionStr))
  34.             {
  35.                 sqlConnectionStr = Configuration["ConnectionStrings:SqlConnection"];
  36.             }
  37.             var connection = new SqlConnection(sqlConnectionStr);
  38.             if (connection.State != ConnectionState.Open)
  39.             {
  40.                 connection.Open();
  41.             }
  42.             return connection;
  43.         }
  44.     }
  45. }
复制代码
  1. GetSqlConnection方法会读取appsettings.json中的连接配置,并打开数据库。
复制代码
 
创建仓储
有了数据库连接类后,我们就要开始着手搭建底层仓储,结构如下:

根据以上结构,我们分别创建IRepository.cs仓储接口和Repository.cs仓储接口的实现
 
IRepository.cs内容如下:
  1. /// <summary>
  2. /// 仓储接口定义
  3. /// </summary>
  4. public interface IRepository
  5. {
  6. }
  7. /// <summary>
  8. /// 定义泛型仓储接口
  9. /// </summary>
  10. /// <typeparam name="T">实体类型</typeparam>
  11. /// <typeparam name="object">主键类型</typeparam>
  12. public interface IRepository<T> : IRepository where T : class, new()
  13. {
  14.      /// <summary>
  15.      /// 新增
  16.      /// </summary>
  17.      /// <param name="entity">实体</param>
  18.      /// <param name="innserSql">新增sql</param>
  19.      /// <returns></returns>
  20.      int Insert(T entity, string innserSql);
  21.      /// <summary>
  22.      /// 修改
  23.      /// </summary>
  24.      /// <param name="entity">实体</param>
  25.      /// <param name="updateSql">更新sql</param>
  26.      /// <returns></returns>
  27.      int Update(T entity, string updateSql);
  28.      /// <summary>
  29.      /// 删除
  30.      /// </summary>
  31.      /// <param name="deleteSql">删除sql</param>
  32.      /// <returns></returns>
  33.      int Delete(string key, string deleteSql);
  34.      /// <summary>
  35.      /// 根据主键获取模型
  36.      /// </summary>
  37.      /// <param name="key">主键</param>
  38.      /// <param name="selectSql">查询sql</param>
  39.      /// <returns></returns>
  40.      T GetByKey(string key, string selectSql);
  41.      /// <summary>
  42.      /// 获取所有数据
  43.      /// </summary>
  44.      /// <param name="selectAllSql">查询sql</param>
  45.      /// <returns></returns>
  46.      List<T> GetAll(string selectAllSql);
  47.      /// <summary>
  48.      /// 根据唯一主键验证数据是否存在
  49.      /// </summary>
  50.      /// <param name="id">主键</param>
  51.      /// <param name="selectSql">查询sql</param>
  52.      /// <returns>返回true存在,false不存在</returns>
  53.      bool IsExist(string id, string selectSql);
复制代码
说明1:该仓储接口是我们常用的crud(增删改查)的接口,它适用于所有的表结构,让我们不再重复的编写一样的sql语句。
说明2:该仓储接口可以自定义通用的接口,列如分页查询、批量新增、批量修改等。
Repository.cs结构如下
  1. /// <summary>
  2. /// 仓储基类
  3. /// </summary>
  4. /// <typeparam name="T">实体类型</typeparam>
  5. /// <typeparam name="TPrimaryKey">主键类型</typeparam>
  6. public abstract class Repository<T> : IRepository<T> where T : class, new()
  7. {
  8.      /// <summary>
  9.      /// 删除
  10.      /// </summary>
  11.      /// <param name="deleteSql">删除sql</param>
  12.      /// <returns></returns>
  13.      public int Delete(string key, string deleteSql)
  14.      {
  15.          using var connection = DataBaseConnectConfig.GetSqlConnection();
  16.          return connection.Execute(deleteSql, new { Key = key });
  17.      }
  18.      /// <summary>
  19.      /// 根据主键获取模型
  20.      /// </summary>
  21.      /// <param name="id">主键</param>
  22.      /// <param name="selectSql">查询sql</param>
  23.      /// <returns></returns>
  24.      public T GetByKey(string id, string selectSql)
  25.      {
  26.          using var connection = DataBaseConnectConfig.GetSqlConnection();
  27.          return connection.QueryFirstOrDefault<T>(selectSql, new { Key = id });
  28.      }
  29.      /// <summary>
  30.      /// 获取所有数据
  31.      /// </summary>
  32.      /// <param name="selectAllSql">查询sql</param>
  33.      /// <returns></returns>
  34.      public List<T> GetAll(string selectAllSql)
  35.      {
  36.          using var connection = DataBaseConnectConfig.GetSqlConnection();
  37.          return connection.Query<T>(selectAllSql).ToList();
  38.      }
  39.      /// <summary>
  40.      /// 新增
  41.      /// </summary>
  42.      /// <param name="entity">新增实体</param>
  43.      /// <param name="innserSql">新增sql</param>
  44.      /// <returns></returns>
  45.      public int Insert(T entity, string innserSql)
  46.      {
  47.          using var connection = DataBaseConnectConfig.GetSqlConnection();
  48.          return connection.Execute(innserSql, entity);
  49.      }
  50.      /// <summary>
  51.      /// 根据唯一主键验证数据是否存在
  52.      /// </summary>
  53.      /// <param name="id">主键</param>
  54.      /// <param name="selectSql">查询sql</param>
  55.      /// <returns>返回true存在,false不存在</returns>
  56.      public bool IsExist(string id, string selectSql)
  57.      {
  58.          using var connection = DataBaseConnectConfig.GetSqlConnection();
  59.          var count = connection.QueryFirst<int>(selectSql, new { Key = id });
  60.          if (count > 0)
  61.              return true;
  62.          else
  63.              return false;
  64.      }
  65.      /// <summary>
  66.      /// 更新
  67.      /// </summary>
  68.      /// <param name="entity">更新实体</param>
  69.      /// <param name="updateSql">更新sql</param>
  70.      /// <returns></returns>
  71.      public int Update(T entity, string updateSql)
  72.      {
  73.          using var connection = DataBaseConnectConfig.GetSqlConnection();
  74.          return connection.Execute(updateSql, entity);
  75.      }
  76. }
复制代码
该类是IRepository.cs仓储接口的实现,它继承于Repository.cs
创建基础sql仓储(可省略)
做完以上操作,我们的底层仓储事实上已经搭建完成,但博主搭建了一个基础sql的仓储,以便管理项目中所有基础的sql语句。
在Infrastructure的根目录创建一个BaseSqlRepository.cs的类。
编写sql的基础语句,现有语句如下。
  1. /// <summary>
  2. /// 创建继承sql仓储
  3. /// </summary>
  4. public class BaseSqlRepository
  5. {
  6.      #region 表Sys_user
  7.      /// <summary>
  8.      /// sys_user新增
  9.      /// </summary>
  10.      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)";
  11.      /// <summary>
  12.      /// sys_user更新
  13.      /// </summary>
  14.      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";
  15.      /// <summary>
  16.      /// sys_user查询
  17.      /// </summary>
  18.      public static string sysUser_selectByKeySql = @" select * from Sys_User where  UserId=@Key";
  19.      /// <summary>
  20.      /// sys_user表查询全部语句
  21.      /// </summary>
  22.      public static string sysUser_selectAllSql = @" select * from Sys_User";
  23.      #endregion
  24. }
复制代码
创建表Sys_User模型
结构如下:
  1. /// <summary>
  2. /// 用户表模型
  3. /// </summary>
  4. public class SysUser
  5. {
  6.     /// <summary>
  7.     /// 用户id
  8.     /// </summary>
  9.     public int UserId { get; set; }
  10.     /// <summary>
  11.     /// 用户名
  12.     /// </summary>
  13.     public string UserName { get; set; }
  14.     /// <summary>
  15.     /// 密码
  16.     /// </summary>
  17.     public string Password { get; set; }
  18.     /// <summary>
  19.     /// 年龄
  20.     /// </summary>
  21.     public int Age { get; set; }
  22.     /// <summary>
  23.     /// 性别
  24.     /// </summary>
  25.     public int Sex { get; set; }
  26.     /// <summary>
  27.     /// 是否开启
  28.     /// </summary>
  29.     public bool IsOpen { get; set; }
  30.     /// <summary>
  31.     /// 部门id
  32.     /// </summary>
  33.     public int DepartmentId { get; set; }
  34.     /// <summary>
  35.     /// 创建时间
  36.     /// </summary>
  37.     public DateTime CreateTime { get; set; }
  38.     /// <summary>
  39.     /// 创建人员
  40.     /// </summary>
  41.     public string CreateUser { get; set; }
  42. }
复制代码
该结构,同数据库表结构(一会说)
使用仓储
在之前的ISysUserRepository.cs和SysUserRepository.cs中分别继承IRepository.cs 和Repository.cs
  1. /// <summary>
  2. /// 用户服务仓储接口
  3. /// </summary>
  4. public interface ISysUserRepository : IRepository<SysUser>
  5. {
  6.     /// <summary>
  7.     /// 测试Autofac
  8.     /// </summary>
  9.     /// <returns></returns>
  10.     string TestAutofac();
  11. }
复制代码
  1. /// <summary>
  2. /// 用户服务仓储接口实现
  3. /// </summary>
  4. public class SysUserRepository : Repository<SysUser>, ISysUserRepository
  5. {
  6.      /// <summary>
  7.      /// 测试Autofac
  8.      /// </summary>
  9.      /// <returns></returns>
  10.      public string TestAutofac()
  11.      {
  12.          return "Autofac使用成功";
  13.      }
  14. }
复制代码
该用户仓储继承IRepository.cs 和Repository.cs之后,它就拥有了该仓储接口下的所有接口。
测试
做完以上工作,我们开始测试
首先,我们需要创建数据库(使用sqlServer数据库)和用户表

表结构和数据代码如下:
 
  1. USE [OverallAuth]
  2. GO
  3. /****** Object:  Table [dbo].[Sys_User]    Script Date: 2024/10/6 10:38:21 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. CREATE TABLE [dbo].[Sys_User](
  9.     [UserId] [int] IDENTITY(1,1) NOT NULL,
  10.     [UserName] [varchar](50) NOT NULL,
  11.     [Password] [varchar](50) NOT NULL,
  12.     [Age] [int] NULL,
  13.     [Sex] [int] NULL,
  14.     [DepartmentId] [int] NOT NULL,
  15.     [IsOpen] [bit] NULL,
  16.     [CreateTime] [datetime] NULL,
  17.     [CreateUser] [varchar](50) NULL,
  18. CONSTRAINT [PK_Sys_User] PRIMARY KEY CLUSTERED
  19. (
  20.     [UserId] ASC
  21. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  22. ) ON [PRIMARY]
  23. GO
  24. SET IDENTITY_INSERT [dbo].[Sys_User] ON
  25. 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')
  26. 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')
  27. SET IDENTITY_INSERT [dbo].[Sys_User] OFF
  28. ALTER TABLE [dbo].[Sys_User] ADD  DEFAULT ((0)) FOR [IsOpen]
  29. GO
  30. 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'
  31. GO
  32. 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'
  33. GO
  34. 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'
  35. GO
  36. 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'
  37. GO
  38. 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'
  39. GO
  40. 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'
  41. GO
  42. 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'
  43. GO
  44. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'人员表' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_User'
  45. GO
复制代码
 
服务层编写接口调用
说明:以下这些类,都在上一期中有说道,这里不再多说。
  1. /// <summary>
  2. /// 用户服务接口
  3. /// </summary>
  4. public interface ISysUserService
  5. {
  6.      /// <summary>
  7.      /// 测试Autofac
  8.      /// </summary>
  9.      /// <returns></returns>
  10.      string TestAutofac();
  11.      /// <summary>
  12.      /// 查询所有用户
  13.      /// </summary>
  14.      /// <returns></returns>
  15.      List<SysUser> GetAllUser();
  16. }
复制代码
  1. /// <summary>
  2. /// 用户服务接口实现
  3. /// </summary>
  4. public class SysUserService : ISysUserService
  5. {
  6.     #region 构造实例化
  7.     private readonly ISysUserRepository _sysUserRepository;
  8.     public SysUserService(ISysUserRepository sysUserRepository)
  9.     {
  10.         _sysUserRepository = sysUserRepository;
  11.     }
  12.     #endregion
  13.     /// <summary>
  14.     /// 测试Autofac
  15.     /// </summary>
  16.     /// <returns></returns>
  17.     public string TestAutofac()
  18.     {
  19.         return _sysUserRepository.TestAutofac();
  20.     }
  21.     /// <summary>
  22.     /// 查询所有用户
  23.     /// </summary>
  24.     /// <returns></returns>
  25.     public List<SysUser> GetAllUser()
  26.     {
  27.         return _sysUserRepository.GetAll(BaseSqlRepository.sysUser_selectAllSql);
  28.     }
  29. }
复制代码
在控制器(SysUserController)中添加如下接口
  1.    /// <summary>
  2.    /// 查询所有用户
  3.    /// </summary>
  4.    /// <returns></returns>
  5.    [HttpGet]
  6.    public List<SysUser> GetAllUser()
  7.    {
  8.        return _userService.GetAllUser();
  9.    }
复制代码
好了,启动项目,进行测试

可以看到,数据获取成功,到这里,我们使用Dapper搭建底层仓储连接数据库成功。
 
源代码地址:https://gitee.com/yangguangchenjie/overall-auth2.0-web-api  
预览地址:http://139.155.137.144:8880/swagger/index.html
帮我Star,谢谢。
有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。

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

来源:https://www.cnblogs.com/cyzf/p/18448855
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具