深入解析 SQLSugar:从基础 CRUD 到读写分离与高级特性详解

news2024/9/20 21:27:55

SQLSugar 使用指南:从入门到进阶及高级特性详解

SQLSugar 是一款功能丰富的 .NET ORM 框架,它支持多种数据库、简洁的 API 和优雅的编程体验。相较于其他 ORM,SQLSugar 提供了很多开发者友好的功能,比如自动创建表结构、灵活的查询构建、支持事务、多表联查等。本文将从基础的 CRUD 操作开始,逐步深入介绍 SQLSugar 的进阶和高级功能,尤其是 CRUD、联表查询、事务处理、导航属性、并发冲突、依赖注入、读写分离等高级特性,帮助你全面掌握 SQLSugar 的使用方法。


一、SQLSugar 基础

1.1 安装 SQLSugar

首先,使用 NuGet 安装 SQLSugar:

Install-Package SqlSugar

在 .NET 项目中安装后,你可以通过配置数据库连接来初始化 SQLSugar 实例:

SqlSugarScope db = new SqlSugarScope(new ConnectionConfig()
{
    ConnectionString = "数据库连接字符串",
    DbType = DbType.SqlServer, // 数据库类型
    IsAutoCloseConnection = true // 自动关闭连接
});
1.2 基本的 CRUD 操作

SQLSugar 提供了丰富的 API 以实现基本的 CRUD 操作。

1.2.1 插入数据
var user = new User { Name = "张三", Age = 25 };
db.Insertable(user).ExecuteCommand();
1.2.2 查询数据
var user = db.Queryable<User>().Where(a => a.Id == 1).Single();
1.2.3 更新数据
db.Updateable(new User() { Id = 1, Age = 30 }).ExecuteCommand();
1.2.4 删除数据
db.Deleteable<User>().Where(a => a.Id == 1).ExecuteCommand();

SQLSugar 的基本 CRUD 操作非常简洁,开发者可以通过这些 API 快速操作数据库。

1.3 自动创建表结构

SQLSugar 支持自动创建表结构,这对于需要快速构建表结构的场景十分有用。通过 Code First,你可以轻松地同步表结构:

db.CodeFirst.InitTables(typeof(User));

这样,SQLSugar 会根据你的实体类自动生成或同步数据库中的表结构。


二、SQLSugar 进阶功能

2.1 多表联查

SQLSugar 提供了丰富的联表查询功能,可以通过 Join 进行表与表之间的关联查询。

var query = db.Queryable<User, Order>((u, o) => new JoinQueryInfos(
    JoinType.Left, u.Id == o.UserId))
    .Select((u, o) => new { u.Name, o.OrderId, o.Amount })
    .ToList();

此代码展示了如何通过联表查询用户与其订单信息。

2.2 分页查询

分页查询是 SQL 操作中非常常见的一部分,SQLSugar 提供了便捷的分页 API:

var pageIndex = 1;
var pageSize = 10;
var totalCount = 0;

var users = db.Queryable<User>()
    .Where(u => u.Age > 18)
    .ToPageList(pageIndex, pageSize, ref totalCount);

ToPageList 会根据 pageIndexpageSize 返回分页数据,并通过 totalCount 得到符合条件的记录总数。

2.3 事务处理

SQLSugar 提供了简洁的事务处理机制,确保数据一致性:

db.Ado.BeginTran();
try
{
    db.Insertable(new User() { Name = "张三", Age = 25 }).ExecuteCommand();
    db.Insertable(new Order() { UserId = 1, Amount = 100 }).ExecuteCommand();
    db.Ado.CommitTran();
}
catch
{
    db.Ado.RollbackTran();
}

在事务中执行多个数据库操作,如果有任何异常发生,SQLSugar 会自动回滚事务。


三、SQLSugar 高级特性

3.1 导航属性

SQLSugar 支持导航属性,使得在实体类中定义关联关系变得更加简洁。当你定义了带有导航属性的实体时,SQLSugar 能够自动处理关联查询。

