SQLSugar入门篇:快速上手与基础概念

news2024/11/16 9:41:56

文章目录

  • 前言
  • 一、框架简介
  • 二、环境搭建与安装
    • 1.net core和.net5/.net6/.net7/.net8/.net9环境
    • 2.net framework4.6+ 环境
  • 三、环境搭建与安装
    • 1.对象说明
    • 2.原生模式:SqlSugarClient
    • 3.单例模式:SqlSugarScope
    • 4.多库用法
    • 5.连接参数
  • 四、实体类映射
    • 1.实体使用自带特性
    • 2.实体使用自定义特性
    • 3.迁移建表
    • 4.生成实体
  • 五、基础CRUD操作
    • 1.基础查询
    • 2.基础插入
    • 3.基础更新
    • 4.基础删除
  • 六、事务管理
    • 1.单库事务
    • 2.多库事务(可跨库)


前言

    SqlSugar 是一款 老牌 .NET开源ORM框架,由果糖大数据科技团队维护和更新 ,开箱即用最易上手的ORM 。


一、框架简介

     SqlSugar 是一款 老牌 .NET开源ORM框架,由果糖大数据科技团队维护和更新 ,开箱即用最易上手的ORM

优点 :【生态丰富】【高性能】【超简单】 【功能全面】 【多库兼容】【适合产品】 【SqlSugar视频教程】
支持 :.net framework .net core3.1 .ne5 .net6 .net7 .net8 .net9
特色 :拥有全球最活跃的ORM线上论坛,比EF还要活跃,交流群人数已超过万人 ,技术支持快,口碑好。
开源 :10年开源信誉值得信赖,从不搞收费,文档也全免费(MIT开源协议)

数据库支持:
     EF Core的数据库驱动是不同公司开发,函数、建表标准不统一后期换库成本比较高
     SqlSugar花了8年多时间完善中间标准真正的多库ORM,只需要改一下DbType就完成了切换数据库
在这里插入图片描述

二、环境搭建与安装

1.net core和.net5/.net6/.net7/.net8/.net9环境

     安装SqlSugarCore
在这里插入图片描述
     安装完就可以写代码了

2.net framework4.6+ 环境

     安装SqlSugar

在这里插入图片描述

     安装完就可以写代码了

三、环境搭建与安装

1.对象说明

    我们可以通过SqlSugarClient 或者SqlSugarScope 来操作数据库 ,API都一样只是模式不同

  • SqlSugarClient 原生模式访问数据库
  • SqlSugarScope 单例模式访问数据库
    在这里插入图片描述

2.原生模式:SqlSugarClient

    SqlSugarClient 每次请求new一个新对象,db禁止跨上下文使用,IOC建议用Scope或者瞬发注入

using SqlSugar;
 
 
//创建数据库对象 (用法和EF Dappper一样通过new保证线程安全)
SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig()
{
    ConnectionString = "datasource=demo.db",
    DbType = DbType.Sqlite,
    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; }
}

    原生模式使用IOC:

    Scope我们需要用SqlSugarClient

//注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行
services.AddHttpContextAccessor();
//注册SqlSugar用AddScoped
services.AddScoped<ISqlSugarClient>(s =>
{
    //Scoped用SqlSugarClient 
    SqlSugarClient sqlSugar = new SqlSugarClient (new ConnectionConfig()
    {
        DbType = SqlSugar.DbType.Sqlite,
        ConnectionString = "DataSource=sqlsugar-dev.db",
        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) =>
       {
        
       };
   });
    return sqlSugar;
});
 
 
//用接口接收
public class(ISqlSugarClient  db)

3.单例模式:SqlSugarScope

     AddSingleton 我们需要用SqlSugarScope单例对象

//注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行
services.AddHttpContextAccessor();
//注册SqlSugar
services.AddSingleton<ISqlSugarClient>(s =>
{
    SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
    {
        DbType = SqlSugar.DbType.Sqlite,
        ConnectionString = "DataSource=sqlsugar-dev.db",
        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) =>
       {
        
       };
   });
    return sqlSugar;
});
 
//用接口接收
public class(ISqlSugarClient  db)

4.多库用法

