SQLSUGAR实战指南:仓储模式与高效CRUD操作全解析

1. 仓储模式:为什么你的项目需要它?

如果你写过直接操作数据库的代码,肯定遇到过这样的场景:业务逻辑里到处都是db.Queryable<User>().Where(...)这样的语句。一开始项目小,感觉还挺方便,但随着功能增加,你会发现几个头疼的问题:第一,哪天老板说要把数据库从SQL Server换成MySQL,你得把所有地方调用的SqlSugar方法都改一遍;第二,写单元测试的时候,因为业务代码直接依赖了数据库,你根本没法模拟数据操作,测试变得异常困难;第三,同样的查询逻辑,在用户管理、订单查询里重复写了好几次,改一个地方就得同步改好几个文件。

仓储模式就是为了解决这些问题而生的。你可以把它理解为你和数据库之间的一个“中介”或者“管家”。你的业务代码不再直接跟数据库打交道,而是告诉这个“管家”:“我要查一下ID为5的用户”,或者“把这些新用户存进去”。至于“管家”是打开SQL Server还是MySQL,是用SqlSugar还是别的ORM,业务代码完全不用关心。我在实际项目中引入仓储模式后,最直接的感受就是代码清爽多了,业务层不再混杂着各种数据库查询语法,可读性和可维护性都上了一个台阶。

简单来说,仓储模式的核心价值就三点:解耦可测试统一管理。它把数据访问逻辑封装起来,让业务逻辑保持纯粹。接下来,我们就一步步看看怎么用SqlSugar把这个“管家”请进你的项目。

2. 三步搭建:从接口到实现的完整仓储层

搭建一个健壮的仓储层,就像盖房子,需要打好地基、立好结构。我习惯把它分为清晰的三步:定义契约(接口)、实现通用功能(基类)、最后在业务模块中具体使用。我们用一个用户管理的例子贯穿始终,这样理解起来更直观。

2.1 第一步:定义通用接口(IRepository)

接口的作用是定规矩、立契约。它告诉所有使用者:“不管底层怎么变,你都能通过这些方法操作数据。” 我们先创建一个最核心的泛型接口 IRepository<TEntity>

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;

namespace YourProject.Infrastructure
{
    // 泛型仓储接口,TEntity代表任何实体类
    public interface IRepository<TEntity> where TEntity : class, new()
    {
        // ---------- 同步查询 ----------
        TEntity GetById(object id);
        List<TEntity> GetAll();
        List<TEntity> Where(Expression<Func<TEntity, bool>> predicate);

        // ---------- 同步增删改 ----------
        bool Insert(TEntity entity);
        bool Update(TEntity entity);
        bool Delete(TEntity entity);

        // ---------- 批量操作 ----------
        int InsertRange(List<TEntity> entities);
        int UpdateRange(List<TEntity> entities);
        int DeleteRange(List<TEntity> entities);

        // ---------- 异步操作 ----------
        Task<TEntity> GetByIdAsync(object id);
        Task<List<TEntity>> GetAllAsync();
        Task<int> InsertAsync(TEntity entity);
        Task<int> UpdateAsync(TEntity entity);
        Task<int> DeleteAsync(TEntity entity);

        // ---------- 扩展:部分字段更新 ----------
        bool Update(TEntity entity, Expression<Func<TEntity, object>> columns);
    }
}

这个接口覆盖了90%的日常CRUD场景。注意那个带columns参数的Update方法,它非常实用,可以实现只更新实体中修改过的字段,而不是全部更新,这对性能和大数据表很友好。定义好接口后,业务层代码就可以依赖这个接口来编写,完全不用管后面是怎么实现的。

2.2 第二步:用SqlSugar实现通用基类(RepositoryBase)

有了契约,就需要一个默认的“履行者”。我们创建一个 RepositoryBase<TEntity> 类来实现上面的接口,内部使用SqlSugar来操作数据库。这里的关键是利用泛型,一份代码服务所有实体

using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;

namespace YourProject.Infrastructure
{
    public class RepositoryBase<TEntity> : IRepository<TEntity> where TEntity : class, new()
    {
        // 依赖注入SqlSugarClient,保证整个应用使用统一的数据库连接
        protected readonly SqlSugarClient _db;

        public RepositoryBase(SqlSugarClient db)
        {
            _db = db;
        }

        // 同步查询实现
        public TEntity GetById(object id) => _db.Queryable<TEntity>().InSingle(id);
        public List<TEntity> GetAll() => _db.Queryable<TEntity>().ToList();
        public List<TEntity> Where(Expression<Func<TEntity, bool>> predicate) => _db.Queryable<TEntity>().Where(predicate).ToList();

        // 同步增删改实现
        public bool Insert(TEntity entity) => _db.Insertable(entity).ExecuteCommand() > 0;
        public bool Update(TEntity entity) => _db.Updateable(entity).ExecuteCommand() > 0;
        public bool Delete(TEntity entity) =>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值