SqlSugar介绍及应用场景及常用操作

时间:2024-07-18 14:19:26
  1. SqlSugar介绍及应用场景

1.  真正可以实现零SQL的ORM 建表、索引和CRUD全部支持

2.  支持 .NET 百万级大数据写入、更新、分表和拥有几十亿查询统计成熟解决方案

3.  支持 SAAS 完整应用 :跨库查询 、审计、租户分库 、租户分表 和 租户数据隔离

4.  支持低代码+工作流  (动态建类 、动态建表、无实体多库兼容CRUD 、 JSON TO SQL 、自定义XML等)

5.  支持ValueObject、鉴别器、仓储、UnitOfWork、DbContext、AOP 

6.  支持 DbFirst、CodeFirst和WebFirst 3种模式开发

7.  简单易用、功能齐全、高性能、轻量级、服务齐全、官网教程文档、有专业技术支持一天18小时服务

8.  完美支持AOT:多种数据库

SqlSugar是一款专为.NET平台设计的轻量级ORM(对象关系映射)框架,由果糖大数据科技团队维护和更新。它提供了一种无缝的桥梁,将业务逻辑与数据库交互连接起来,使得开发者无需编写大量繁琐的SQL语句,即可完成数据的CRUD(创建、读取、更新和删除)操作。以下是对SqlSugar的详细介绍及其应用场景:

SqlSugar介绍

  1. 功能特点
    • 高性能:在大数据量的插入和查询操作中,SqlSugar的性能明显优于其他ORM框架。它优化了SQL生成策略,并在底层对数据库操作进行了精细优化。
    • 高扩展性:支持自定义Lamada函数解析、扩展数据类型、支持自定义实体特性、外部缓存等,满足复杂和定制化的需求。
    • 多数据库支持:全面支持包括MySqlSqlServerSqliteOracle在内的多个数据库,并且对国内常见的国产数据库如达梦、人大金仓等也提供良好支持。
    • 动态SQL生成:根据查询条件自动构建高效的SQL语句,避免手写SQL的麻烦。
    • 代码生成器:内置的代码生成工具可以自动生成基于数据库表的实体类和DAL(数据访问层),节省开发时间。
    • 事务管理:提供简便的事务控制,确保多条操作可以在一个原子性、一致性、隔离性和持久性的事务中执行。
    • 缓存机制:支持二级缓存,可以显著提高应用性能。
    • LINQ查询支持:利用C#LINQ功能,可以写出更符合编程习惯的查询代码。
  2. 优点
    • 简单易用:简洁明了的API设计,学习成本低,易于上手。
    • 功能全面:虽然SqlSugar小巧,但其功能并不逊色于其他ORM框架。
    • 持续更新:框架持续迭代和更新,保持对新技术的支持和兼容。
    • 社区活跃:拥有活跃的开发者社区,问题响应及时,用户支持良好。

应用场景

SqlSugar适用于各种类型的应用场景,包括但不限于:

  1. Web开发:在构建Web应用时,SqlSugar可以帮助开发者快速完成数据库操作,提高开发效率。无论是电商网站中的订单管理、用户行为记录还是报表生成,SqlSugar都能提供强大的支持。
  2. 桌面应用:对于需要频繁与数据库交互的桌面应用,SqlSugar的高性能和低耦合性使得开发更加高效。
  3. 移动服务端:在构建移动应用的服务端时,SqlSugar可以简化数据库操作,使开发者更专注于业务逻辑的实现。
  4. 数据密集型应用:对于需要处理大数据量或进行实时数据分析的应用,SqlSugar的高性能和扩展性能够满足其需求。
  5. 快速原型开发:在快速搭建数据库相关功能时,SqlSugar的代码生成器和动态SQL生成功能可以显著节省开发时间。
  6. 维护现有系统:在已有项目中,如果当前的数据库访问层存在低效或不完善的问题,可以考虑使用SqlSugar进行替换,以提升系统性能和可维护性。

综上所述,SqlSugar凭借其高性能、高扩展性、多数据库支持以及简单易用的特点,在.NET开发领域具有广泛的应用前景。

  1. SqlSugar连接多个数据库

 //---------------------多库操作------------------------------

//主db

var db = new SqlSugarClient(new List<ConnectionConfig>()

    {

     new ConnectionConfig(){ConfigId="A",DbType=SqlSugar.DbType.SqlServer,ConnectionString="Database=netcoredev;Server=.;Integrated Security=false;User ID=sa;Password=1;",IsAutoCloseConnection=true},

     new ConnectionConfig(){ConfigId="B",DbType=SqlSugar.DbType.SqlServer,ConnectionString="Database=netcoredevtest1;Server=.;Integrated Security=false;User ID=sa;Password=1;",IsAutoCloseConnection=true  },

     new ConnectionConfig(){ConfigId="C",DbType=SqlSugar.DbType.SqlServer,ConnectionString="Database=netcoredevtest2;Server=.;Integrated Security=false;User ID=sa;Password=1;",IsAutoCloseConnection=true  }

    });

          

          

