SqlSugar 集成

1 关于 SqlSugar

SqlSugar 是 .NET/C# 平台非常优秀的 ORM 框架,目前 Nuget 总下载突破 700K,Github 关注量也高达 3.2K,是目前当之无愧的国产优秀 ORM 框架之一。

SqlSugar 官方地址:果糖网 ( SqlSugar 官网 ) .NET论坛 .NET学习

SqlSugar 与 EF 优势: 性能比 EF 更快、语法上手更容易

SqlSugarDapper 优势: SqlSugar 功能更加丰富,性能丝毫不逊色于 Dapper,并且批量操作性能更好

2 如何集成

Furion 框架中,已经推出 SqlSugar 拓展包 Furion.Extras.DatabaseAccessor.SqlSugar。

2.1 注册 SqlSugar 服务

使用非常简单,只需要在 Startup.cs 中添加 services.AddSqlSugar(config) 即可。如:

services.AddSqlSugar(new ConnectionConfig
{ConnectionString = "Server=.xxxxx",//连接符字串DbType = DbType.SqlServer,IsAutoCloseConnection = true,InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息
});

同时也可以添加更多配置,如:

services.AddSqlSugar(new ConnectionConfig
{ConnectionString = "Server=.xxxxx",//连接符字串DbType = DbType.SqlServer,IsAutoCloseConnection = true,InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息
},
db =>
{//处理日志事务db.Aop.OnLogExecuting = (sql, pars) =>{Console.WriteLine(sql);Console.WriteLine(string.Join(",", pars?.Select(it => it.ParameterName + ":" + it.Value)));Console.WriteLine();};
});

安装拓展包位置

Furion 框架中,推荐将拓展包 Furion.Extras.DatabaseAccessor.SqlSugar 安装到 Furion.Core 层中。

3 基本使用

在使用之前,我们可以通过构造函数注入 ISqlSugarRepository<TEntity> 接口,如:

private readonly ISqlSugarRepository<Person> repository; // 仓储对象:封装简单的CRUD
private readonly ISqlSugarClient db; // 核心对象:拥有完整的SqlSugar全部功能
public PersonService(ISqlSugarRepository<Person> sqlSugarRepository)
{repository = sqlSugarRepository;db = repository.Context;    // 推荐操作
}

4 数据库操作示例

// ================== SqlSugarClient ================
//查询功能
var data1 =db.Queryable<Student>().First(it=>it.Id==1); //db.GetById(1); 
var data2 = db.Queryable<Student>().ToList();// db.GetList();
var data3 = db.GetList(it => it.Id == 1);
var data4 = db.GetSingle(it => it.Id == 1);
var p = new PageModel() { PageIndex = 1, PageSize = 2 };
var data5 = db.GetPageList(it => it.Name == "xx", p);//p.PageCount
var data6 = db.GetPageList(it => it.Name == "xx", p, it => it.Name, OrderByType.Asc);
List<IConditionalModel> conModels = new List<IConditionalModel>();
conModels.Add(new ConditionalModel(){FieldName="id",ConditionalType=ConditionalType.Equal,FieldValue="1"});//id=1
var data7 = db.GetPageList(conModels, p, it => it.Name, OrderByType.Asc);
// ================== 简单仓储 ================
//插入
repository.Insert(insertObj);
repository.InsertRange(InsertObjs);
var id = repository.InsertReturnIdentity(insertObj);
repository.AsInsertable(insertObj).ExecuteCommand();
//删除
repository.Delete(insertObj);
repository.DeleteById(1);
repository.DeleteByIds(new object [] { 1, 2 }); //数组带是 ids方法 ,封装传 object [] 类型
repository.Delete(it => it.Id == 1);
repository.AsDeleteable().Where(it => it.Id == 1).ExecuteCommand();
//更新
repository.Update(insertObj);
repository.UpdateRange(InsertObjs);
repository.Update(it => new Order() { Name = "a", }, it => it.Id == 1);
repository.AsUpdateable(insertObj).UpdateColumns(it=>new { it.Name }).ExecuteCommand();
//异步方法用法
repository.Insert(insertObj);//同步
repository.InsertAsync(insertObj);//异步
//切换仓储
var orderRespository=db.GetSimpleClient<Order>();
orderRespository.Insert(Order);

5 SqlSugarClient 操作示例

5.1 基础查询

