f 数据仓库与分析-深入剖析 SqlSugar 与泛型封装:实现通用数据访问层 - Powered by qidao123.com技术社区

深入剖析 SqlSugar 与泛型封装:实现通用数据访问层

打印 上一主题 下一主题

主题 2021|帖子 2021|积分 6063

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
在现代软件开发中,ORM(对象关系映射)框架的使用已经成为不可或缺的部分,SqlSugar 是一款非常盛行且强大的 ORM框架。它不但提供了简单易用的数据库操纵,还具备了高效的性能和灵活的设置方式。为了进一步提升数据库操纵的灵活性和复用性,结合 泛型 进行封装是一种非常有效的方式。在本文中,我们将结合 SqlSugar 和泛型,深入探讨如何通过封装来简化数据库操纵,并实现一个通用的数据访问层。

1. 安装与设置 SqlSugar

首先,我们需要安装 SqlSugar 库并进行基本设置。SqlSugar 支持多种数据库类型,包罗 SQL Server、MySQL、SQLite 等。我们可以通过 NuGet 来安装 SqlSugar。
安装 SqlSugar

Visual Studio 中使用 NuGet 包管理器控制台执行以下命令:
  1. Install-Package SqlSugar
复制代码
或者通过 .NET CLI 安装:
  1. dotnet add package SqlSugar
复制代码
安装完成后,我们需要设置数据库连接和创建 SqlSugarClient 实例:
  1. using SqlSugar;
  2. public class SqlSugarHelper
  3. {
  4.     private static SqlSugarClient db;
  5.     static SqlSugarHelper()
  6.     {
  7.         db = new SqlSugarClient(new ConnectionConfig()
  8.         {
  9.             // 数据库连接字符串
  10.             ConnectionString = "Server=localhost;Database=TestDB;User Id=sa;Password=12345;",
  11.             DbType = DbType.SqlServer, // 选择数据库类型
  12.             IsAutoCloseConnection = true, // 自动关闭连接
  13.             InitKeyType = InitKeyType.Attribute // 使用属性标记主键
  14.         });
  15.     }
  16.     public static SqlSugarClient GetInstance()
  17.     {
  18.         return db;
  19.     }
  20. }
复制代码
此时,我们已完成基础设置,可以开始进行数据库操纵。

2. 泛型封装的基本头脑

在实际开发中,常常需要对多个数据表进行类似的增、删、改、查操纵。为了避免重复代码并进步代码的复用性,我们可以通过 泛型 将这些操纵封装成一个通用的类,从而支持对差异实体类的操纵。
通过创建一个 Repository(仓储)类来封装所有基本的数据库操纵,我们可以在需要时,快速实例化一个泛型仓储类,进行统一的数据操纵。

3. 封装数据库操纵

3.1 泛型仓储类的实现

我们首先实现一个通用的 Repository 类,利用泛型来处置惩罚所有基本的数据库操纵,包罗查询、插入、更新和删除。这样,无论操纵哪个实体类,我们只需要实例化一次仓储类即可。
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. public class Repository<T> where T : class, new()
  6. {
  7.     private readonly SqlSugarClient db;
  8.     public Repository(SqlSugarClient db)
  9.     {
  10.         this.db = db;
  11.     }
  12.     #region 查询操作
  13.     // 根据ID查询单个数据
  14.     public T GetById(int id)
  15.     {
  16.         return db.Queryable<T>().InSingle(id);
  17.     }
  18.     // 根据条件查询数据列表
  19.     public List<T> GetList(Func<T, bool> whereExpression)
  20.     {
  21.         return db.Queryable<T>().Where(whereExpression).ToList();
  22.     }
  23.     // 查询所有数据
  24.     public List<T> GetAll()
  25.     {
  26.         return db.Queryable<T>().ToList();
  27.     }
  28.     #endregion
  29.     #region 插入操作
  30.     // 插入一条数据
  31.     public int Insert(T entity)
  32.     {
  33.         return db.Insertable(entity).ExecuteCommand();
  34.     }
  35.     // 批量插入数据
  36.     public int InsertRange(List<T> entities)
  37.     {
  38.         return db.Insertable(entities).ExecuteCommand();
  39.     }
  40.     #endregion
  41.     #region 更新操作
  42.     // 更新一条数据
  43.     public int Update(T entity)
  44.     {
  45.         return db.Updateable(entity).ExecuteCommand();
  46.     }
  47.     // 根据条件更新数据
  48.     public int Update(Func<T, bool> whereExpression, object updateColumns)
  49.     {
  50.         return db.Updateable<T>().SetColumns(updateColumns).Where(whereExpression).ExecuteCommand();
  51.     }
  52.     #endregion
  53.     #region 删除操作
  54.     // 删除一条数据
  55.     public int Delete(int id)
  56.     {
  57.         return db.Deleteable<T>().In(id).ExecuteCommand();
  58.     }
  59.     // 根据条件删除数据
  60.     public int Delete(Func<T, bool> whereExpression)
  61.     {
  62.         return db.Deleteable<T>().Where(whereExpression).ExecuteCommand();
  63.     }
  64.     // 批量删除数据
  65.     public int DeleteRange(List<int> ids)
  66.     {
  67.         return db.Deleteable<T>().In(ids).ExecuteCommand();
  68.     }
  69.     #endregion
  70. }