假设有 UserOrder 两个实体,其中 User 可以拥有多个 Order

public class User
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }
    public string Name { get; set; }

    [Navigate(NavigateType.OneToMany, nameof(Order.UserId))]
    public List<Order> Orders { get; set; }
}

public class Order
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }
    public int UserId { get; set; }
    public decimal Amount { get; set; }
}

使用 Include 方法,可以方便地进行导航属性查询:

var usersWithOrders = db.Queryable<User>()
    .Includes(u => u.Orders)
    .ToList();

通过这种方式,SQLSugar 会自动加载用户及其订单信息,无需手动编写复杂的 SQL。

3.2 并发冲突处理

并发冲突是数据库操作中的常见问题,SQLSugar 提供了简单的机制来处理并发冲突。你可以通过 RowVersionLock 等机制来处理更新时的冲突。

public class User
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime LastUpdateTime { get; set; }
}

在更新数据时,SQLSugar 可以确保通过时间戳或其他字段防止多个操作同时更改数据。

db.Updateable(user)
    .Where(u => u.LastUpdateTime == oldUpdateTime)
    .ExecuteCommand();

这种方式能够防止并发写入时出现的数据不一致问题。

3.3 读写分离

SQLSugar 支持读写分离,可以在多主从数据库环境下进行配置,以提升读操作的性能。通过配置多个连接字符串,你可以轻松实现主库写、从库读的分离操作。

db = new SqlSugarScope(new List<ConnectionConfig>()
{
    new ConnectionConfig()
    {
        ConnectionString = "主库连接字符串",
        DbType = DbType.SqlServer,
        IsAutoCloseConnection = true,
        ConfigId = "master"
    },
    new ConnectionConfig()
    {
        ConnectionString = "从库连接字符串",
        DbType = DbType.SqlServer,
        IsAutoCloseConnection = true,
        ConfigId = "slave"
    }
}, db =>
{
    db.Aop.CurdAfter = (sugar, info) =>
    {
        if (info.Sql.Contains("SELECT"))
            db.ChangeConfig("slave");
        else
            db.ChangeConfig("master");
    };
});

通过这个配置,SQLSugar 会自动将读操作路由到从库,将写操作路由到主库。

3.4 依赖注入

SQLSugar 支持与 ASP.NET Core 的依赖注入机制集成。你可以在项目中配置 SQLSugar 的依赖注入,简化数据库上下文的使用。

Startup.cs 中配置 SQLSugar 依赖注入:

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<ISqlSugarClient>(s => new SqlSugarScope(new ConnectionConfig()
    {
        ConnectionString = "数据库连接字符串",
        DbType = DbType.SqlServer,
        IsAutoCloseConnection = true
    }));
}

在控制器或服务中通过构造函数注入 ISqlSugarClient

public class UserService
{
    private readonly ISqlSugarClient _db;
    
    public UserService(ISqlSugarClient db)
    {
        _db = db;
    }

    public List<User> GetUsers()
    {
        return _db.Queryable<User>().ToList();
    }
}

依赖注入能够更好地管理数据库上下文的生命周期,简化使用 SQLSugar 进行数据库操作的流程。


四、SQLSugar 的优势与劣势

4.1 优势
  1. 多数据库支持:SQLSugar 支持多种数据库,如 SQL Server、MySQL、PostgreSQL 等,切换数据库非常方便。
  2. 丰富的功能:内置了丰富的功能,如 Code First、导航属性、读写分离、并发处理等,大大简化开发工作。
  3. 易用的 API:SQLSugar 的 API 设计简洁明了,上手非常容易,尤其适合中小型项目。
  4. 灵活的扩展性:支持自定义 SQL、自定义拦截器、扩展方法等,具有很强的扩展性。
4.2 劣势
  1. 学习曲线:尽管 SQLSugar 易用,但在学习一些高级特性时可能需要投入一定时间。
  2. 复杂查询性能:在面对非常复杂的查询场景时,可能需要借助原生 SQL 来提高性能。
  3. 社区生态:与 Entity Framework 等主流 ORM 框架相比,SQLSugar 的社区生态和文档相对较少。