//查询所有
var getAll = db.Queryable<Student>().ToList();
//查询前10
var top10= db.Queryable<Student>().Take(10).ToList();
//查询单条
var getFirst = db.Queryable<Student>().First(it=>it.Id==1);
//with nolock
var getAllNoLock = db.Queryable<Student>().With(SqlWith.NoLock).ToList();
//根据主键查询
var getByPrimaryKey = db.Queryable<Student>().InSingle(2);
//查询总和
var sum = db.Queryable<Student>().Sum(it=>it.Id);
//是否存在
var isAny = db.Queryable<Student>().Where(it=>it.Id==-1).Any();
//模糊查
var list2 = db.Queryable<Order>().Where(it =>it.Name.Contains("jack")).ToList();

5.2 联表查询

var list = db.Queryable<Student, School>((st, sc) => new JoinQueryInfos(JoinType.Left,st.SchoolId==sc.Id)).Select((st,sc)=>new{Id=st.Id,Name=st.Name,SchoolName=sc.Name}).ToList();
生成的Sql如下:
SELECT  [st].[ID] AS [id] ,[st].[Name] AS [name] ,[sc].[Name] AS [schoolName]  FROM [STudent] stLeft JOIN School sc ON ( [st].[SchoolId] =[sc].[Id])

5.3 分页查询

 int pageIndex = 1;int pageSize = 20;int totalCount=0;var page = db.Queryable<Student>().ToPageList(pageIndex, pageSize, ref totalCount);

更多查询用法 : http://www.donet5.com/Home/Doc?typeId=1185

5.4 插入

//可以是 类 或者 List<类>
db.Insertable(insertObj).ExecuteCommand();
//插入返回自增列
db.Insertable(insertObj).ExecuteReturnIdentity();
//可以是 Dictionary 或者 List<Dictionary >
var dc= new Dictionary<string, object>();dt.Add("name", "1");dt.Add("CreateTime", null);
db.Insertable(dc).AS("student").ExecuteCommand();
//DataTable插入
Dictionary<string,object> dc= db.Utilities.DataTableToDictionary(dataTable);//转成字典就可以按上面的字典更新了
db.Insertable(dc).AS("student").ExecuteReturnIdentity();
//实体可以配置主键和自增列
public class Student
{[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]public int Id { get; set; }public int? SchoolId { get; set; }public string Name { get; set; }
}

更多插入用法: http://www.donet5.com/Home/Doc?typeId=1193

5.5 更新

实体配置参考插入,只需要配置主键即可

//根据主键更新单条 参数 Class
var result= db.Updateable(updateObj).ExecuteCommand();
//不更新 Name 和TestId
var result=db.Updateable(updateObj).IgnoreColumns(it => new { it.CreateTime,it.TestId }).ExecuteCommand()
//只更新 Name 和 CreateTime
var result=db.Updateable(updateObj).UpdateColumns(it => new { it.Name,it.CreateTime }).ExecuteCommand();
//根据表达式更新
var result71 = db.Updateable<Order>().SetColumns(it => it.Name == "a").SetColumnsIF(p!=null ,it => it.CreateTime == p.Value)//当p不等于null更新createtime列.Where(it => it.Id == 11).ExecuteCommand();

更多更新用法: http://www.donet5.com/Home/Doc?typeId=1191

5.6 删除

实体配置参考插入,只需要配置主键即可

//根据实体删除
db.Deleteable<Student>().Where(new Student() { Id = 1 }).ExecuteCommand();
//根据主键删除
db.Deleteable<Student>().In(1).ExecuteCommand();
//根据表达式删除
db.Deleteable<Student>().Where(it => it.Id == 1).ExecuteCommand();

更多删除用法: http://www.donet5.com/Home/Doc?typeId=1195

6 Sql 查询

//sql分页
var list = db.SqlQueryable<Student>("select * from student").ToPageList(1, 2,ref total);
//原生Sql用法
var dt=db.Ado.GetDataTable("select * from table where id=@id and name=@name",new List<SugarParameter>(){new SugarParameter("@id",1),new SugarParameter("@name",2)
});
//参数2
var dt=db.Ado.GetDataTable("select * from table where id=@id and name=@name",new{id=1,name=2});
//存储过程用法
var nameP= new SugarParameter("@name", "张三");
var ageP= new SugarParameter("@age", null, true);//设置为output
var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school",nameP,ageP);

