参考文档
SqlSugar 5.X 概述
SqlSugar 是一款轻量级、高性能的国产 ORM(对象关系映射)框架,支持 .NET 和 .NET Core 平台。其语法简洁、功能丰富,适用于多种数据库操作场景,包括分库分表、读写分离等。5.X 版本在性能、稳定性和功能扩展上进行了优化。
核心特性
-
多数据库支持
支持主流数据库:MySQL、SQL Server、Oracle、PostgreSQL、SQLite 等,并提供统一的 API 接口。
-
高性能
采用表达式树解析和缓存机制,减少反射开销,查询性能接近原生 ADO.NET。
-
代码简洁
链式语法和 Lambda 表达式结合,代码可读性强。
-
分库分表
内置分表分库功能,支持按时间、ID 等规则自动路由。
-
AOP 支持
提供事务、日志、SQL 拦截等面向切面编程的扩展点。
一、安装 Mysql 5.7
bash
sudo docker pull mysql:5.7
bash
sudo docker run --name mysql5.7 \
-e MYSQL_ROOT_PASSWORD=0123456789 \
-p 3306:3306 \
-v /home/sam/mysql/data:/var/lib/mysql \
-d mysql:5.7
二、Mysql 可视化工具


直接下载 deb 包,然后安装:
bash
sudo dpkg -i xxx.deb
若遇到依赖报错,则先执行:
bash
sudo apt --fix-broken install

三、查看字符集
bash
sudo docker exec -it mysql5.7 mysql -u root -p

sql
show variables like '%char%';

默认字符集是 latin1
,需要修改为 utf8
,若需要支持 emoji
则修改为 utf8mb4
。
sql
show variables like 'collation%';

查看Mysql
所支持的字符集:
sql
show charset;

四、修改字符集
bash
sudo docker exec -it mysql5.7 /bin/bash

修改 /etc/my.cnf
配置文件:
bash
# [mysqld] 节点:服务器级字符集
[mysqld]
character-set-server=utf8mb4 # 服务器默认字符集
collation-server=utf8mb4_unicode_ci # 对应的排序规则(不区分大小写)
# [client] 节点:客户端连接时的字符集(避免连接环节乱码)
[client]
default-character-set=utf8mb4
# [mysql] 节点:mysql命令行工具的字符集
[mysql]
default-character-set=utf8mb4

启动容器时挂载配置文件:
bash
sudo docker run --name mysql5.7 \
-e MYSQL_ROOT_PASSWORD=0123456789 \
-p 3306:3306 \
-v /home/sam/mysql/data:/var/lib/mysql \
-v /home/sam/mysql/conf/my.cnf:/etc/my.cnf \
-d mysql:5.7
重新查看默认字符集:

五、安装 SqlSugarCore
SqlSugarCore 带常用数据库用驱动, 不常用的缺了会提示安装

