当前位置: 首页 > news >正文

Mysql 5.7 与 SqlSugar 5.X 整合开发实战

参考文档

  • https://www.donet5.com/Home/Doc

SqlSugar 5.X 概述

SqlSugar 是一款轻量级、高性能的国产 ORM(对象关系映射)框架,支持 .NET 和 .NET Core 平台。其语法简洁、功能丰富,适用于多种数据库操作场景,包括分库分表、读写分离等。5.X 版本在性能、稳定性和功能扩展上进行了优化。

核心特性

  1. 多数据库支持
    支持主流数据库:MySQL、SQL Server、Oracle、PostgreSQL、SQLite 等,并提供统一的 API 接口。

  2. 高性能
    采用表达式树解析和缓存机制,减少反射开销,查询性能接近原生 ADO.NET。

  3. 代码简洁
    链式语法和 Lambda 表达式结合,代码可读性强。

  4. 分库分表
    内置分表分库功能,支持按时间、ID 等规则自动路由。

  5. 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或者瞬发注入。

运行报错1SSL 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方式都成功运行。

http://www.dtcms.com/a/349682.html

相关文章:

  • 对线性代数伴随矩阵的深刻理解
  • ComfyUI AI一键换装工作流无私分享
  • 【ansible】6.主机模式以及包含和导入文件
  • Ansible自动化运维介绍与安装
  • 国内代理 IP 的类型:住宅 IP、机房 IP、移动 4G/5G IP 区别
  • 愿景娱乐:践行“流量向善”以公益行动赋能“她”未来
  • RAG(知识库ChatPDF)
  • 开源大模型天花板?DeepSeek-V3 6710亿参数MoE架构深度拆解
  • 无障碍辅助模块|Highcharts引领可访问数据可视化的交流
  • 部分CSS笔试题讲解
  • Python JSON 全方位解析:序列化、反序列化与实战技巧
  • pytest+requests+Python3.7+yaml+Allure+Jenkins+docker实现接口自动化测试
  • k8sday17安全机制
  • flask Celery入门:轻松实现异步任务处理
  • 前端通过node本地转译rtsp流,配合hls实现浏览
  • 【SQL】深入理解MySQL存储过程:从入门到实战
  • CUDA 工具包 13.0 正式发布:开启新一代 GPU 计算的基石!
  • 使用EasyExcel根据模板导出文件
  • QtExcel/QXlsx
  • 深入浅出 Java 多态:从原理到实践的全面解析
  • 【RAGFlow代码详解-5】配置系统
  • 基于深度学习的翻拍照片去摩尔纹在线系统设计与实现
  • UE5 HoudiniPivotPainter1.0使用
  • NFC 滤波网络设计考虑
  • 车载通信架构---通过CANoe做 SOME/IP 模拟的配置例如
  • 库存指标怎么算?一文讲清3大库存分析指标
  • 大数据治理域——离线数据开发
  • 小白成长之路-k8s部署项目(二)
  • Legion Y7000P IRX9 DriveList
  • 【数据可视化-100】使用 Pyecharts 绘制人口迁徙图:步骤与数据组织形式