Mysql 5.7 与 SqlSugar 5.X 整合开发实战
参考文档
- https://www.donet5.com/Home/Doc
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
sudo docker pull mysql:5.7
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 可视化工具
https://www.mysql.com/products/workbench/
直接下载 deb 包,然后安装:
sudo dpkg -i xxx.deb
若遇到依赖报错,则先执行:
sudo apt --fix-broken install
三、查看字符集
sudo docker exec -it mysql5.7 mysql -u root -p
show variables like '%char%';
默认字符集是 latin1
,需要修改为 utf8
,若需要支持 emoji
则修改为 utf8mb4
。
show variables like 'collation%';
查看Mysql
所支持的字符集:
show charset;
四、修改字符集
sudo docker exec -it mysql5.7 /bin/bash
修改 /etc/my.cnf
配置文件:
# [mysqld] 节点:服务器级字符集
[mysqld]
character-set-server=utf8mb4 # 服务器默认字符集
collation-server=utf8mb4_unicode_ci # 对应的排序规则(不区分大小写)# [client] 节点:客户端连接时的字符集(避免连接环节乱码)
[client]
default-character-set=utf8mb4# [mysql] 节点:mysql命令行工具的字符集
[mysql]
default-character-set=utf8mb4
启动容器时挂载配置文件:
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
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 性能OKConsole.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
连接字符串添加参数:
SslMode=none;AllowPublicKeyRetrieval=True;
完整连接字符串如下:
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
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 性能OKConsole.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
的新文件。
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用AddScopedservices.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 性能OKConsole.WriteLine(UtilMethods.GetNativeSql(sql, pars));//获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用//Console.WriteLine(UtilMethods.GetSqlString(DbType.SqlServer,sql,pars))};});return sqlSugar;});}}
}
//用接口接收
public class(ISqlSugarClient db)
创建 StudentService1.cs
用于封装数据库操作:
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
的新文件。
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
中添加:
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"
十三、运行项目
dotnet build csharp-demo.csproj
dotnet run
十四、接口文档与测试
https://localhost:7215/swagger/index.html
调用接口 /api/v1/GetAll
:
十五、单例模式使用 IOC
只是注册方法有所不同,使用services.AddSingleton<ISqlSugarClient>
,其他没有差别。
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();//注册SqlSugarservices.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 性能OKConsole.WriteLine(UtilMethods.GetNativeSql(sql, pars));};});return sqlSugar;});}}
}
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();}}
}
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);}}}
using csharp_demo.Services;// ...// MySql DB 服务
builder.Services.AddMySqlService1(builder.Configuration);
builder.Services.AddMySqlService2(builder.Configuration);// ...app.Run();
从执行结果上看,两种IOC方式都成功运行。