var db = new SqlSugarClient(new List<ConnectionConfig>()
{
     new ConnectionConfig()
      {
           ConfigId="0",DbType=DbType.SqlServer,ConnectionString=..,IsAutoCloseConnection=true
      },
      
     new ConnectionConfig()
     {
          ConfigId="1",DbType=DbType.MySql,ConnectionString=..,IsAutoCloseConnection=true 
     }
});
var childA=db.GetConnection("A");
var childB=db.GetConnection("B");

5.连接参数

     SqlSugarClient是通过ConnectionConfig进行传参数详细参数如下
在这里插入图片描述

四、实体类映射

1.实体使用自带特性

[SugarTable("dbstudent")]//当和数据库名称不一样可以设置表别名 指定表明
public class Student
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//数据库是自增才配自增 
    public int Id { get; set; }
    public int? SchoolId { get; set; }
    [SugarColumn(ColumnName ="StudentName")]//数据库与实体不一样设置列名 
    public string Name { get; set; }
}

2.实体使用自定义特性

SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
    ConnectionString = Config.ConnectionString,
    DbType = DbType.SqlServer,
    IsAutoCloseConnection = true,
    ConfigureExternalServices = new ConfigureExternalServices()
    {
        EntityService = (property, column) =>
        {
            var attributes = property.GetCustomAttributes(true);//get all attributes 
 
            if (attributes.Any(it => it is KeyAttribute))// by attribute set primarykey
            {
                column.IsPrimarykey = true; //有哪些特性可以看 1.2 特性明细
            }
            //可以写多个,这边可以断点调试
            // if (attributes.Any(it => it is NotMappedAttribute))
            //{
                //    column.IsIgnore= true; 
             //}
        },
        EntityNameService = (type, entity) =>
        {
            var attributes = type.GetCustomAttributes(true);
            if (attributes.Any(it => it is TableAttribute))
            {
              var attr=(attributes.First(it=>it is TableAttribute) as TableAttribute);
              entity.DbTableName = attr.Name;
            }
        }
    }
});
 
[Table("student")]
//[SugarTable("student")]
public class MyStudent
{
 
    [Key]
    //[SugarColumn(IsPrimaryKey =true)]
    public string Id { get; set; }
    public string Name { get; set; }
}

3.迁移建表

public class CodeFirstTable1
{
        [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]
        public int Id { get; set; } 
        public string Name { get; set; }
        //ColumnDataType 一般用于单个库数据库,如果多库不建议用
        [SugarColumn(ColumnDataType = "Nvarchar(255)")]
        public string Text { get; set; }
        [SugarColumn(IsNullable = true)]//可以为NULL
        public DateTime CreateTime { get; set; }
}
  
//建表
db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(CodeFirstTable1));

4.生成实体

//.net6以下
db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\1", "Models");
  
//.net6以上 string加?
db.DbFirst.IsCreateAttribute().StringNullable().CreateClassFile("c:\\Demo\\1", "Models");

五、基础CRUD操作

1.基础查询

查所有

List<Student> list=db.Queryable<Student>().ToList()
//select * from Student

查询总数

int count=db.Queryable<Student>().Count()
//select count(1) from Student

按条件查询

db.Queryable<Student>().Where(it=>it.Id==1).ToList()
//select * from Student where id=1

2.基础插入

//返回插入行数
db.Insertable(insertObj).ExecuteCommand(); //都是参数化实现
//异步: await db.Insertable(insertObj).ExecuteCommandAsync()
 
//插入返回自增列 (实体除ORACLE外实体要配置自增,Oracle需要配置序列)
db.Insertable(insertObj).ExecuteReturnIdentity();
//异步: await db.Insertable(insertObj).ExecuteReturnIdentityAsync();

3.基础更新

//根据主键更新单条 参数 Class
var result= db.Updateable(updateObj).ExecuteCommand();//实体有多少列更新多少列

4.基础删除

//单个实体
db.Deleteable<Student>(new Student() { Id = 1 }).ExecuteCommand();

六、事务管理

1.单库事务

     单库事务是针一个db操作执行的事务,无论是 ISqlSugarClient和 SqlSugarClient 用法都一样

try
    {
        db.Ado.BeginTran();
        db.Insertable(new Order() { .....}).ExecuteCommand();
        db.Insertable(new Order() { .....}).ExecuteCommand();
        db.Ado.CommitTran();
    }
    catch (Exception ex)
    {
        db.Ado.RollbackTran();
        throw ex;
    }

