首页 > 数据库 >SqlSugar入门

SqlSugar入门

时间:2024-01-16 14:57:42浏览次数:28  
标签:入门 text type nodes data id SqlSugar name

SqlSugar入门

创建对象

你可以使用 SqlSugarClient (new模式)或者 SqlSugarScope (单例) 对数据库进行增、删、查、改等功能 注意:除了名字和使用模式不同,功能和API都一模一样
SqlSugarClient(new模式) 优点:性能比SqlSugarScope有5%左右提升 缺点: db不能跨上下文使用,需要new出一个新对象(EF和Dapper一样), 偶发错误难排查适合有经验用户  模式:不能单例,因为他不是线程安全对象
SqlSugarScope (单例模式) 5.0.3.4 特色功能   如果没有.NET 开发经验的推荐使用 SqlSugarScope能够解决大部分线程安全问题。  原理是用的AsyncLocal异步上下文的不同来实现的线程安全。   注意:同一个异步上下文进行并发操作AsyncLocal也不能保证线程安, 下面3种情况  1.第三方Job  (必须将db改成db.CopyNew())  2.Task.WhenAll  、ForAsync 、ParallelAsync (必须将db改成db.CopyNew())  3. 异步漏写await 或者 方法不是Task类型或者Func(Void(方法) Action(表达式) (推荐修改错误代码 , 如果就是不想修改也是可以db.CopyNew()解决)    模式: 单例模式   SqlSugarScope一直new会内存泄露 一定要用单例  
 

1、Scope模式:SqlSugarClient  

注意非单例模式用的是SqlSugarClient , 禁止用SqlSugarScope

1.1 完整用例

SqlSugarClient 每次请求new一个新对象,db禁止跨上下文使用,IOC建议用Scope或者瞬发注入
    //查询所有
    public static void Demo()
    {
    
     //创建数据库对象 (用法和EF Dappper一样通过new保证线程安全)
     SqlSugarClient Db= new SqlSugarClient(new ConnectionConfig(){
           ConnectionString = "连接符字串", 
           DbType = DbType.SqlServer,
           IsAutoCloseConnection = true},
           db=>{
                 //5.1.3.24统一了语法和SqlSugarScope一样,老版本AOP可以写外面
                 
                  db.Aop.OnLogExecuting = (sql, pars) =>
                  {
                    Console.WriteLine(sql);//输出sql,查看执行sql 性能无影响
                    
                    
                    //获取原生SQL推荐 5.1.4.63  性能OK
                     Console.WriteLine(UtilMethods.GetNativeSql(sql,pars))
                               
                    //获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用
                    //UtilMethods.GetSqlString(DbType.SqlServer,sql,pars)
                     
                    
                   };
                   
                   //注意多租户 有几个设置几个
                   //db.GetConnection(i).Aop
           
           });
     
     //建表
     //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; }
     }

1.2 偶发错误

 SqlSugarClient 出现偶发错误全部换成SqlSugarScope进行测试,如果换了不报错了那么证明就是 线程安全问题,你也可以直接使用SqlSugarScope因为他是线程安全的 ,用SqlSugarScope要改成单例不然会有内存增加风险 详情:https://www.donet5.com/Home/Doc?typeId=1224  

1.3  AddScope 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对象不要求在一个上下文
      //vra 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)
 

2、单例模式:SqlSugarScope 

2.1 完整用例

SqlSugarScope 请使用单例模式,配置参数有2种周期 (A):全局生效 (B):   当前上下文生效
 public  class  SqlSugarHelper //不能是泛型类
 {
 
    //多库情况下使用说明:
    //如果是固定多库可以传 new SqlSugarScope(List<ConnectionConfig>,db=>{}) 文档:多租户
    //如果是不固定多库 可以看文档Saas分库
     
     
   //用单例模式
    public static SqlSugarScope Db= new SqlSugarScope(new ConnectionConfig()
   {
            ConnectionString = "Server=.xxxxx",//连接符字串
            DbType = DbType.SqlServer,//数据库类型
            IsAutoCloseConnection = true //不设成true要手动close
   },
  db=> {
         //(A)全局生效配置点,一般AOP和程序启动的配置扔这里面 ,所有上下文生效
         //调试SQL事件,可以删掉
         db.Aop.OnLogExecuting = (sql, pars) =>
         {
          Console.WriteLine(sql);//输出sql,查看执行sql 性能无影响
          
           //获取原生SQL推荐 5.1.4.63  性能OK
           //UtilMethods.GetNativeSql(sql,pars)
                               
           //获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用
           //UtilMethods.GetSqlString(DbType.SqlServer,sql,pars)
                    
         };
         
         //多个配置就写下面
         //db.Ado.IsDisableMasterSlaveSeparation=true;
         
          //注意多租户 有几个设置几个
          //db.GetConnection(i).Aop
     });
   }
   //(B)当前上下文生效配置点,一般多租户相关操作写在这儿 
   //db.GetConnectionxxx 只在当前上下文有效,不会共享
   //如果是程序启动时的配置全部到A里面去
  
   //建表
  //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 Student
   {
     //数据是自增需要加上IsIdentity 
     //数据库是主键需要加上IsPrimaryKey 
     //注意:要完全和数据库一致2个属性
     [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
     public int Id { get; set; }
     public int? SchoolId { get; set; }
     public string Name { get; set; }
   }
验证单例是否成功: SqlSugarHelper.Db.HasCode();//只要看这个hascode在服务启动后都一个那么说明成功了 //IOC直接复制我的DEMO就不需要验证

2.2 偶发错误 

详情:https://www.donet5.com/Home/Doc?typeId=1224

2.3 原理

https://www.donet5.com/Home/Doc?typeId=2352

2.4  AddSingleton IOC

//注册上下文: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对象不要求在一个上下文
      //vra 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)
 

多库用法 

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");
详细教程:https://www.donet5.com/Home/Doc?typeId=2246   连接参数 SqlSugarClient是通过ConnectionConfig进行传参数详细参数如下
名称 描述 必填
DbType 数据库类型
ConnectionString 连接字符串
IsAutoCloseConnection 自动释放和关闭数据库连接,如果有事务事务结束时关闭,否则每次操作后关闭  
ConfigureExternalServices 一些扩展层务的集成  
MoreSettings
  • 点击查看
 
SlaveConnectionConfigs 主从设置  
LanguageType 提示错误可以设置语言  
  设置超时 设置超时时间
//Sql超时
db.Ado.CommandTimeOut = 30;//单位秒

//db.Open 连接超时
//在连接池符串加上 Connection Timeout=10  ,默认是30秒,单位秒
    验证连接是否成功(数据库连接成功) 版本要求:5.0.6.5 preview05 +
db.Ado.IsValidConnection()  //如果时间长,可以在连接字符串配置 连接超时时间

//上面写法如果写到事务中会影响事务
//事务中我会可以new一个新对象处理
 db.CopyNew().Ado.IsValidConnection()
 // 数据库连接成功
 

打印SQL 

单库sql打印

 
 
  SqlSugarClient Db= new SqlSugarClient(new ConnectionConfig(){
           ConnectionString = "连接符字串", 
           DbType = DbType.SqlServer,
           IsAutoCloseConnection = true},
           db=>{
                 //5.1.3.24统一了语法和SqlSugarScope一样,老版本AOP可以写外面
                 db.Aop.OnLogExecuting = (sql, pars) =>
                 {
                     Console.WriteLine(sql);//输出sql,查看执行sql 性能无影响
                           
                     //获取原生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=>{}委托写在下面一行就行了

多库设置SQL

打印和上面有区别,需要一个一个设置
//注意: 
//如果你用的 GetConnectionScope或者 GetConnectionScopeWithAttr AOP也应该用 GetConnectionScope 
//如果你用的 GetConnection或者 GetConnectionWithAttr AOP也应该用 GetConnectionScope 


  SqlSugarClient Db= new SqlSugarClient(new ConnectionConfig(){
           ConnectionString = "连接符字串", 
           DbType = DbType.SqlServer,
           IsAutoCloseConnection = true},
           db=>{  
                    //也可以这里面循环
                   db.GetConnection("1").Aop.OnLogExecuting = (sql, pars) =>
                   {
                     Console.WriteLine("执行1库"+sql);
                   };
                   db.GetConnection("0").Aop.OnLogExecuting = (sql, pars) =>
                   {
                      Console.WriteLine("执行0库"+sql);
                   };
 
  });
 

国际化

错误提示可以设置相应的语言

1.枚举说明

    public enum LanguageType
    {
        Default=0, //中&英
        Chinese=1, //处理过的异常尽量中文,未处理的还是英文
        English=2 //全部英文
    }

2.用例 

  SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
  {
                ConnectionString = Config.ConnectionString,
                DbType = DbType.SqlServer,
                LanguageType=LanguageType.English,//只显示英文
                IsAutoCloseConnection = true 
   });
 

长连接用法(3种方式)

1.事务中是长连接

2.手动释放模式是长连接(不推荐需要手动释放)

3.自动释放中 不使用事务我们可以用OpenAlways实现长连接

 //5.0.6.3
 using (db.Ado.OpenAlways()) {
    
     db.Queryable...
     db.Insertable...
     //比如当前会话生效的临时表就需要长连接,不然创建了访问不了
            
 }
 

配置最小时间

新功能:5.0.8.1 推荐用默认的,这样多种数据库使用不报错,当然你也可以强制设置
 db.CurrentConnectionConfig.MoreSettings = new ConnMoreSettings
 {
        DbMinDate = DateTime.MinValue//默认最小时间是 1900-01-01 00:00:00.000 
 };
 

标签:入门,text,type,nodes,data,id,SqlSugar,name
From: https://www.cnblogs.com/yswenli/p/17967640

相关文章

  • jmeter入门:数据库压力测试全解析
    一.下载安装下载地址https://jmeter.apache.org/download_jmeter.cgi解压,打开apache-jmeter-5.2.1\binjmeter.bat即可。 二.配置jmeter1.添加线程组其中参数为:线程数:相当为50个用户ramp-up:每秒增加的线程数0相当于并发循环次数:emmm....2.配置jdbc以下选项需......
  • C语言入门-printf库函数
    printf()库函数调用格式:printf("<格式化字符串>",<参量表>);声明intprintf(constchar*format,...)参数格式字符意义a,A以十六进制形式输出浮点数(C99新增)。实例printf("pi=%a\n",3.14);输出pi=0x1.91eb86p+1。d以十进制形式输出带符号整数(正数不......
  • PyTorch深度学习零基础入门
    在人工智能时代,机器学习技术日新月异,深度学习是机器学习领域中一个全新的研究方向和应用热点,它是机器学习的一种,也是实现人工智能的必由之路。深度学习的出现不仅推动了机器学习的发展,还促进了人工智能技术的革新。PyTorch作为深度学习的重要框架,近年来备受读者喜爱,自推出后得到了......
  • vue入门页面,搭建localhost官方默认页面
    按照提示操作可以做出下图效果:idea中的vue目录层级为:1.下载node.js(nodes.js是前端的运行环境,类似于后端中的jdk,没有node.js后续操作无法进行,具体流程百度)2.新建文件夹(这个文件夹就是你之后vue的目录)点进去新建的文件夹3.输入cmd回车4.输入命令:npmconfigsetreistryht......
  • 数学建模入门笔记(1)——Python pulp库解线性规划问题
    参考:Python求解线性规划——PuLP使用教程-Only(AR)-博客园(cnblogs.com)1.Definethemodelmodel=pl.LpProblem(name="",sense=pl.LpMaximize)name模型的名字sense模型的类型(pl.LpMaximize/pl.LpMinimize)2.Definethedecisionvariables用x[i]存储变量,命名为xi......
  • RPA是啥?是干嘛的?如何入门开始使用?
    1、RPA是啥?我们先对RPA有一个大概的了解,再循序渐进。RoboticProcessAutomation(机器人流程自动化,简称RPA)。我的简单理解就是自动化,类似于按键精灵,相对来说比按键精灵功能更多,可操作性也更强一点。官方文档:https://documents.laiye.com/rpa-guide/docs/2、是干嘛的?比如你想......
  • Istio从入门到精通—— 安装 —— 使用 Istio Operator 安装
    使用IstioOperator安装https://istio.io/latest/zh/docs/setup/install/operator/全新安装Istio时不鼓励使用Operator,请优先使用Istioctl和Helm安装方法。Operator仍然会得到维护,但新的功能请求可能不会优先考虑。除了手动在生产环境中安装、升级、和卸载Istio,......
  • SpringBoot中整合ElasticSearch快速入门以及踩坑记录
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662参考上面搭建项目。ElaticSearchElasticsearch是java开发的,基于Lucene的搜索引擎。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulW......
  • 【Vue2+3入门到实战】(18)VUE之Vuex状态管理器概述、VueX的安装、核心概念 State状态代
    目录一、[Vuex](https://vuex.vuejs.org/zh/)概述1.是什么2.使用场景3.优势4.注意:二、需求:多组件共享数据1.创建项目2.创建三个组件,目录如下3.源代码如下三、vuex的使用-创建仓库1.安装vuex2.新建`store/index.js`专门存放vuex3.创建仓库`store/index.js`4在main.j......
  • kettle从入门到精通 第三十课 mysql 数据连接常用配置
    1、我们平常用的最多的数据库就是mysql了,这里我以mysql为例说下数据库连接池配置。为啥要用连接池,因为数据库建立连接很费性能,所以就建立连接池(提前建立好一批连接)缓存起来提高性能。下图中mysql的设置参数,提前是需要把mysql的jar(如mysql-connector-java-8.0.20.jar)放到kettle文......