方法名描述返回值
SqlQuery< T >查询所有返回实体集合List
SqlQuery<T,T2>可以返回 2 个结果集Tuple<List, List>
SqlQuerySingle查询第一条记录T
GetDataTable查询所有DataTable
GetDataReader读取 DR 需要手动释放 DRDataReader
GetDataSetAll获取多个结果集DataSet
ExecuteCommand返回受影响行数,一般用于增删改int
GetScalar获取首行首列object
GetString获取首行首列string
GetInt获取首行首列int
GetLong获取首行首列long
GetDouble获取首行首列Double
GetDecimal获取首行首列Decimal
GetDateTime获取首行首列DateTime

想了解更多 SqlSugar 知识可查阅 SqlSugar 官网。

7 打印 sqlSwagger

services.AddSqlSugar(new ConnectionConfig
{ConnectionString = "Server=.xxxxx",//连接符字串DbType = DbType.SqlServer,IsAutoCloseConnection = true,InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息
},
db =>
{db.Aop.OnLogExecuting = (sql, pars) =>{App.PrintToMiniProfiler("SqlSugar", "Info", sql + "\r\n" +string.Join(",", pars?.Select(it => it.ParameterName + ":" + it.Value)));};
});


---------------------
作者:风神.NET跨平台
来源:CSDN
原文:https://blog.csdn.net/WuLex/article/details/117913329
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

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

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

相关文章

LVS三种负载均衡模式:NAT、Tunneling和DR的技术对比

1. LVS-NAT 模式的特性 IP使用&#xff1a;RS&#xff08;Real Server&#xff09;应使用私有地址&#xff0c;RS的网关必须指向DIP&#xff08;Director IP&#xff09;。网络范围&#xff1a;DIP和RIP必须在同一个网段内。数据包处理&#xff1a;请求和响应报文都需要经过Di…

Vue 3 组合式编程:革新前端开发的新时代

Vue.js作为一种流行的前端框架&#xff0c;因其简洁、灵活和高性能而深受开发者喜爱。随着前端开发需求的不断演变和复杂度的增加&#xff0c;Vue.js也在不断地进化和改进。Vue 3的推出标志着Vue.js进入了一个新的阶段&#xff0c;其中最重要的一个变化就是引入了组合式编程&am…

数据库开发——并发控制(第十一章)

文章目录 前言并发执行例题一、封锁二、封锁协议三、可串行调度四、总结 学习目标&#xff1a;重点为并发控制的基本概念及几个基本协议 前言 数据库管理系统必须提供并发控制机制&#xff0c;保证事务的隔离性和一致性 并发执行例题 一、封锁 排他锁称为写锁&#xff0c;共…

react-redux搭建及不同版本间的对比

一.经典版 1. 安装Redux和React Redux npm install redux react-redux 2. 创建action // actions/counterActions.js export const increment () > {return {type: INCREMENT}; };export const decrement () > {return {type: DECREMENT}; };export const add (amo…

atmega8 上传程序

使用icsp 烧写时先关闭串口程序&#xff0c;与串口uart连接相关的电路勿于电脑连接 接触不良 1.使用icsp 上传 1&#xff09;可以直接上传程序 如官方示例blink 或是 serial示例 2&#xff09;可以先烧录bootload 方便下次使用串口上传程序代码 A)使用专门的icsp 上传器上传…

关于二分法的理解(以JS为例)

算法介绍 基本概念 二分查找算法&#xff0c;又称折半查找算法&#xff0c;是一种在有序数组中查找特定元素的高效方法。它的核心思想是将数组分成两半&#xff0c;然后根据目标值与中间元素的比较结果来决定是继续在左半部分还是右半部分进行搜索。 工作原理 初始化&#…

【iOS】如何断点看系统方法在哪一个库

如何断点看系统方法在哪一个库 开源网站如何断点看系统方法在哪一个库1 下符号断点2 符号断点中输入 load &#xff0c;并且开启断点&#xff08;Enable&#xff09;。3 运行程序&#xff0c;触发断点&#xff0c;在堆栈信息中找到load方法&#xff0c;可以看到其在libobjc.A.d…

程序员的wsl2

坑 wsl无法打开 上班时打开wsl2提示 WSL 正在完成升级... Could not write value to key \SOFTWARE\Classes\Directory\shell\WSL. Verify that you have sufficient access to that key, or contact your support personnel. 原因未知&#xff0c;之前并没有更新过&#xff…

【AI+编程】工作日常场景随时可以AI编程,记一个问答SQL快速导出数据日常示例

今天有个场景&#xff0c;我们有个老项目&#xff0c;由于历史原因差不多1年多没使用了&#xff0c;恰巧客户紧急情况要使用。因为当时没有需求&#xff0c;所以V1.0上线后 就没做更新。 需求很简单&#xff1a;我们假定 项目问题表、客户表、问题答案表&#xff0c; 实时查询…

