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

参考文档

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

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 可视化工具

https://www.mysql.com/products/workbench/

直接下载 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或者瞬发注入。

运行报错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

连接字符串添加参数:

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

相关推荐
阿幸软件杂货间9 小时前
Office转PDF转换器v1.0.py
开发语言·pdf·c#
sali-tec10 小时前
C# 基于halcon的视觉工作流-章34-环状测量
开发语言·图像处理·算法·计算机视觉·c#
Tiger_shl10 小时前
【层面一】C#语言基础和核心语法-02(反射/委托/事件)
开发语言·c#
会飞的架狗师14 小时前
【MySQL体系】第1篇:从MySQL架构原理到存储的解析
后端·mysql
mudtools14 小时前
.NET驾驭Word之力:COM组件二次开发全攻略之连接Word与创建你的第一个自动化文档
后端·c#
BXCQ_xuan15 小时前
软件工程实践四:MyBatis-Plus 教程(连接、分页、查询)
spring boot·mysql·json·mybatis
王维志16 小时前
LiteDB详解
数据库·后端·mongodb·sqlite·c#·json·database
玉衡子16 小时前
七、InnoDB底层原理与日志机制
java·mysql
程序猿多布16 小时前
XLua教程之热补丁技术
unity·c#·lua·xlua
cyforkk16 小时前
MySQL 唯一约束:从基础到实战,解决数据重复的核心工具
数据库·mysql