草云南豪情壮志的母亲 發表於 2025-12-9 10:25:38

SQLSugar简介、使用方法、核心类与 API 及示例演示

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、SQLSugar 简介</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">核心特点:</a></li></ul><li><a href="#_label1">二、基本使用方法</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_1">2.1 安装</a></li><li><a href="#_lab2_1_2">2.2 初始化数据库连接</a></li><li><a href="#_lab2_1_3">2.3 核心操作流程</a></li></ul><li><a href="#_label2">三、关键类与作用</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">四、关键 API 与示例</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_4">4.1 实体类定义(基于特性)</a></li><li><a href="#_lab2_3_5">4.2 CRUD 核心 API</a></li><ul class="third_class_ul"><li><a href="#_label3_3_5_0">1. 新增(Insert)</a></li><li><a href="#_label3_3_5_1">2. 查询(Query)</a></li><li><a href="#_label3_3_5_2">3. 更新(Update)</a></li></ul><li><a href="#_lab2_3_6">4.3 高级查询 API</a></li><ul class="third_class_ul"><li><a href="#_label3_3_6_3">1. 子查询</a></li><li><a href="#_label3_3_6_4">2. 多表关联查询(导航属性)</a></li></ul><li><a href="#_lab2_3_7">4.4 事务操作</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label4">五、两种客户端模式对比(SqlSugarClient vs SqlSugarScope)</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">六、总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、SQLSugar 简介</h2>
<p>SQLSugar 是一款 <strong>轻量级、高性能的 .NET ORM 框架</strong>,由国内团队开发维护,专注于简化数据库操作,同时兼顾灵活性与性能。它通过对象关系映射(ORM)将 C# 实体类与数据库表关联,允许开发者以面向对象的方式完成 CRUD、查询、事务等操作,无需编写原生 SQL(或仅需少量 SQL)。</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>核心特点:</h3>
<ul><li><strong>多数据库支持</strong>:兼容 SQL Server、MySQL、Oracle、PostgreSQL、SQLite、达梦等主流数据库,切换数据库只需修改配置。</li><li><strong>高性能</strong>:采用编译缓存、SQL 优化等机制,性能接近原生 <a href="https://ado.net/" rel="external nofollow"   title="ADO.NET">ADO.NET</a>,远超多数同类 ORM。</li><li><strong>易用性</strong>:API 设计简洁,支持链式查询(如 <code>Queryable&lt;T&gt;().Where().OrderBy()</code>),学习成本低。</li><li><strong>功能全面</strong>:支持分表分库、导航属性(多表关联)、批量操作、事务、数据库迁移(CodeFirst)等高级特性。</li><li><strong>轻量无依赖</strong>:核心库体积仅几百 KB,可无缝集成到 .NET Framework、.NET Core、.NET 5+ 等项目中。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>二、基本使用方法</h2>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2.1 安装</h3>
<p>通过 NuGet 安装核心包:</p>
<div class="jb51code"><pre class="brush:csharp;">Install-Package SqlSugarCore# .NET Core/.NET 5+
# 或针对特定数据库安装扩展包(如MySQL)
Install-Package MySqlConnector# MySQL驱动</pre></div>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>2.2 初始化数据库连接</h3>
<p>使用 <code>SqlSugarClient</code> 或 <code>SqlSugarScope</code> 初始化连接(核心是 <code>ConnectionConfig</code> 配置):</p>
<div class="jb51code"><pre class="brush:csharp;">using SqlSugar;
using System;

// 1. 定义连接配置
var config = new ConnectionConfig
{
    ConnectionString = "Server=.;Database=TestDB;Uid=sa;Pwd=123456;", // 连接字符串
    DbType = DbType.SqlServer, // 数据库类型(如DbType.MySql)
    IsAutoCloseConnection = true, // 自动关闭连接(推荐开启)
    InitKeyType = InitKeyType.Attribute // 从实体特性读取主键/自增配置
};

// 2. 初始化客户端(二选一)
// 方式1:SqlSugarClient(非线程安全,每次操作new实例或通过IOC注入Scope)
var db = new SqlSugarClient(config);