结语

SQLSugar 是一个功能强大且灵活的 ORM 框架,它简化了 .NET 开发中与数据库交互的流程。从基础的 CRUD 到高级的读写分离、事务管理,SQLSugar 提供了一整套完善的解决方案。对于中小型项目来说,SQLSugar 是一个非常不错的选择。如果你正在寻找一个轻量级、高效的 ORM 框架,SQLSugar 值得一试。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.1-2.2

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第二周 深度卷积网络&#xff1a;实例探究&#xff08;Deep convolutional models: case studies&#xff09;2.1 为什么要进行实例探究&#xff1f;&#xff08;Why look at case studies?&…

Python编码系列—Python外观模式:简化复杂系统的快捷方式

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

生信初学者教程(八):数据收集

文章目录 数据分布表达谱数据最终数据分布自动下载GSE14520下载GSE149614下载其它数据在确定研究疾病为肝细胞癌**(Liver Hepatocellular Carcinoma: HCC)**后,系统地进行了文献回顾,专注于搜索与HCC相关的荟萃分析文章,以获取该领域的研究动态和已有成果。为了支持的研究…

卡车配置一键启动无钥匙进入手机控车

‌ 卡车智能一键启动无钥匙进入手机控车&#xff0c;通过手机应用程序与汽车内置硬件、软件的无线通信&#xff0c;实现对汽车的远程控制‌。 卡车改装一键启动的步骤包括安装门把手的感应装置、拆卸仪表台和门板&#xff0c;取出内部的待接线束&#xff0c;并将一键启动…

MySQL高阶1875-将工资相同的雇员分组

目录 题目 准备数据 分析数据 题目 编写一个解决方案来获取每一个被分配到组中的雇员的 team_id 。 返回的结果表按照 team_id 升序排列。如果相同&#xff0c;则按照 employee_id 升序排列。 这家公司想要将 工资相同 的雇员划分到同一个组中。每个组需要满足如下要求&a…

springboot结合p6spy进行SQL监控

1.学习p6spy的相关链接 英文文档&#xff1a;Integrating P6Spy — p6spy 3.9.2-SNAPSHOT documentationhttps://p6spy.readthedocs.io/en/latest/integration.html github链接&#xff1a;GitHub - p6spy/p6spy: P6Spy is a framework that enables database data to be sea…

solana项目counter,测试过程中执行报错记录分享

跟随HackQuest部署counter项目&#xff0c;使用 Solana 官方提供的 playgroud 。这个平台让我们的部署和测试过程变得更加简便高效。 合约代码 lib.rs中复制以下代码 use anchor_lang::prelude::*; use std::ops::DerefMut;declare_id!("CVQCRMyzWNr8MbNhzjbfPu9YVvr97…

12种常见的华为杯数学建模竞赛matlab代码(建议收藏)