六、原生模式:SqlSugarClient
csharp
using SqlSugar;
//创建数据库对象 (用法和EF Dappper一样通过new保证线程安全)
SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "Server=172.17.0.1;Port=3306;Database=myDataBase;Uid=root;Pwd=0123456789;",
DbType = DbType.MySql,
IsAutoCloseConnection = true
},
db => {
db.Aop.OnLogExecuting = (sql, pars) =>
{
//获取原生SQL推荐 5.1.4.63 性能OK
Console.WriteLine(UtilMethods.GetNativeSql(sql, pars));
//获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用
//Console.WriteLine(UtilMethods.GetSqlString(DbType.SqlServer,sql,pars))
};
//注意多租户 有几个设置几个
//db.GetConnection(i).Aop
});
//建库
Db.DbMaintenance.CreateDatabase();//达梦和Oracle不支持建库
//建表(看文档迁移)
Db.CodeFirst.InitTables<Student>(); //所有库都支持
//查询表的所有
var list = Db.Queryable<Student>().ToList();
//插入
Db.Insertable(new Student() { SchoolId = 1, Name = "jack" }).ExecuteCommand();
//更新
Db.Updateable(new Student() { Id = 1, SchoolId = 2, Name = "jack2" }).ExecuteCommand();
//删除
Db.Deleteable<Student>().Where(it => it.Id == 1).ExecuteCommand();
//实体与数据库结构一样
public class Student
{
//数据是自增需要加上IsIdentity
//数据库是主键需要加上IsPrimaryKey
//注意:要完全和数据库一致2个属性
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public int? SchoolId { get; set; }
public string? Name { get; set; }
}
SqlSugarClient
每次请求new一个新对象,db禁止跨上下文使用,IOC建议用Scope或者瞬发注入。
运行报错1 :SSL Authentication ErrorDbType="MySql";ConfigId="".
正在生成...
Unhandled exception. SqlSugar.SqlSugarException: 中文提示 : 连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:SSL Authentication ErrorDbType="MySql";ConfigId="".
English Message : Connection open error . SSL Authentication ErrorDbType="MySql";ConfigId=""
at SqlSugar.Check.Exception(Boolean isException, String message, String[] args)
at SqlSugar.AdoProvider.CheckConnection()
at SqlSugar.MySqlProvider.GetCommand(String sql, SugarParameter[] parameters)
at SqlSugar.AdoProvider.GetDataReader(String sql, SugarParameter[] parameters)
at SqlSugar.AdoProvider.SqlQuery[T,T2,T3,T4,T5,T6,T7](String sql, Object parameters)
at SqlSugar.AdoProvider.SqlQuery[T](String sql, SugarParameter[] parameters)
at SqlSugar.AdoProvider.SqlQuery[T](String sql, Object parameters)
at SqlSugar.DbMaintenanceProvider.GetDataBaseList(SqlSugarClient db)
at SqlSugar.MySqlDbMaintenance.CreateDatabase(String databaseName, String databaseDirectory)
at SqlSugar.DbMaintenanceProvider.CreateDatabase(String databaseDirectory)
at Program.<Main>$(String[] args) in /home/sam/MyWorkSpace/csharp-demo/Program.cs:line 57

连接字符串添加参数:
bash
SslMode=none;AllowPublicKeyRetrieval=True;
完整连接字符串如下:
sql
SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "Server=172.17.0.1;Port=3306;Database=myDataBase;Uid=root;Pwd=0123456789;charset=utf8mb4;Pooling=false;SslMode=none;AllowPublicKeyRetrieval=True;",
DbType = DbType.MySql,
IsAutoCloseConnection = true
},
再次运行:


从可视化界面中可以看到,新建了数据库 myDataBase
和数据表 Student
:

七、单例模式:SqlSugarScope
csharp
using SqlSugar;
//建库
SqlSugarHelper.Db.DbMaintenance.CreateDatabase();//达梦和Oracle不支持建库
//建表 (看文档迁移)
SqlSugarHelper.Db.CodeFirst.InitTables<Student>(); //所有库都支持
//查询表的所有
var list = SqlSugarHelper.Db.Queryable<Student>().ToList();
//插入
SqlSugarHelper.Db.Insertable(new Student() { SchoolId = 1, Name = "jack" }).ExecuteCommand();
//更新
SqlSugarHelper.Db.Updateable(new Student() { Id = 1, SchoolId = 2, Name = "jack2" }).ExecuteCommand();
//删除
SqlSugarHelper.Db.Deleteable<Student>().Where(it => it.Id == 1).ExecuteCommand();
public class SqlSugarHelper //不能是泛型类
{
//多库情况下使用说明:
//如果是固定多库可以传 new SqlSugarScope(List<ConnectionConfig>,db=>{}) 文档:多租户
//如果是不固定多库 可以看文档Saas分库
//用单例模式
public static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig()
{
ConnectionString = "Server=172.17.0.1;Port=3306;Database=myDataBase;Uid=root;Pwd=0123456789;charset=utf8mb4;Pooling=false;SslMode=none;AllowPublicKeyRetrieval=True;",//连接符字串
DbType = DbType.MySql,//数据库类型
IsAutoCloseConnection = true //不设成true要手动close
},
db => {
//(A)全局生效配置点,一般AOP和程序启动的配置扔这里面 ,所有上下文生效
//调试SQL事件,可以删掉
db.Aop.OnLogExecuting = (sql, pars) =>
{
//获取原生SQL推荐 5.1.4.63 性能OK
Console.WriteLine(UtilMethods.GetNativeSql(sql,pars));
//获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用
//Console.WriteLine(UtilMethods.GetSqlString(DbType.SqlServer,sql,pars))
};
//多个配置就写下面
//db.Ado.IsDisableMasterSlaveSeparation=true;
//注意多租户 有几个设置几个
//db.GetConnection(i).Aop
});
}
//实体与数据库结构一样
public class Student
{
//数据是自增需要加上IsIdentity
//数据库是主键需要加上IsPrimaryKey
//注意:要完全和数据库一致2个属性
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public int? SchoolId { get; set; }
public string? Name { get; set; }
}
运行效果:



数据库 myDataBase
和数据表 Student
本身存在,所以不会重新建库建表,往表中塞入数据时,主键 Id 继续自增,故更新操作和删除操作的条件 Id 均不满足。
八、创建学生模型
创建 Models 文件夹,在 Visual Studio Code 中选择 Models 文件夹,并添加名为 Student.cs
的新文件。

九、原生模式使用 IOC
创建 Services 文件夹,在 Visual Studio Code 中选择该文件夹,并添加名为 SugarService1.cs
的新文件。
csharp
using SqlSugar;
namespace csharp_demo.Services
{
public static class SugarService1
{
public static void AddMySqlService(this IServiceCollection services, ConfigurationManager config, string dbName = "ConnectString")
{
//注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行
services.AddHttpContextAccessor();
//注册SqlSugar用AddScoped
services.AddScoped<ISqlSugarClient>(s =>
{
//Scoped用SqlSugarClient
SqlSugarClient sqlSugar = new SqlSugarClient(new ConnectionConfig()
{
DbType = DbType.MySql,
ConnectionString = config[dbName],
IsAutoCloseConnection = true,
},
db =>
{
//每次上下文都会执行
//获取IOC对象不要求在一个上下文
//var log=s.GetService<Log>()
//获取IOC对象要求在一个上下文
//var appServive = s.GetService<IHttpContextAccessor>();
//var log= appServive?.HttpContext?.RequestServices.GetService<Log>();
db.Aop.OnLogExecuting = (sql, pars) =>
{
//获取原生SQL推荐 5.1.4.63 性能OK
Console.WriteLine(UtilMethods.GetNativeSql(sql, pars));
//获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用
//Console.WriteLine(UtilMethods.GetSqlString(DbType.SqlServer,sql,pars))
};
});
return sqlSugar;
});
}
}
}
csharp
//用接口接收
public class(ISqlSugarClient db)
创建 StudentService1.cs
用于封装数据库操作:
csharp
using csharp_demo.Models;
using SqlSugar;
namespace csharp_demo.Services
{
public class StudentService1
{
private ISqlSugarClient _client;
public StudentService1(ISqlSugarClient iSqlSugarClient)
{
_client = iSqlSugarClient;
}
public void CreateDatabase()
{
//建库
_client.DbMaintenance.CreateDatabase();//达梦和Oracle不支持建库
}
public void InitTables()
{
//建表 (看文档迁移)
_client.CodeFirst.InitTables<Student>(); //所有库都支持
}
public List<Student> GetAll()
{
//查询表的所有
return _client.Queryable<Student>().ToList();
}
public void Delete(int id)
{
//删除
_client.Deleteable<Student>().Where(it => it.Id == id).ExecuteCommand();
}
public void Update(int id, int schoolId, string name)
{
//更新
_client.Updateable(new Student() { Id = id, SchoolId = schoolId, Name = name }).ExecuteCommand();
}
public void Add(int schoolId, string name)
{
//插入
_client.Insertable(new Student() { SchoolId = schoolId, Name = name }).ExecuteCommand();
}
}
}
十、创建控制器
控制器是一个公共类,具有一个或多个称为"操作"的公共方法。 按照惯例,控制器放在项目根目录的 Controllers 目录中。 这些操作在 Web API 控制器内公开为 HTTP 终结点。
在 Visual Studio Code 中选择 Controllers 文件夹,并添加名为 StudentController1.cs
的新文件。
csharp
using csharp_demo.Models;
using csharp_demo.Services;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace csharp_demo.Controllers
{
[ApiController]
[Route("api/v1/[action]")]
public class StudentController1 : ControllerBase
{
private readonly StudentService1 _studentService;
public StudentController1(ISqlSugarClient iSqlSugarClient)
{
_studentService = new StudentService1(iSqlSugarClient);
}
[HttpGet]
public void CreateDatabase()
{
//建库
_studentService.CreateDatabase();
}
[HttpGet]
public void InitTables()
{
//建表
_studentService.InitTables();
}
[HttpGet]
public List<Student> GetAll()
{
//查询表的所有
return _studentService.GetAll();
}
[HttpGet]
public void Delete(int id)
{
//删除
_studentService.Delete(id);
}
[HttpGet]
public void Update(int id, int schoolId, string name)
{
//更新
_studentService.Update(id, schoolId, name);
}
[HttpGet]
public void Add(int schoolId, string name)
{
//插入
_studentService.Add(schoolId, name);
}
}
}
十一、注册服务
在 Program.cs
中添加:
csharp
using csharp_demo.Services;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// ...
// MySql DB 服务
builder.Services.AddMySqlService(builder.Configuration);
// ...
app.Run();