复制代码
3.2 封装分页查询功能

为了进一步提升通用性,我们可以在仓储类中增长 分页查询 功能。SqlSugar 提供了一个方便的分页方法 ToPageList,结合泛型,我们可以封装一个通用的分页查询方法。
  1. #region 分页查询
  2. // 分页查询
  3. public List<T> GetPageList(int pageIndex, int pageSize, Func<T, bool> whereExpression, out int totalCount)
  4. {
  5.     return db.Queryable<T>()
  6.              .Where(whereExpression)
  7.              .ToPageList(pageIndex, pageSize, out totalCount);
  8. }
  9. #endregion
复制代码

4. 使用泛型仓储类

接下来,我们通过实例化 Repository<T> 来对具体的实体类进行操纵。例如,我们有一个 User 实体类:
  1. public class User
  2. {
  3.     public int Id { get; set; }
  4.     public string Name { get; set; }
  5.     public int Age { get; set; }
  6. }
复制代码
4.1 在 Service 层使用泛型仓储类

我们可以在业务层 (Service) 中使用 Repository<User> 来封装对 User 表的操纵。
  1. public class UserService
  2. {
  3.     private readonly Repository<User> userRepository;
  4.     public UserService(SqlSugarClient db)
  5.     {
  6.         // 初始化泛型仓储类
  7.         userRepository = new Repository<User>(db);
  8.     }
  9.     // 获取所有用户
  10.     public List<User> GetAllUsers()
  11.     {
  12.         return userRepository.GetAll();
  13.     }
  14.     // 根据ID获取用户
  15.     public User GetUserById(int id)
  16.     {
  17.         return userRepository.GetById(id);
  18.     }
  19.     // 根据名称查询用户
  20.     public List<User> GetUsersByName(string name)
  21.     {
  22.         return userRepository.GetList(u => u.Name == name);
  23.     }
  24.     // 插入用户
  25.     public int AddUser(User user)
  26.     {
  27.         return userRepository.Insert(user);
  28.     }
  29.     // 更新用户
  30.     public int UpdateUser(User user)
  31.     {
  32.         return userRepository.Update(user);
  33.     }
  34.     // 删除用户
  35.     public int DeleteUser(int id)
  36.     {
  37.         return userRepository.Delete(id);
  38.     }
  39.     // 批量删除用户
  40.     public int DeleteUsers(List<int> ids)
  41.     {
  42.         return userRepository.DeleteRange(ids);
  43.     }
  44. }
复制代码
4.2 在 Main 方法中调用

  1. class Program
  2. {
  3.     static void Main(string[] args)
  4.     {
  5.         // 配置数据库连接
  6.         var db = new SqlSugarClient(new ConnectionConfig()
  7.         {
  8.             ConnectionString = "Server=localhost;Database=TestDB;User Id=sa;Password=12345;",
  9.             DbType = DbType.SqlServer,
  10.             IsAutoCloseConnection = true
  11.         });
  12.         // 使用 UserService 操作 User 表
  13.         var userService = new UserService(db);
  14.         // 添加新用户
  15.         var newUser = new User { Name = "John", Age = 25 };
  16.         userService.AddUser(newUser);
  17.         // 查询所有用户
  18.         var users = userService.GetAllUsers();
  19.         Console.WriteLine($"共查询到 {users.Count} 个用户");
  20.         // 根据 ID 查询用户
  21.         var user = userService.GetUserById(1);
  22.         Console.WriteLine($"用户 {user.Name} 的年龄是 {user.Age}");
  23.         // 删除用户
  24.         userService.DeleteUser(2);
  25.     }
  26. }
复制代码

5. 总结

通过结合 SqlSugar泛型,我们可以或许实现一个简洁、通用且高效的数据库操纵层。在这篇文章中,我们通过封装一个 Repository 类,将常见的数据库操纵(增、删、改、查)以及分页查询功能都进行了通用化封装。这样,我们可以轻松地处置惩罚差异实体类的数据操纵,减少了重复代码,进步了代码的可复用性和可维护性。
泛型的使用不但让我们可以或许在差异实体类之间共享同一套操纵方法,还使得我们的代码更加简洁、易于扩展。在实际项目中,结合 SqlSugar 和泛型封装,是一种非常有效的办理方案,特殊是对于需要操纵大量数据表的项目,可以或许大幅提升开发效率。
希望本文的示例和思路可以或许资助你在项目中高效地实现数据库操纵和封装。如果你有任何问题或想进一步探讨的内容,欢迎随时提问!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表