//获取子Db

var childA = db.GetConnection("A");

var childB = db.GetConnection("B");

var childC = db.GetConnectionScope("C");//线程安全

         

//使用子Db用

var lsA = childA.Queryable<Sys_Log>().ToList();

var lsB = childB.Queryable<Sys_Log>().ToList();

var lsC = childC.Queryable<Sys_Log>().ToList();

//-----------------------------多库事务----------------------------

childA.CodeFirst.InitTables<Order>();

childB.CodeFirst.InitTables<Order>();

childC.CodeFirst.InitTables<Order>();

// 开启事务

try

{

    db.BeginTran(); //不能是db.Ado.BeginTran

    db.GetConnection("A").Insertable(new Order()

    {

        Id = 1,

        CreateTime = DateTime.Now,

        CustomId = 1,

        Name = "a",

        Price = 1

    }).ExecuteCommand();

    db.GetConnection("B").Insertable(new Order()

    {  

        Id = 2,

        CreateTime = DateTime.Now,

        CustomId = 1,

        Name = "a",

        Price = 1

    }).ExecuteCommand();

    db.GetConnection("C").Insertable(new Order()

    {

        Id = 55,

        CreateTime = DateTime.Now,

        CustomId = 1,

        Name = "a",

        Price = 1

    }).ExecuteCommand();

    //提交事务

    db.CommitTran(); //不能是db.ado.CommitTran

}

catch (Exception ex)