TCP协议报头详解

目录 前言 TCP特点 TCP报头 1.源端口和目的端口 2.序号 3.确认号 4.数据偏移 5.保留 6.控制位 ① 紧急URG&#xff08;URGent&#xff09; ② 确认ACK&#xff08;ACKnowledgment&#xff09; ③ 推送PSH&#xff08;PuSH&#xff09; ④复位RST&#xff08;ReSeT&…

tornado.httputil.HTTPFile

tornado.httputil.HTTPFile 在 Tornado web 框架中并不是直接提供的一个类或者对象。但是&#xff0c;当你提到与文件上传相关的功能时&#xff0c;通常我们是在谈论 Tornado 的 tornado.web.RequestHandler 类中处理文件上传的方法。 在 Tornado 中&#xff0c;文件上传通常是…

【React】《React 学习手册 (第2版) 》笔记-Chapter1-初识 React

一、初识 React 在 package.json 文件中提供具体的版本信息&#xff0c;以便安装各个包的正确版本。 官方文档&#xff1a;https://zh-hans.react.dev/ 建议安装 React 开发者工具&#xff0c;来辅助开发 React 项目。这些工具可通过扩展 Chrome 和 Firefox 中安装&#xff0…

Android获取CPU的使用率

Android获取CPU的使用率 1、参考博客2、使用读取/proc/stat方案2.1 读取/proc/stat权限2.2 CPU使用率获取代码 1、参考博客 android系统之获取CPU的使用率 安卓性能测试之cpu占用率统计方法总结 CPU使用率指标内核源码分析 Android获取CPU&#xff0c;内存&#xff0c;磁盘使用…

Hexo 搭建个人博客(ubuntu20.04)

1 安装 Nodejs 和 npm 首先登录NodeSource官网&#xff1a; Nodesource Node.js DEB 按照提示安装最新的 Node.js 及其配套版本的 npm。 &#xff08;1&#xff09;以 sudo 用户身份运行下面的命令&#xff0c;下载并执行 NodeSource 安装脚本&#xff1a; sudo curl -fsSL…

【牛客面试必刷TOP101】Day32.BM68 矩阵的最小路径和和BM69 把数字翻译成字符串

文章目录 前言一、BM68 矩阵的最小路径和题目描述题目解析二、BM69 把数字翻译成字符串题目描述题目解析总结 前言 一、BM68 矩阵的最小路径和 题目描述 描述&#xff1a; 给定两个字符串str1和str2&#xff0c;输出两个字符串的最长公共子序列。如果最长公共子序列为空&#x…

C++中符号常量与预处理器的行为

C中符号常量与预处理器的行为 以头文件 climits 为例来说明&#xff0c;该头文件定义了符号常量来表示类型的限制。如前所述&#xff0c;INTMAX表示类型int 能够存储的最大值&#xff0c;对于 Windows7系统&#xff0c;为2147483 647。编译器厂商提供了 climits 文件&#xff…

webpack逆向

声明&#xff1a;个人总结记录一下&#xff0c;避免忘记 1、webpack 类型 单文件 直接可以在文件顶部找到加载器 多文件 顶部找不到加载器 如图所示 多文件的这话&#xff0c;全局搜所 69725 找到类似n(69725) ,单点n进去&#xff0c;可以找到加载器 2、调用 通过赋值的方…

企业开源免费和开源的堡垒机选型方案

企业在选择堡垒机时&#xff0c;通常会考虑其安全性、功能性、易用性以及成本。以下是一些免费和开源的堡垒机解决方案&#xff0c;适合希望在保障安全的前提下控制成本的企业&#xff1a; 1. Jumpserver GitHub 地址: https://github.com/jumpserver/jumpserver特点:支持Web…

13.零拷贝

零拷贝:不需要将数据放入到java的缓存中。 更少的用户态与内核态的切换。不利用cpu计算,减少cpu缓存伪共享。零拷贝适合小文件传输。需求 读取服务器的一个文件,通过socket的API发送到客户端。 伪代码 File f = new File("D:/data.txt"); RandomAccessFile fi…

Linux 并发与竞争实验学习

Linux 并发与竞争实验学习 原子操作实验 这里原子操作就是采用原子变量来保护一个程序运行的完整过程&#xff0c;使用atomic 来实现一次只能允许一个应用访问 LED&#xff0c;创建atomic.c文件&#xff0c;其实改动内容就是添加原子变量&#xff0c; 要在设备结构体数据添加…