// 方式2:SqlSugarScope(线程安全,适合单例模式,如ASP.NET Core注入)
// var db = new SqlSugarScope(config);</pre></div>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>2.3 核心操作流程</h3>
<ul><li><strong>定义实体类</strong>(映射数据库表);</li><li><strong>通过客户端对象(db)</strong> 调用 API 执行数据库操作(CRUD、查询等)。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>三、关键类与作用</h2>
<table><thead><tr><th>类 / 接口</th><th>作用说明</th><th>核心场景</th></tr></thead><tbody><tr><td><code>SqlSugarClient</code></td><td>数据库操作核心类,提供所有 ORM API</td><td>非单例场景(如 WinForm),每次操作 new 实例</td></tr><tr><td><code>SqlSugarScope</code></td><td>线程安全的客户端类(基于 AsyncLocal 实现)</td><td>单例场景(如<a href="https://asp.net/" rel="external nofollow"rel="external nofollow"   title="ASP.NET">ASP.NET</a> Core),全局共享实例</td></tr><tr><td><code>ISqlSugarClient</code></td><td>客户端接口,用于依赖注入(解耦)</td><td>项目中通过接口调用,便于测试和替换</td></tr><tr><td><code>ConnectionConfig</code></td><td>连接配置类,存储数据库连接信息</td><td>初始化客户端时必传,配置连接字符串、数据库类型等</td></tr><tr><td><code>SugarTable</code></td><td>类级别特性,指定实体对应的数据表名</td><td>实体类定义时,映射表名(如<code></code>)</td></tr><tr><td><code>SugarColumn</code></td><td>属性级别特性,配置字段属性(主键、长度等)</td><td>实体属性定义时,指定字段名、自增、默认值等</td></tr></tbody></table>
<p class="maodian"><a name="_label3"></a></p><h2>四、关键 API 与示例</h2>
<p class="maodian"><a name="_lab2_3_4"></a></p><h3>4.1 实体类定义(基于特性)</h3>
<p>先定义与数据库表映射的实体类(以 &ldquo;用户表&rdquo; 为例):</p>
<div class="jb51code"><pre class="brush:csharp;">using SqlSugar;
using System;

// 映射到数据库表:Sys_User

public class User
{
    // 主键(自增)
   
    public int Id { get; set; }

    // 用户名(字段名:User_Name,长度50,非空)
   
    public string UserName { get; set; }

    // 密码(字段名:User_Pwd,加密存储)
   
    public string Password { get; set; }

    // 年龄(默认值0)
   
    public int Age { get; set; }

    // 注册时间(默认值:当前时间)
   
    public DateTime RegTime { get; set; }

    // 忽略字段(不映射到数据库)
   
    public string TempData { get; set; }
}</pre></div>
<p class="maodian"><a name="_lab2_3_5"></a></p><h3>4.2 CRUD 核心 API</h3>
<p class="maodian"><a name="_label3_3_5_0"></a></p><h4>1. 新增(Insert)</h4>
<div class="jb51code"><pre class="brush:csharp;">// 单条新增
var user = new User
{
    UserName = "张三",
    Password = "123456",
    Age = 25
};
// 执行新增并返回自增ID
int newId = db.Insertable(user).ExecuteReturnIdentity();

// 批量新增(性能优于循环单条插入)
var userList = new List&lt;User&gt;
{
    new User{ UserName = "李四", Password = "654321", Age = 30 },
    new User{ UserName = "王五", Password = "abc123", Age = 28 }
};
bool isSuccess = db.Insertable(userList).ExecuteCommand() &gt; 0; // 返回影响行数</pre></div>
<p class="maodian"><a name="_label3_3_5_1"></a></p><h4>2. 查询(Query)</h4>
<div class="jb51code"><pre class="brush:csharp;">// 2.1 单条查询(根据条件)
User user = db.Queryable&lt;User&gt;()
            .Where(u =&gt; u.UserName == "张三") // 条件
            .First(); // 返回第一条

// 2.2 列表查询(带排序)
List&lt;User&gt; users = db.Queryable&lt;User&gt;()
                     .Where(u =&gt; u.Age &gt; 25) // 年龄&gt;25
                     .OrderBy(u =&gt; u.RegTime, OrderByType.Desc) // 按注册时间倒序
                     .ToList(); // 返回列表

// 2.3 分页查询(第2页,每页10条)
int pageIndex = 2;
int pageSize = 10;
var pageResult = db.Queryable&lt;User&gt;()
                   .ToPageList(pageIndex, pageSize, out int totalCount);
// totalCount:总记录数(用于分页控件)

// 2.4 聚合查询(统计、求和等)
int total = db.Queryable&lt;User&gt;().Count(); // 总记录数
int maxAge = db.Queryable&lt;User&gt;().Max(u =&gt; u.Age); // 最大年龄
decimal avgAge = db.Queryable&lt;User&gt;().Average(u =&gt; u.Age); // 平均年龄</pre></div>
<p class="maodian"><a name="_label3_3_5_2"></a></p><h4>3. 更新(Update)</h4>
<div class="jb51code"><pre class="brush:csharp;">// 3.1 全量更新(根据主键)
user.Age = 26; // 修改年龄
bool updateSuccess = db.Updateable(user).ExecuteCommand() &gt; 0;