2.多库事务(可跨库)

    多数据库事务是SqlSugar独有的功能,稳定比CAP更强(CAP还有一层队列),在单个程序中可以很愉快的使用多库事务

     SqlSugarClient或者SqlSugarSope 继承于2个接口 ,代码如下事务

SqlSugarClient : ISqlSugarClient, ITenant

     多租户声明

SqlSugarClient db = new SqlSugarClient(new List<ConnectionConfig>()
{
  new ConnectionConfig()
  { ConfigId="0", DbType=DbType.SqlServer,ConnectionString=..,IsAutoCloseConnection=true},
   
  new ConnectionConfig()
  { ConfigId="1", DbType=DbType.MySql,ConnectionString=..,IsAutoCloseConnection=true}
});

     简单的说多租户事务和单库事务用法基本100%一致,唯一区别就是少了.Ado

db.Ado.BeginTran//单库
 db.BeginTran //多库事务
 db.AsTenant().BeginTran()//多库事务 一般是接口ISqlSugarClient使用

SqlSugarClient事务

     因为继承 ITenant 了可以直接使用 (老版本var mysql=db.GetConnection要写在事务外面)

db.Ado.BeginTran//单库
 db.BeginTran //多库事务
 db.AsTenant().BeginTran()//多库事务 一般是接口ISqlSugarClient使用

“笑对人生,智慧同行!博客新文出炉,微信订阅号更新更实时,等你笑纳~”
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据技术之Flume事务及内部原理(3)

目录 Flume Agent 架构概述 Flume Agent 内部工作流程 Flume Agent 的配置 Flume Agent内部重要组件 ChannelSelector SinkProcessor Apache Flume 是一个分布式的、可靠的、可用的服务&#xff0c;用于有效地收集、聚合和移动大量日志数据。它具有简单灵活的架构&#x…

C语言典型例题51

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题4.3 while循环与do……while循环的比较 代码&#xff1a; &#xff08;1&#xff09;while语句 #include <stdio.h> int main() {int sum0;// char ch;while(1){sum0;//每一次输入结束后数的和重置int …

31套科技风PPT免费分享

目录 部分展示 部分展示 #PPT下载 「科技风模板」链接&#xff1a;https://pan.quark.cn/s/fb2f39a1d343 链接永久有效&#xff0c;点击这里下载&#xff0c;记得给个赞哦

odoo17 Field 没有invisible属性?

odoo17 Field dmszhzh.zzfile.save_type 没有invisible属性 错误提示如下&#xff1a; WARNING sd0003 odoo.fields: Field dmszhzh.zzfile.save_type: unknown parameter invisible, if this is an actual parameter you may want to override the method _valid_field_par…

MSSQL 工具注入(第一关)

简介 SQL注入是一种安全漏洞&#xff0c;通过它可以执行意外的SQL命令或访问数据库中的信息。MSSQL注入通常发生在应用程序将用户输入作为SQL查询的一部分执行时&#xff0c;而没有对输入进行适当的验证或清理。 以下是MSSQL手工注入的流程&#xff1a; 一、打开靶场选择第一关…

Kafka的生产者和消费者机制

