SqlSugar MySQL 完整全套教程

SqlSugar MySQL 完整全套教程(可直接复制到项目)

一、NuGet 安装

  1. 核心ORM包
Install-Package SqlSugar
  1. MySQL驱动(必须装)
Install-Package MySqlConnector

二、MySQL 专用连接串 + 全局工具类 SqlSugarHelper

1. 工具类(MySQL版本,直接替换DbType和连接字符串)

using SqlSugar;
using System;

namespace Demo
{
    public static class SqlSugarHelper
    {
        private static readonly SqlSugarScope _db;

        static SqlSugarHelper()
        {
            // ===================== MySQL 连接字符串 =====================
            // 参数说明:
            // Server=IP;Port=端口;Database=库名;Uid=账号;Pwd=密码
            // AllowLoadLocalInfile=true 批量插入文件用;SslMode=None 本地开发关闭SSL
            string connStr = "Server=127.0.0.1;Port=3306;Database=test_db;Uid=root;Pwd=123456;SslMode=None;AllowLoadLocalInfile=true";

            var config = new ConnectionConfig()
            {
                ConnectionString = connStr,
                // 关键:MySQL固定填 DbType.MySql
                DbType = DbType.MySql,
                IsAutoCloseConnection = true,
                MoreSettings = new ConnMoreSettings
                {
                    IsWithNoLockQuery = false, // MySQL无nolock,关闭
                    PgSqlIsAutoToLower = false
                }
            };

            _db = new SqlSugarScope(config, db =>
            {
                // SQL日志输出,调试打印完整执行语句
                db.Aop.OnLogExecuting = (sql, pars) =>
                {
                    Console.WriteLine($"【MySQL执行SQL】{sql}");
                };
                // 异常拦截
                db.Aop.OnError = ex =>
                {
                    Console.WriteLine($"SQL异常:{ex.Message}");
                };
            });
        }

        public static ISqlSugarClient Db => _db;
    }
}

三、MySQL 实体示例(适配MySQL字段规范)

MySQL字段默认小写,实体可自由映射,支持自增主键

using SqlSugar;
using System;

namespace Demo.Entity
{
    /// <summary>
    /// 用户表 user_info(MySQL下划线命名)
    /// </summary>
    [SugarTable("user_info")]
    public class UserInfo
    {
        /// <summary>
        /// 主键自增
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "id")]
        public long Id { get; set; }

        [SugarColumn(ColumnName = "user_name", Length = 50, IsNullable = false)]
        public string UserName { get; set; }

        [SugarColumn(ColumnName = "age")]
        public int Age { get; set; }

        [SugarColumn(ColumnName = "create_time")]
        public DateTime CreateTime { get; set; }
    }

    /// <summary>
    /// 订单表 order_info
    /// </summary>
    [SugarTable("order_info")]
    public class OrderInfo
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public long Id { get; set; }
        public long UserId { get; set; }
        public string OrderNo { get; set; }
        public decimal Amount { get; set; }
    }
}

四、MySQL CRUD 完整示例(LINQ语法)