// 3.2 局部更新(只更新指定字段,性能更优)
bool partialUpdate = db.Updateable&lt;User&gt;()
                     .SetColumns(u =&gt; u.Age == 27) // 只更新Age字段
                     .Where(u =&gt; u.UserName == "张三") // 条件
                     .ExecuteCommand() &gt; 0;</pre></div>
<h5>4. 删除(Delete)</h5>
<div class="jb51code"><pre class="brush:csharp;">// 4.1 根据实体删除(根据主键)
bool deleteByEntity = db.Deleteable(user).ExecuteCommand() &gt; 0;

// 4.2 根据条件删除
bool deleteByWhere = db.Deleteable&lt;User&gt;()
                     .Where(u =&gt; u.Age &lt; 18) // 删除年龄&lt;18的用户
                     .ExecuteCommand() &gt; 0;</pre></div>
<p class="maodian"><a name="_lab2_3_6"></a></p><h3>4.3 高级查询 API</h3>
<p class="maodian"><a name="_label3_3_6_3"></a></p><h4>1. 子查询</h4>
<div class="jb51code"><pre class="brush:csharp;">// 查询“注册时间在最近30天”且“年龄&gt;平均年龄”的用户
var subQuery = db.Queryable&lt;User&gt;().Select(u =&gt; SqlFunc.AggregateAverage(u.Age)); // 子查询:平均年龄

var result = db.Queryable&lt;User&gt;()
               .Where(u =&gt; u.RegTime &gt;= DateTime.Now.AddDays(-30)
                        &amp;&amp; u.Age &gt; subQuery) // 关联子查询
               .ToList();</pre></div>
<p class="maodian"><a name="_label3_3_6_4"></a></p><h4>2. 多表关联查询(导航属性)</h4>
<p>假设有订单表(Order)与用户表(User)关联(一对多):</p>
<div class="jb51code"><pre class="brush:csharp;">// 订单实体(含导航属性)

public class Order
{
   
    public int Id { get; set; }
    public int UserId { get; set; } // 外键(关联User.Id)
    // 导航属性:关联用户(一对一)
   
    public User User { get; set; }
}
// 查询订单时同时加载关联的用户信息
var orders = db.Queryable&lt;Order&gt;()
               .Includes(o =&gt; o.User) // 加载导航属性
               .Where(o =&gt; o.Id &gt; 100)
               .ToList();
// 使用关联数据
foreach (var order in orders)
{
    Console.WriteLine($"订单ID:{order.Id},用户名:{order.User.UserName}");
}</pre></div>
<p class="maodian"><a name="_lab2_3_7"></a></p><h3>4.4 事务操作</h3>
<div class="jb51code"><pre class="brush:csharp;">try
{
    // 开启事务
    db.Ado.BeginTran();
    // 执行多个操作(新增用户+新增订单)
    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();
    // 提交事务
    db.Ado.CommitTran();
}
catch (Exception ex)
{
    // 回滚事务
    db.Ado.RollbackTran();
    Console.WriteLine($"事务失败:{ex.Message}");
}</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>五、两种客户端模式对比(SqlSugarClient vs SqlSugarScope)</h2>
<table><thead><tr><th>特性</th><th>SqlSugarClient</th><th>SqlSugarScope</th></tr></thead><tbody><tr><td>线程安全</td><td>非线程安全(禁止单例)</td><td>线程安全(支持单例)</td></tr><tr><td>性能</td><td>更高(每次 new 轻量对象)</td><td>中上(内部维护上下文)</td></tr><tr><td>适用场景</td><td>WinForm、控制台(非单例场景)</td><td><a href="https://asp.net/" rel="external nofollow"rel="external nofollow"   title="ASP.NET">ASP.NET</a> Core(单例注入)</td></tr><tr><td>使用注意</td><td>每次操作 new 实例或用<code>db.CopyNew()</code></td><td>全局单例,禁止重复 new(内存泄漏)</td></tr></tbody></table>
<p class="maodian"><a name="_label5"></a></p><h2>六、总结</h2>
<p>SQLSugar 以 &ldquo;高性能、易上手、功能全&rdquo; 为核心优势,通过简洁的 API 简化了 .NET 项目的数据库操作。关键在于掌握 <strong>实体类定义(特性配置)</strong>、<strong>客户端初始化</strong> 及 <strong>CRUD / 查询 API</strong> 的使用。无论是简单的单表操作还是复杂的多表关联、事务处理,SQLSugar 都能提供高效的解决方案,适合从中小型项目到大型企业系统的各类场景。</p>
頁: [1]
查看完整版本: SQLSugar简介、使用方法、核心类与 API 及示例演示