目录 1.基础的客户端 1.1消息发送者的主流程 1.2消息消费者主流程 2.客户端工作机制 2.1消费者分组消费机制 2.2生产者拦截器机制 2.3消息序列化机制 2.4消息分区路由机制 2.5生产者消息缓存机制 2.6发送应答机制 2.7生产者消息幂等性 (1)生产者消息幂等性介绍 (2…

浅谈【数据结构】链表之单链表

目录 1、什么是数据&#xff1f; 2、什么是结构 3、什么是数据结构&#xff1f; 4、线性结构(线性表&#xff09; 4.1线性表的物理结构的实现 5、链表 5.1无头结点的单链表 5.2新内容、老面孔 5.3数组和链表的优缺点 5.4链表的概念 5.5链表的创建步骤 5.5.1创建过程…

【Linux】自动化构建工具makefile

目录 背景 makefile简单编写 .PHONY makefile中常用选项 makefile的自动推导 背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力 ​ ◉ 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…

MyBatis框架搭建与代码解读

前言: MyBatis是一个灵活的持久层框架&#xff0c;适合与数据库交互&#xff0c;支持自定义SQL和高级映射。搭建MyBatis的基本步骤包括&#xff1a; 环境准备&#xff1a;安装JDK、Maven和IDE。创建项目&#xff1a;建立Maven项目并设置基本信息。添加依赖&#xff1a;在pom.…

「Python数据分析」Pandas进阶,利用concat()函数连接数据(一)

在我们迈向中高级出局数据分析的过程中&#xff0c;数据的合并和连接&#xff0c;是一个非常重要的技能。 现实中&#xff0c;分散在各种数据库&#xff0c;各种数据表格&#xff0c;各种数据存储设备当中的&#xff0c;各式各样的数据&#xff0c;是我们进行数据分析的基础&a…

泛微开发修炼之旅--42Ecology大日志查看软件LogView Pro及教程

我们在项目上经常要看ecology的日志信息&#xff0c;当日志达到几百兆或者时几个G的时候&#xff0c;想要查看日志并且非常方便搜索日志中的信息&#xff0c;并不容易。 今天给大家大日志工具和教程&#xff0c;在附件中&#xff0c;各位自取吧&#xff01; 文章链接&#xff…

老师如何制作分班查询系统?

随着新学期的钟声敲响&#xff0c;老师们又迎来了一年中最忙碌的时期。不仅要处理日常的教学准备工作&#xff0c;还要面对一项重要而繁琐的任务——新生分班。分班完成后&#xff0c;老师们还需要将分班结果及时准确地通知给每一位家长&#xff0c;确保信息的传递无误。这项工…

epoll+线程池模型

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 负载均衡技术 …

AI工具 GPT 学术优化 (GPT Academic) 安装实践

GPT 学术优化 (GPT Academic)是一个综合的AI GPT工具包&#xff0c;可以完成各种gpt辅助的工作&#xff0c;比如代码解读、翻译、读论文等功能。官网&#xff1a;GitHub - binary-husky/gpt_academic: 为GPT/GLM等LLM大语言模型提供实用化交互接口&#xff0c;特别优化论文阅读…

Flutter 自动化测试 -appium-flutter-driver

上篇文章有讲述如何通过FlutterDriver实现集成测试Flutter 应用自动化测试-集成测试篇 不熟悉的小伙伴可以先去看看。 什么是Appium Flutter Driver&#xff1f; 作为Flutter开发&#xff0c;FlutterDriver是足够帮助他们进行测试的&#xff0c;而作为自动化测试工程师最大的困…

FFmpeg的入门实践系列五(编程入门之属性查看)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力 文章目录 前期博客参考书籍一、AVFormatContext结构体1. 结构定义2. 字段说明3.示例1&#xff08;打开与关闭音视频文件&#xff0…

机器人学——机械臂轨迹规划-1

引言 理想轨迹 步骤-1 步骤-2 笛卡尔空间下的轨迹规划 步骤-1 步骤-2 三次多项式 矩阵形式求解 det(T): 行列式&#xff0c;非齐次多项式&#xff0c;结果不为零&#xff0c;有唯一解、行列式为零&#xff08;无穷解/无解&#xff0c;还需查看增广矩阵的秩&#xff09; 速度…

Linux网络编程:多路转接--select

1. 初识select 系统提供select函数来实现多路复用输入/输出模型. select系统调用是用来让我们的程序监视多个文件描述符的状态变化的; 程序会停在select这里等待&#xff0c;直到被监视的文件描述符有一个或多个发生了状态改变 select只负责等待&#xff0c;可以等待多个fd&a…

内容创作者福音,4款文章改写神器轻松提升文章质量

在信息爆炸的时代&#xff0c;内容创作成为了连接世界的重要桥梁。作为一名专业创作者&#xff0c;我深知保持内容原创性和高质量的重要性。然而&#xff0c;灵感有时会枯竭&#xff0c;改写文章成为一项耗时且艰巨的任务。幸运的是&#xff0c;市面上有一些文章改写神器&#…

Flask+LayUI开发手记(四):弹出层实现增删改查功能

在上一节用dataTable实现数据列表时&#xff0c;已经加了表头工具栏和表内工具栏&#xff0c;栏内的按钮功能都是用来完成数据的增删改查了&#xff0c;这又分成两类功能&#xff0c;一类是删除或设置&#xff0c;这类功能简单&#xff0c;只需要选定记录&#xff0c;然后提交到…