using Demo;
using Demo.Entity;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo.Test
{
    public class MySqlSugarDemo
    {
        private readonly ISqlSugarClient _db = SqlSugarHelper.Db;

        public void RunAll()
        {
            AddSingle();
            AddBatchData();
            QueryData();
            PageQuery();
            UpdateDemo();
            DeleteDemo();
            JoinTableQuery();
            ExecuteNativeSql();
            TransactionTest();
        }

        #region 新增
        /// 单条新增,返回自增主键
        void AddSingle()
        {
            var user = new UserInfo
            {
                UserName = "张三",
                Age = 22,
                CreateTime = DateTime.Now
            };
            long newId = _db.Insertable(user).ExecuteReturnBigIdentity();
            Console.WriteLine($"新增用户ID:{newId}");
        }

        /// 批量插入(MySQL批量性能优秀)
        void AddBatchData()
        {
            var list = new List<UserInfo>()
            {
                new UserInfo{UserName="李四",Age=25,CreateTime=DateTime.Now},
                new UserInfo{UserName="王五",Age=28,CreateTime=DateTime.Now}
            };
            // 批量插入,自动拼接MySQL多条INSERT
            _db.Insertable(list).ExecuteCommand();
        }
        #endregion

        #region 查询
        void QueryData()
        {
            // 全部数据
            var all = _db.Queryable<UserInfo>().ToList();

            // LINQ 条件筛选
            var filterList = _db.Queryable<UserInfo>()
                .Where(u => u.Age > 18 && u.UserName.Contains("张"))
                .OrderByDescending(u => u.CreateTime)
                .ToList();

            // 单条
            var single = _db.Queryable<UserInfo>().First(u => u.Id == 1);

            // 只查询部分字段(投影)
            var dtoList = _db.Queryable<UserInfo>()
                .Select(u => new { u.Id, u.UserName, u.Age })
                .ToList();

            // 判断是否存在
            bool exist = _db.Queryable<UserInfo>().Any(u => u.Id == 1);
        }

        /// 分页查询(MySQL LIMIT 分页自动生成)
        void PageQuery()
        {
            int pageIndex = 1;
            int pageSize = 10;
            var pageData = _db.Queryable<UserInfo>()
                .Where(u => u.Age > 18)
                .ToPageList(pageIndex, pageSize, out long total);
            Console.WriteLine($"总记录数:{total}");
        }
        #endregion

        #region 修改
        void UpdateDemo()
        {
            // 方式1:根据实体主键更新
            var user = _db.Queryable<UserInfo>().First(u => u.Id == 1);
            user.Age = 30;
            _db.Updateable(user).ExecuteCommand();

            // 方式2:条件批量更新,不查询实体
            _db.Updateable<UserInfo>()
                .SetColumns(u => u.Age == 35)
                .Where(u => u.UserName == "李四")
                .ExecuteCommand();
        }
        #endregion

        #region 删除
        void DeleteDemo()
        {
            // 根据主键删除
            _db.Deleteable<UserInfo>().In(1).ExecuteCommand();

            // 条件批量删除
            _db.Deleteable<UserInfo>().Where(u => u.Age < 16).ExecuteCommand();
        }
        #endregion

        #region 联表查询
        void JoinTableQuery()
        {
            var result = _db.Queryable<UserInfo, OrderInfo>((u, o) => u.Id == o.UserId)
                .Select((u, o) => new
                {
                    u.UserName,
                    o.OrderNo,
                    o.Amount
                })
                .ToList();
        }
        #endregion

        #region 原生SQL执行MySQL语句
        void ExecuteNativeSql()
        {
            string sql = "select * from user_info where age > @age";
            var list = _db.Ado.SqlQuery<UserInfo>(sql, new { age = 18 });

            // 执行增删改原生SQL
            string updateSql = "update user_info set age=@age where id=@id";
            _db.Ado.ExecuteCommand(updateSql, new { age = 26, id = 2 });
        }
        #endregion

        #region MySQL事务
        void TransactionTest()
        {
            var db = SqlSugarHelper.Db;
            try
            {
                db.BeginTran();

                long uid = db.Insertable(new UserInfo { UserName = "小明", Age = 20, CreateTime = DateTime.Now })
                    .ExecuteReturnBigIdentity();

                db.Insertable(new OrderInfo
                {
                    UserId = uid,
                    OrderNo = "ORD20260625",
                    Amount = 99.99m
                }).ExecuteCommand();

                db.CommitTran();
                Console.WriteLine("事务提交成功");
            }
            catch (Exception ex)
            {
                db.RollbackTran();
                Console.WriteLine($"事务回滚:{ex.Message}");
            }
        }
        #endregion
    }
}

五、CodeFirst 自动创建MySQL表

无需手动执行建表语句,代码一键生成

// 单个实体建表,不存在才创建
SqlSugarHelper.Db.DbMaintenance.CreateTableByEntity<UserInfo>();

// 批量多张表
Type[] tables = { typeof(UserInfo), typeof(OrderInfo) };
SqlSugarHelper.Db.DbMaintenance.CreateTableByEntity(tables);

六、连接串常用参数说明(MySQL踩坑指南)

  1. Port=3306
    MySQL默认端口3306,修改过端口必须指定
  2. SslMode=None
    本地开发关闭SSL;服务器生产环境改为 SslMode=Required
  3. AllowLoadLocalInfile=true
    开启后支持SqlSugar大数据批量导入功能
  4. CharSet=utf8mb4
    需要存储emoji表情时追加:CharSet=utf8mb4
    完整表情兼容连接串:
Server=127.0.0.1;Port=3306;Database=test_db;Uid=root;Pwd=123456;SslMode=None;CharSet=utf8mb4;AllowLoadLocalInfile=true

七、切换数据库只改两处

  1. DbType = DbType.MySql(SQL Server是DbType.SqlServer)
  2. 替换对应数据库连接字符串
    其余CRUD LINQ代码完全不用改动,无缝切换多库。

八、和EF Core / LINQ to SQL 简单对比MySQL优势

  1. SqlSugar对MySQL语法深度适配,分页、批量、大小写、下划线映射开箱即用;
  2. 批量插入性能优于原生EF Core(不用额外安装批量扩展包);
  3. LINQ写法和老LINQ to SQL高度相似,老项目迁移成本极低;
  4. 内置分表分库、租户、软删除,政企MySQL项目使用广泛。
posted @ 2026-06-25 09:40  人生就是修炼  阅读(29)  评论(0)    收藏  举报