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要改成单例不然会有内存增加风险
 

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 偶发错误

2.3 原理

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");
 
连接参数
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
};
 

SqlSugar入门的更多相关文章

  1. sqlsugar入门(4)-修改源码支持多主键保存ISaveable

    1.查看其它接口发现少了一个最重要的SaveBuilder.此文件是存放sql模板,where条件,select解析,组装成tosqlstring的最后一个类. 添加文件 using System; ...

  2. sqlsugar入门(3)-DateTime.ToString("yyyy-MM-dd HH:mm:ss.fff")源码修改

    1.注释SqlSugar\ExpressionsToSql\ResolveItems\MethodCallExpressionResolve文件下的GetMethodValue方法 case &quo ...

  3. sqlsugar入门(1)-初识sugar正确打开sugar的方式

    1.实例化DB public static SqlSugarClient GetDB(string s) { var ssc = new SqlSugarClient(new ConnectionCo ...

  4. sqlsugar入门(2)-C#方法与sugar自定义函数的区别

    1.使用tostring获取当天数据 var list = ssc.Queryable<Student>().Where(o => o.CreateTime.Value.ToStri ...

  5. SqlSugar ORM 入门到精通【一】入门篇

    背景 SqlSugar是一款国产ORM,除了拥有媲美原生的性能 另外还有满足各种需求的功能,简单好用一分钟就能够轻松上手. 2.x版本正式在自已公司内部项目使用 3.x版本得到了更多公司的喜欢不过也会 ...

  6. SqlSugar ORM 入门篇2 【查询】 让我们实现零SQL

    SqlSugar在查询的功能是非常强大的,多表查询.分页查询 . 一对一查询.二级缓存.一对多查.WhenCase等复杂函数.Mapper功能.和拉姆达自定义扩展等,用好了是可以做到真正零SQL的一款 ...

  7. sqlSugar的使用---入门

    一,新建.net core  web项目 二.  项目引入包:sqlSugarCore 三.创建两个表:user,   department 四. 新建model(不一定需要与table相同,使用[S ...

  8. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](八)

    前言 Hi, 大家好,还是星期五,还是Rector,又在图享网准时和大家见面了. 今天给大家带来系列教程<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Auto ...

  9. ASP.Net Core 2.2 MVC入门到基本使用系列 (二)

    本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...

  10. .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块

    .Net Core ORM选择之路,哪个才适合你   因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...

随机推荐

  1. byte[] 数组,创建的时候赋初始值

    C# //创建一个长度为10的byte数组,并且其中每个byte的值为0x08. byte[] myByteArray = Enumerable.Repeat((byte)0x08, 10).ToAr ...

  2. CompletableFuture 使用

    Future的局限性,它没法直接对多个任务进行链式.组合等处理,而CompletableFuture是对Future的扩展和增强.CompletableFuture实现了Future接口,并在此基础上 ...

  3. Python中字符前添加r,b,u,f前缀的含义

    1.在python字符串前添加r,意思为消除转义字符 2.在python字符串前添加f,意思为支持大括号内的python 表达式. 3.在python字符串前添加b,意思为字符串类型为byte类型,在 ...

  4. xv6book阅读 chapter1

    xv6book主要研究了xv6如何实现它的类Unix接口,但是其思想和概念不仅仅适用于Unix.任何操作系统都必须将进程多路复用到底层硬件上,相互隔离进程,并提供受控制的进程间通信机制. 1 了解xv ...

  5. 一个神奇的Python库:Evidently,机器学习必备

    Evidently 是一个面向数据科学家和机器学习工程师的开源 Python 库.它有助于评估.测试和监控从验证到生产的数据和 ML 模型.它适用于表格.文本数据和嵌入. 简介 Evidently 是 ...

  6. 用Python自动清理系统垃圾,再也不用360安全卫士了

    用Python自动清理系统垃圾,再也不用360安全卫士了 在Windows在安装和使用过程中都会产生相当多的垃圾文件,包括临时文件(如:.tmp.._mp)日志文件(.log).临时帮助文件(.gid ...

  7. Centos7 cmake版本升级(v2.8.12.2->v3.16.6)

    1. 查看当前cmake版本 [root@localhost ~]# cmake -version cmake version 2.8.12.2 2. 进行卸载 [root@localhost ~]# ...

  8. Java Kafka 消费积压监控

    Java Kafka 消费积压监控 后端代码: Monitor.java代码: package com.suncreate.kafkaConsumerMonitor.service; import c ...

  9. 航拍倾斜摄影 Web 3D GIS 数字孪生智慧火电厂

    前言 7 月份,245 个国家气象站日最高气温突破 7 月历史极值:同时,疫情防控形势向好,企业加快复工达产节奏,电力负荷屡创新高.煤电作为我国最主要的电源,用不足 50% 的装机占比,生产了全国约 ...

  10. C# 几种常见数据结构(数组、链表、Hash表)

    一.内存上连续存储,节约空间,可以索引访问,读取快,增删慢 Array: 在内存上连续分配的,而且元素类型是一样的,可以坐标访问;读取快--增删慢,长度不变 { //Array:在内存上连续分配的,而 ...