十二、配置连接字符串
在 appsettings.json
中配置连接字符串:
"ConnectString": "server=localhost;Database=MyTestDb;Uid=root;Pwd=p0123456789"

十三、运行项目
bash
dotnet build csharp-demo.csproj

bash
dotnet run

十四、接口文档与测试
bash
https://localhost:7215/swagger/index.html

调用接口 /api/v1/GetAll
:


十五、单例模式使用 IOC
只是注册方法有所不同,使用services.AddSingleton<ISqlSugarClient>
,其他没有差别。
csharp
using SqlSugar;
namespace csharp_demo.Services
{
public static class SugarService2
{
public static void AddMySqlService2(this IServiceCollection services, ConfigurationManager config, string dbName = "ConnectString")
{
//注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行
services.AddHttpContextAccessor();
//注册SqlSugar
services.AddSingleton<ISqlSugarClient>(s =>
{
SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
{
DbType = DbType.MySql,
ConnectionString = config[dbName],
IsAutoCloseConnection = true,
},
db =>
{
//每次上下文都会执行
//获取IOC对象不要求在一个上下文
//var log=s.GetService<Log>()
//获取IOC对象要求在一个上下文
//var appServive = s.GetService<IHttpContextAccessor>();
//var log= appServive?.HttpContext?.RequestServices.GetService<Log>();
db.Aop.OnLogExecuting = (sql, pars) =>
{
//获取原生SQL推荐 5.1.4.63 性能OK
Console.WriteLine(UtilMethods.GetNativeSql(sql, pars));
};
});
return sqlSugar;
});
}
}
}
csharp
using csharp_demo.Models;
using SqlSugar;
namespace csharp_demo.Services
{
public class StudentService2
{
private ISqlSugarClient _client;
public StudentService2(ISqlSugarClient iSqlSugarClient)
{
_client = iSqlSugarClient;
}
public void CreateDatabase()
{
//建库
_client.DbMaintenance.CreateDatabase();//达梦和Oracle不支持建库
}
public void InitTables()
{
//建表 (看文档迁移)
_client.CodeFirst.InitTables<Student>(); //所有库都支持
}
public List<Student> GetAll()
{
//查询表的所有
return _client.Queryable<Student>().ToList();
}
public void Delete(int id)
{
//删除
_client.Deleteable<Student>().Where(it => it.Id == id).ExecuteCommand();
}
public void Update(int id, int schoolId, string name)
{
//更新
_client.Updateable(new Student() { Id = id, SchoolId = schoolId, Name = name }).ExecuteCommand();
}
public void Add(int schoolId, string name)
{
//插入
_client.Insertable(new Student() { SchoolId = schoolId, Name = name }).ExecuteCommand();
}
}
}
csharp
using csharp_demo.Models;
using csharp_demo.Services;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace csharp_demo.Controllers
{
[ApiController]
[Route("api/v2/[action]")]
public class StudentController2 : ControllerBase
{
private readonly StudentService2 _studentService;
public StudentController2(ISqlSugarClient iSqlSugarClient)
{
_studentService = new StudentService2(iSqlSugarClient);
}
[HttpGet]
public void CreateDatabase()
{
//建库
_studentService.CreateDatabase();
}
[HttpGet]
public void InitTables()
{
//建表
_studentService.InitTables();
}
[HttpGet]
public List<Student> GetAll()
{
//查询表的所有
return _studentService.GetAll();
}
[HttpGet]
public void Delete(int id)
{
//删除
_studentService.Delete(id);
}
[HttpGet]
public void Update(int id, int schoolId, string name)
{
//更新
_studentService.Update(id, schoolId, name);
}
[HttpGet]
public void Add(int schoolId, string name)
{
//插入
_studentService.Add(schoolId, name);
}
}
}
csharp
using csharp_demo.Services;
// ...
// MySql DB 服务
builder.Services.AddMySqlService1(builder.Configuration);
builder.Services.AddMySqlService2(builder.Configuration);
// ...
app.Run();



从执行结果上看,两种IOC方式都成功运行。