1.使用神经网络模型(向量量子化方法LVQ)解决分类/预测问题 clc;clear;​% 第一类蝗虫的触角和翅膀p1 [1.24, 1.27; 1.36, 1.74; 1.38, 1.64; 1.38, 1.82; 1.38, 1.90; 1.40, 1.70; 1.48, 1.82; 1.54, 1.82; 1.56, 2.08];​% 第二类蝗虫的触角和翅膀p2 [1.14, 1.82;…

电脑视频编辑常用软件:12个在线视频剪辑方法,这份免费攻略真实在!

您是否曾为视频剪辑而感到困惑&#xff0c;不知从何入手&#xff1f;面对众多的视频编辑软件和复杂的操作流程&#xff0c;怎样才能快速上手&#xff0c;制作出高质量的视频呢&#xff1f;许多内容创作者在编辑或上传较长视频时&#xff0c;常常遭遇到时间和质量的困扰。为了解…

利用Metasploit进行信息收集与扫描

Metasploit之信息收集和扫描 在本文中&#xff0c;我们将学习以下内容 使用Metasploit被动收集信息 使用Metasploit主动收集信息 使用Nmap进行端口扫描 使用db_nmap方式进行端口扫描 使用ARP进行主机发现 UDP服务探测 SMB扫描和枚举 SSH版本扫描 FTP扫描 SMTP枚举 …

【计算机网络 - 基础问题】每日 3 题(十三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

关于安卓App自动化测试的一些想法

安卓App自动化一般使用PythonAppium。页面元素通常是使用AndroidStudio中的UI Automator Viewer工具来进行页面元素的追踪。但是这里涉及到一个问题就是&#xff0c;安卓apk在每次打包的时候&#xff0c;会进行页面的混淆以及加固&#xff0c;所以导致每次apk打包之后会出现页面…

Java客户端SpringDataRedis(RedisTemplate使用)

文章目录 ⛄概述⛄快速入门❄️❄️导入依赖❄️❄️配置文件❄️❄️测试代码 ⛄数据化序列器⛄StringRedisTemplate⛄RedisTemplate的两种序列化实践方案总结 ⛄概述 SpringData是Spring中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis的集成模…

python获取滑块验证码需要滑动的距离

我们以这个网站为例: http://120.86.191.138/hbgs/zwgk/dirData.do?dirId402881204e959150014e959f42f30014&subjectId93e889f2501d3fe8015024305bdf0efc 往后点到第四页后会出现验证码 一.获取到背景图片和缺口图片 我们发现图片是base64格式通过API直接发送 二.识别缺…

铲屎官进!宠物空气净化器真的有用吗?哪款去浮毛效果好

国庆小长假就要来了&#xff0c;别人都在苦恼抢票问题&#xff0c;而我在想会不会被我妈赶出家门... 毕业后我就留在了广州上班&#xff0c;独自一人租房难免会感觉孤独&#xff0c;就养了一只小猫和我作伴。这次放假这么久&#xff0c;我不放心留它一个人在家&#xff0c;也没…

vulhub搭建漏洞环境docker-compose up -d命令执行报错以及解决方法汇总

在利用vulhub靶场搭建环境进行漏洞复现时&#xff0c;我们通常要使用这一步命令&#xff1a; docker-compose up -d 但是经常报错&#xff0c;今天我们来说几个常见的报错以及解决方法&#xff1a; 1.报错提示&#xff1a; ERROR: Couldnt connect to Docker daemon at httpdoc…

基于atlas环境下YOLOV7的睡岗识别

做到这里&#xff0c;其实只是想探索下新的检测框架、探索下atlas下ACL的推理方式。整个过程持续了3-4周把&#xff0c;回顾一下&#xff0c;感觉还是需要一些技巧才能拿下&#xff0c;如果没有任何经验的是断难搞定此代码的。主要基于华为的官方例子&#xff0c;里面修改了原始…

ApplicationEvent 事件泛型封装记录

一、一个事件的封装、发布以及监听 事件类封装 把需要的信息封装到一个事件类中 Data public class Person {private String name; }Data public class PersonEvent {private Person person;private String addOrUpdate;public PersonEvent(Person person, String addOrUpda…

【云安全】云服务安全攻防

一、云服务安全事件 1、CVE-2021-44228&#xff1a; AWS Log4Shell热补丁漏洞&#xff0c;用来进行容器逃逸和权限提升 2、CVE-2022-30137&#xff1a; Microsoft Azure Service Fabic权限提升漏洞&#xff0c;允许攻击者在容器内提升权限至主机节点root权限 FabricScape: Esca…

神奇的css动画:animation、transform、transition

前言 动画包括两个部分&#xff1a;描述动画的样式和用于指定动画开始、结束以及中间点样式的关键帧。 相比较于传统的脚本实现动画技术&#xff0c;使用css动画三个主要优点: 1.能够非常容易创建简单动画&#xff0c;甚至不需要了解JavaScript就能创建动画 2.动画运行效果…