SQLSugar簡(jiǎn)介、使用方法、核心類與 API 及示例演示
一、SQLSugar 簡(jiǎn)介
SQLSugar 是一款 輕量級(jí)、高性能的 .NET ORM 框架,由國(guó)內(nèi)團(tuán)隊(duì)開發(fā)維護(hù),專注于簡(jiǎn)化數(shù)據(jù)庫(kù)操作,同時(shí)兼顧靈活性與性能。它通過(guò)對(duì)象關(guān)系映射(ORM)將 C# 實(shí)體類與數(shù)據(jù)庫(kù)表關(guān)聯(lián),允許開發(fā)者以面向?qū)ο蟮姆绞酵瓿?CRUD、查詢、事務(wù)等操作,無(wú)需編寫原生 SQL(或僅需少量 SQL)。
核心特點(diǎn):
- 多數(shù)據(jù)庫(kù)支持:兼容 SQL Server、MySQL、Oracle、PostgreSQL、SQLite、達(dá)夢(mèng)等主流數(shù)據(jù)庫(kù),切換數(shù)據(jù)庫(kù)只需修改配置。
- 高性能:采用編譯緩存、SQL 優(yōu)化等機(jī)制,性能接近原生 ADO.NET,遠(yuǎn)超多數(shù)同類 ORM。
- 易用性:API 設(shè)計(jì)簡(jiǎn)潔,支持鏈?zhǔn)讲樵儯ㄈ?
Queryable<T>().Where().OrderBy()),學(xué)習(xí)成本低。 - 功能全面:支持分表分庫(kù)、導(dǎo)航屬性(多表關(guān)聯(lián))、批量操作、事務(wù)、數(shù)據(jù)庫(kù)遷移(CodeFirst)等高級(jí)特性。
- 輕量無(wú)依賴:核心庫(kù)體積僅幾百 KB,可無(wú)縫集成到 .NET Framework、.NET Core、.NET 5+ 等項(xiàng)目中。
二、基本使用方法
2.1 安裝
通過(guò) NuGet 安裝核心包:
Install-Package SqlSugarCore # .NET Core/.NET 5+ # 或針對(duì)特定數(shù)據(jù)庫(kù)安裝擴(kuò)展包(如MySQL) Install-Package MySqlConnector # MySQL驅(qū)動(dòng)
2.2 初始化數(shù)據(jù)庫(kù)連接
使用 SqlSugarClient 或 SqlSugarScope 初始化連接(核心是 ConnectionConfig 配置):
using SqlSugar;
using System;
?
// 1. 定義連接配置
var config = new ConnectionConfig
{
ConnectionString = "Server=.;Database=TestDB;Uid=sa;Pwd=123456;", // 連接字符串
DbType = DbType.SqlServer, // 數(shù)據(jù)庫(kù)類型(如DbType.MySql)
IsAutoCloseConnection = true, // 自動(dòng)關(guān)閉連接(推薦開啟)
InitKeyType = InitKeyType.Attribute // 從實(shí)體特性讀取主鍵/自增配置
};
?
// 2. 初始化客戶端(二選一)
// 方式1:SqlSugarClient(非線程安全,每次操作new實(shí)例或通過(guò)IOC注入Scope)
var db = new SqlSugarClient(config);
?
// 方式2:SqlSugarScope(線程安全,適合單例模式,如ASP.NET Core注入)
// var db = new SqlSugarScope(config);2.3 核心操作流程
- 定義實(shí)體類(映射數(shù)據(jù)庫(kù)表);
- 通過(guò)客戶端對(duì)象(db) 調(diào)用 API 執(zhí)行數(shù)據(jù)庫(kù)操作(CRUD、查詢等)。
三、關(guān)鍵類與作用
| 類 / 接口 | 作用說(shuō)明 | 核心場(chǎng)景 |
|---|---|---|
SqlSugarClient | 數(shù)據(jù)庫(kù)操作核心類,提供所有 ORM API | 非單例場(chǎng)景(如 WinForm),每次操作 new 實(shí)例 |
SqlSugarScope | 線程安全的客戶端類(基于 AsyncLocal 實(shí)現(xiàn)) | 單例場(chǎng)景(如ASP.NET Core),全局共享實(shí)例 |
ISqlSugarClient | 客戶端接口,用于依賴注入(解耦) | 項(xiàng)目中通過(guò)接口調(diào)用,便于測(cè)試和替換 |
ConnectionConfig | 連接配置類,存儲(chǔ)數(shù)據(jù)庫(kù)連接信息 | 初始化客戶端時(shí)必傳,配置連接字符串、數(shù)據(jù)庫(kù)類型等 |
SugarTable | 類級(jí)別特性,指定實(shí)體對(duì)應(yīng)的數(shù)據(jù)表名 | 實(shí)體類定義時(shí),映射表名(如[SugarTable("Users")]) |
SugarColumn | 屬性級(jí)別特性,配置字段屬性(主鍵、長(zhǎng)度等) | 實(shí)體屬性定義時(shí),指定字段名、自增、默認(rèn)值等 |
四、關(guān)鍵 API 與示例
4.1 實(shí)體類定義(基于特性)
先定義與數(shù)據(jù)庫(kù)表映射的實(shí)體類(以 “用戶表” 為例):
using SqlSugar;
using System;
?
// 映射到數(shù)據(jù)庫(kù)表:Sys_User
[SugarTable("Sys_User")]
public class User
{
// 主鍵(自增)
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
?
// 用戶名(字段名:User_Name,長(zhǎng)度50,非空)
[SugarColumn(ColumnName = "User_Name", Length = 50, IsNullable = false)]
public string UserName { get; set; }
?
// 密碼(字段名:User_Pwd,加密存儲(chǔ))
[SugarColumn(ColumnName = "User_Pwd", Length = 100)]
public string Password { get; set; }
?
// 年齡(默認(rèn)值0)
[SugarColumn(DefaultValue = "0")]
public int Age { get; set; }
?
// 注冊(cè)時(shí)間(默認(rèn)值:當(dāng)前時(shí)間)
[SugarColumn(ColumnName = "Reg_Time", DefaultValue = "GETDATE()")]
public DateTime RegTime { get; set; }
?
// 忽略字段(不映射到數(shù)據(jù)庫(kù))
[SugarColumn(IsIgnore = true)]
public string TempData { get; set; }
}4.2 CRUD 核心 API
1. 新增(Insert)
// 單條新增
var user = new User
{
UserName = "張三",
Password = "123456",
Age = 25
};
// 執(zhí)行新增并返回自增ID
int newId = db.Insertable(user).ExecuteReturnIdentity();
?
// 批量新增(性能優(yōu)于循環(huán)單條插入)
var userList = new List<User>
{
new User{ UserName = "李四", Password = "654321", Age = 30 },
new User{ UserName = "王五", Password = "abc123", Age = 28 }
};
bool isSuccess = db.Insertable(userList).ExecuteCommand() > 0; // 返回影響行數(shù)2. 查詢(Query)
// 2.1 單條查詢(根據(jù)條件)
User user = db.Queryable<User>()
.Where(u => u.UserName == "張三") // 條件
.First(); // 返回第一條
?
// 2.2 列表查詢(帶排序)
List<User> users = db.Queryable<User>()
.Where(u => u.Age > 25) // 年齡>25
.OrderBy(u => u.RegTime, OrderByType.Desc) // 按注冊(cè)時(shí)間倒序
.ToList(); // 返回列表
?
// 2.3 分頁(yè)查詢(第2頁(yè),每頁(yè)10條)
int pageIndex = 2;
int pageSize = 10;
var pageResult = db.Queryable<User>()
.ToPageList(pageIndex, pageSize, out int totalCount);
// totalCount:總記錄數(shù)(用于分頁(yè)控件)
?
// 2.4 聚合查詢(統(tǒng)計(jì)、求和等)
int total = db.Queryable<User>().Count(); // 總記錄數(shù)
int maxAge = db.Queryable<User>().Max(u => u.Age); // 最大年齡
decimal avgAge = db.Queryable<User>().Average(u => u.Age); // 平均年齡3. 更新(Update)
// 3.1 全量更新(根據(jù)主鍵)
user.Age = 26; // 修改年齡
bool updateSuccess = db.Updateable(user).ExecuteCommand() > 0;
?
// 3.2 局部更新(只更新指定字段,性能更優(yōu))
bool partialUpdate = db.Updateable<User>()
.SetColumns(u => u.Age == 27) // 只更新Age字段
.Where(u => u.UserName == "張三") // 條件
.ExecuteCommand() > 0;4. 刪除(Delete)
// 4.1 根據(jù)實(shí)體刪除(根據(jù)主鍵)
bool deleteByEntity = db.Deleteable(user).ExecuteCommand() > 0;
?
// 4.2 根據(jù)條件刪除
bool deleteByWhere = db.Deleteable<User>()
.Where(u => u.Age < 18) // 刪除年齡<18的用戶
.ExecuteCommand() > 0;4.3 高級(jí)查詢 API
1. 子查詢
// 查詢“注冊(cè)時(shí)間在最近30天”且“年齡>平均年齡”的用戶
var subQuery = db.Queryable<User>().Select(u => SqlFunc.AggregateAverage(u.Age)); // 子查詢:平均年齡
?
var result = db.Queryable<User>()
.Where(u => u.RegTime >= DateTime.Now.AddDays(-30)
&& u.Age > subQuery) // 關(guān)聯(lián)子查詢
.ToList();2. 多表關(guān)聯(lián)查詢(導(dǎo)航屬性)
假設(shè)有訂單表(Order)與用戶表(User)關(guān)聯(lián)(一對(duì)多):
// 訂單實(shí)體(含導(dǎo)航屬性)
[SugarTable("Orders")]
public class Order
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public int UserId { get; set; } // 外鍵(關(guān)聯(lián)User.Id)
// 導(dǎo)航屬性:關(guān)聯(lián)用戶(一對(duì)一)
[Navigate(NavigateType.OneToOne, nameof(UserId))]
public User User { get; set; }
}
// 查詢訂單時(shí)同時(shí)加載關(guān)聯(lián)的用戶信息
var orders = db.Queryable<Order>()
.Includes(o => o.User) // 加載導(dǎo)航屬性
.Where(o => o.Id > 100)
.ToList();
// 使用關(guān)聯(lián)數(shù)據(jù)
foreach (var order in orders)
{
Console.WriteLine($"訂單ID:{order.Id},用戶名:{order.User.UserName}");
}4.4 事務(wù)操作
try
{
// 開啟事務(wù)
db.Ado.BeginTran();
// 執(zhí)行多個(gè)操作(新增用戶+新增訂單)
var newUser = new User { UserName = "趙六", Password = "111", Age = 35 };
int userId = db.Insertable(newUser).ExecuteReturnIdentity();
var newOrder = new Order { UserId = userId, OrderNo = "ORD_123" };
db.Insertable(newOrder).ExecuteCommand();
// 提交事務(wù)
db.Ado.CommitTran();
}
catch (Exception ex)
{
// 回滾事務(wù)
db.Ado.RollbackTran();
Console.WriteLine($"事務(wù)失?。簕ex.Message}");
}五、兩種客戶端模式對(duì)比(SqlSugarClient vs SqlSugarScope)
| 特性 | SqlSugarClient | SqlSugarScope |
|---|---|---|
| 線程安全 | 非線程安全(禁止單例) | 線程安全(支持單例) |
| 性能 | 更高(每次 new 輕量對(duì)象) | 中上(內(nèi)部維護(hù)上下文) |
| 適用場(chǎng)景 | WinForm、控制臺(tái)(非單例場(chǎng)景) | ASP.NET Core(單例注入) |
| 使用注意 | 每次操作 new 實(shí)例或用db.CopyNew() | 全局單例,禁止重復(fù) new(內(nèi)存泄漏) |
六、總結(jié)
SQLSugar 以 “高性能、易上手、功能全” 為核心優(yōu)勢(shì),通過(guò)簡(jiǎn)潔的 API 簡(jiǎn)化了 .NET 項(xiàng)目的數(shù)據(jù)庫(kù)操作。關(guān)鍵在于掌握 實(shí)體類定義(特性配置)、客戶端初始化 及 CRUD / 查詢 API 的使用。無(wú)論是簡(jiǎn)單的單表操作還是復(fù)雜的多表關(guān)聯(lián)、事務(wù)處理,SQLSugar 都能提供高效的解決方案,適合從中小型項(xiàng)目到大型企業(yè)系統(tǒng)的各類場(chǎng)景。
到此這篇關(guān)于SQLSugar簡(jiǎn)介、使用方法、核心類與 API 及示例演示的文章就介紹到這了,更多相關(guān)SQLSugar使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SqlSugar ORM框架安裝配置使用詳解
- C#使用SqlSugarClient進(jìn)行數(shù)據(jù)訪問并實(shí)現(xiàn)了統(tǒng)一的批量依賴注入(示例代碼)
- ABP引入SqlSugar框架的簡(jiǎn)單版創(chuàng)建使用
- 把Dapper 換成 SqlSugar ORM類的方法詳解
- C# SqlSugar批量執(zhí)行SQL語(yǔ)句及批量更新實(shí)體對(duì)象的操作方法
- .NET?ORM框架SqlSugar實(shí)現(xiàn)導(dǎo)航查詢功能
- .net數(shù)據(jù)庫(kù)操作框架SqlSugar的簡(jiǎn)單入門
相關(guān)文章
理解HttpHandler,并為所有*.jpg圖片生成一段文字于圖片上
HttpHandler就是最終相應(yīng)HTTP請(qǐng)求,生成HTTP響應(yīng)的處理器,他們的實(shí)例由asp.net運(yùn)行時(shí)創(chuàng)建,,并生存在asp.net的運(yùn)行時(shí)環(huán)境中,如果asp.net運(yùn)行時(shí)是處理請(qǐng)求的工廠,HttpHandler是處理請(qǐng)求的工人2012-03-03
ASP.NET?Core響應(yīng)壓縮中間件的使用技巧分享
響應(yīng)壓縮中間件是ASP.NET?Core的一部分,它通過(guò)應(yīng)用支持的壓縮算法(如Gzip和Brotli)來(lái)減小服務(wù)器發(fā)送到客戶端的響應(yīng)體積,本文給大家介紹了ASP.NET?Core響應(yīng)壓縮中間件的使用技巧及避坑指南,需要的朋友可以參考下2025-07-07
ASP.NET中的幾種彈出框提示基本實(shí)現(xiàn)方法
NET程序的開發(fā)過(guò)程中,常常需要和用戶進(jìn)行信息交互,對(duì)話框的出現(xiàn)將解決了這些問題,下面是本人對(duì)常用對(duì)話框使用的小結(jié),希望對(duì)大家有所幫助2013-03-03
如何在 .NET 中使用 Flurl 高效處理Http請(qǐng)求
這篇文章主要介紹了如何在 .NET 中使用 Flurl 高效處理Http請(qǐng)求,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下2021-05-05
Entity Framework使用LINQ操作實(shí)體
本文詳細(xì)講解了Entity Framework使用LINQ操作實(shí)體的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
ASP.NET Core中使用EPPlus導(dǎo)入出Excel文件的完整步驟
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中如何使用EPPlus導(dǎo)入出Excel文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02