{

    //回滚事务

    db.RollbackTran();

}

  1. SqlSugar连接单个数据库实现增删改查

  public static void opCURD()

 {

     //创建数据库对象 (用法和EF Dappper一样通过new保证线程安全)

     SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig()

     {

         ConnectionString = "Data Source=.;Initial Catalog=netcoredev;Persist Security Info=True;User ID=sa;Password=1;Connect Timeout=500;",

         DbType = DbType.SqlServer,

         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();

     Console.WriteLine("恭喜你已经入门了,后面只需要用到什么查文档就可以了。");

     Console.ReadKey();

 }

  1. SqlSugar批量操作

 海量数据操作ORM性能瓶颈在实体转换上面,并且不能使用常规的Sql去实现

列越多转换越慢SqlSugar将转换性能做到极致,并且采用数据库最佳API

操作数据库达到极限性能  

1.1 BulkCopy

大数据插入

db.Fastest<Order>().BulkCopy(lstData);//插入

db.Fastest<Order>().PageSize(100000).BulkCopy(insertObjs);

db.Fastest<System.Data.DataTable>().AS("order").BulkCopy(dataTable);

//使用Winfom需要看标题2

1.2 BulkUpdate

大数据更新

db.Fastest<Order>().BulkUpdate(GetList())//更新

db.Fastest<Order>().PageSize(100000).BulkUpdate(GetList())//更新

db.Fastest<Order>().BulkUpdate(GetList(),new string[] { "Id"});//无主键

db.Fastest<Order>().BulkUpdate(GetList(), new string[]{"id"},

                     new string[]{"name","time"})//只更新几列

//DataTable                           

db.Fastest<System.Data.DataTable>().AS("Order").BulkUpdate(dataTable,new string[] {"Id"});//Id是主键

db.Fastest<System.Data.DataTable>().AS("Order").BulkUpdate(dataTable,new string[] {"Id"},更新的列);

                          

//使用Winfom需要看标题2

1.3 BulkMerge 5.1.4.109

大数据 插入或者更新

//原理

//Oracle和SqlServer使用了Merge Into+BulkCopy

//其他库底层是 db.Storageable(list).ExecuteSqlBulkCopy()

db.Fastest<Order>().BulkMerge(List);

db.Fastest<Order>().PageSize(100000).BulkMerge(List);

//DataTable 升级到:SqlSugarCore 5.1.4.147-preview15+

db.Fastest<System.Data.DataTable>()

        .AS("Order")//表名

        //第一个参数datatable

        //第二个参数主键

        //第三个参数是不是自增 true为自增

       .BulkMerge(dt, new string[] { "Id" },true);

1.4 BulkQuery

普通查询就行了性能超快

db.Queryable<Order>().ToList();//比Dapper略快

//分页降低内存 适合复杂的DTO转换和导出

List<Order> order = new List<Order>(); 

db.Queryable<Order>().ForEach(it=> { order.Add(it); /*禁止这儿操作数据库因为会循环*/} ,2000);

1.5 BulkDelete

直接用分页删除就行了

db.Deleteable<Order>(list).PageSize(1000).ExecuteCommand();

2WinForm中注意

winform中推荐用异步事件 async await

如果用同步方法要加Task.Run 不然会卡死UI

//方式1:使用异步方法

private async void MyButton_Click(object sender, EventArgs e)  

{  

   // async await不能少

   var result =await db.Fastest<Order>().BulkCopyAsync(lstData)

   // 使用result...  

//使用同步方法要加Task.Run

Task.Run(()=>{

  var db=Db.CopyNew();

  db.Fastest<DC_Scene>().BulkCopy(lstData);

});

3、产品对比

插入的越多,越能体现性能

Db.Fastest.BulkCopy  EFCore.Bulkextension 30%  插入的列的数量越多越强

Db.Fastest.BulkUpdate   EFCore.Bulkextension 2-3

SqlSugar>EFCore.Bulkextension>Dapper ef plus & dapper plus 收费框架 未进行测试)

  1. SqlSugar操作数据库表返回DataTable
  2.  原生 Sql 操作 ,Sql和存储过程

功能介绍

下面的方法支持复杂的Sql  返回多个结果集 、存储过程等  、可以理解为了一个高级DbHelper

  1. 1、用法介绍

//调用Sql

db.Ado.具体方法

//调用存储过程

db.Ado.UseStoredProcedure().具体方法

2、方法列表

方法名

描述

返回值

SqlQuery< T >

查询所有返回实体集合

List

SqlQuery<T,T2>

可以返回2个结果集

Tuple<List, List>

SQLITE(驱动)需要查询前面加上

this.Context.Ado.IsClearParameters=false;

SqlQuerySingle

查询第一条记录

T

SqlQuery<dynamic>

查查询所有返回匿名对象

dynamic

GetDataTable

查询所有

DataTable

GetDataReader

读取DR需要手动释放DR

DataReader

GetDataSetAll

获取多个结果集

DataSet

ExecuteCommand

返回受影响行数,一般用于增删改

int

GetScalar

获取首行首列

object

GetString

获取首行首列

string

GetInt

获取首行首列

int

GetLong

获取首行首列

long

GetDouble

获取首行首列

Double

GetDecimal

获取首行首列

Decimal

GetDateTime

获取首行首列

DateTime

t3、使用案例

技巧:Sql中的关键词用@可以支持多库 

//无参数

var dt=db.Ado.GetDataTable(sql) //上面列表中 SqlQuery 等方法都可以不一定是GetDataTable

//参数1:简化用法

var dt=db.Ado.GetDataTable("select * from table where id=@id and name like @name",

new{id=1,name="%"+jack+"%"});

//参数2:复杂用法

var dt=db.Ado.GetDataTable("select * from table where id=@id and name like @name",

new List<SugarParameter>(){

  new SugarParameter("@id",1),

  new SugarParameter("@name","%"+jack+"%"//执行sql语句

});

//参数3:结合用法

var pars =db.Ado.GetParameters(new{p=1,p2=p}); 

pars[1].DbType=System.Data.DbType.Date;

var dt=db.Ado.GetDataTable(sql,pars)

//原生SQL用实体 sql 查询

List<ClassA> t=db.Ado.SqlQuery<ClassA>(sql);//比db.SqlQueryable兼容性更强,支持复杂SQL存储过程,缺点没有自带的分页操作

//原生SQL用匿名对象 sql 查询

List<dynamic> t=db.Ado.SqlQuery<dynamic>(sql); 

//插入 更新操作一般用

db.Ado.ExecuteCommand(sql);

//db.Ado.xxx 还有更多方法看文档最下面

Sql 查询用  

GetDataTable

SqlQuery 

Sql 增删改用

 增删 改可以用 ExecuteCommand

4 调用存储过程

//简单用法

var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school",new{name="张三",age=0}); 

//带有output的存储过程 

var nameP= new SugarParameter("@name""张三");

var ageP= new SugarParameter("@age"nulltrue);//设置为output

var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school",nameP,ageP);//返回dt

var list = db.Ado.UseStoredProcedure().SqlQuery<Class1>("sp_school",nameP,ageP);//返回List

//更多返回方法 看文档最下面

//ageP.Value可以拿到output值

//SqlSever Datatable参数 看文档 SqlServer 中有介绍 

//Oracle 游标参数用法 Blob类型 Clob类型  看文档 Oracle中有介绍 

//如果是ReturnValue

var nameP=new SugarParameter("@name""张三"typeof(string),ParameterDirection.ReturnValue);

//我们还可以用 GetParameters 来简化参数操作 

 SugarParameter [] pars =db.Ado.GetParameters(new{p=1,p2=p}); 

 pars[1].Direction=ParameterDirection.Output;

5in参数用法

 var dt = db.Ado.SqlQuery<Order>(

                      "select * from [order] where  id in(@ids)",

                       new { ids = new int[] { 1,2,3 } }); //是个数组不是字符串

                       // new SugarParamter("@ids",int[] { 1,2,3}) 

 //select * from [order] where  id in('1','2','3')

6SqlServerGo的脚本处理

db.Ado.ExecuteCommandWithGo(sql) //go语句是独立一行就支持

7、查询