国产精品ORM框架-SqlSugar详解 进阶功能 集成整合 脚手架应用 附源码 云草桑 专题二

国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题一-CSDN博客
sqlsugar 官网-CSDN博客

4、进阶功能

5、集成整合

6、脚手架应用

4、进阶功能

4.1、生命周期

Queryable 什么时候操作库
Queryable是一个引用类型
Queryable拷贝机制
{ISugarQueryable<Student> query = db.Queryable<Student>();List<Student> studentList = query.ToList();Student[] studentList1 = query.ToArray();//ISugarQueryable 对象的内部,包含了如何生成Sql语句;--包含了生成Sql语句的规则//包含了返回值;//作用:在调用给你的时候,可以把查询的对象,表达式目录树。。。解析,组合成成Sql语句,但是并不会到数据库中去查询;//如果在Tolist  Toarray的时候,ISugarQueryable 马上执行,开始按照规则生成Sql语句,就马上去数据库中去执行;//从queryable变成了List 这个时候类型发生变化 已经生成了SQL或者执行了数据库
}{Console.WriteLine("===============================");var able = db.Queryable<Student>();able.Where(it => it.Id > 0);able.Where(it => it.Id > 0);var list = able.ToList();//where id>0 and tid>0
}{var query = db.Queryable<Student>().Where(it => it.Id == 1);{int count = query.Count();List<Student> list = query.ToList();Student[] array = query.ToArray();string sqlString = query.ToSqlString();}//{//    int count = query.Clone().Count();//当query用于2个地方的时候一定要加Clone这点和EF有本质区别//    var list = query.Clone().ToList();//}
}

4.2、执行Sql

方法列表
方法名 描述 返回值
SqlQuery< T > 查询所有返回实体集合 List
SqlQuery<T,T2> 可以返回2个结果集 Tuple<List, List>
SqlQuerySingle 查询第一条记录 T
SqlQueryDynamic 查查询所有返回匿名对象 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
 #region 输出Sql语句+数据库表初始化db.Aop.OnLogExecuting = (s, p) =>{Console.WriteLine("----------------------------");Console.WriteLine($"Sql语句:{s}");};if (db.DbMaintenance.IsAnyTable("UinitBlukTable", false)){db.DbMaintenance.DropTable<UinitBlukTable>();}db.CodeFirst.InitTables<UinitBlukTable>();#endregion {//上面列表中 SqlQuery 等方法都可以不一定是GetDataTable{var dt = db.Ado.GetDataTable("select * from UinitBlukTable");}//参数1:简化用法{string sql = "select * from UinitBlukTable where id=@id and name like @name";var dt = db.Ado.GetDataTable(sql, new { id = 1, name = "%jack%" });}//参数2:复杂用法{string sql = "select * from   UinitBlukTable where id=@id and name like @name";var parameter = new List<SugarParameter>(){new SugarParameter("@id",1),new SugarParameter("@name","%jack%") //执行sql语句};var dt = db.Ado.GetDataTable(sql, parameter);}{//原生SQL用实体 sql 查询//比db.SqlQueryable兼容性更强,支持复杂SQL存储过程,缺点没有自带的分页操作List<UinitBlukTable> t1 = db.Ado.SqlQuery<UinitBlukTable>("select * from UinitBlukTable");//原生SQL用匿名对象 sql 查询List<dynamic> t2 = db.Ado.SqlQuery<dynamic>("select * from UinitBlukTable");//插入 更新操作一般用string sql = $"INSERT INTO [dbo].[UinitBlukTable] ([Id] ,[Name] ,[Create]) VALUES ('10000' ,'Richard' ,'{DateTime.Now.ToString()}')";db.Ado.ExecuteCommand(sql);}//调用存储过程{//带有output的存储过程 {var tableName = new SugarParameter("@tableName", "Company");var reFieldsStr = new SugarParameter("@ReFieldsStr", "*");var orderString = new SugarParameter("@orderString", "Id");var whereString = new SugarParameter("@whereString", "1=1");var pageSize = new SugarParameter("@pageSize", "10");var pageIndex = new SugarParameter("@PageIndex", 1);var TotalRecord = new SugarParameter("@TotalRecord", null, true);//设置为output var dt = db.Ado.UseStoredProcedure().GetDataTable("SP_CustomPager", tableName, reFieldsStr, orderString, whereString, pageSize, pageIndex, TotalRecord);//返回dt //数据总条数object recordCount = TotalRecord.Value;}}//查询两个结果集{var views = db.Ado.SqlQuery<Company, Company, Company>("select * from Company; select * from Company; select * from Company");//多实体var t1list = views.Item1;var t2list = views.Item2;}}

4.3 数据导入和更新+验证 


Excel导入到数据库
困难点: 数据的验证
insert into not exists (只插入不更新)
非主键用例
完整用例(增、删、改)
数据清洗一把梭
    #region 输出Sql语句+数据库表初始化db.Aop.OnLogExecuting = (s, p) =>{Console.WriteLine("----------------------------");Console.WriteLine($"Sql语句:{s}");};if (db.DbMaintenance.IsAnyTable("UinitBlukTable", false)){db.DbMaintenance.DropTable<UinitBlukTable>();}db.CodeFirst.InitTables<UinitBlukTable>();#region 只插入不更新{List<UinitBlukTable> list = new List<UinitBlukTable>();list.Add(new UinitBlukTable() { Id = 1, Name = "a", Create = DateTime.Now });list.Add(new UinitBlukTable() { Id = 2, Name = "a", Create = DateTime.Now });list.Add(new UinitBlukTable() { Id = 3, Name = "a", Create = DateTime.Now.AddYears(-2) });list.Add(new UinitBlukTable() { Id = 4, Name = "", Create = DateTime.Now.AddYears(-2) });{db.Deleteable<UinitBlukTable>().ExecuteCommand();var x = db.Storageable(list).SplitInsert(it => !it.Any()).ToStorage();x.AsInsertable.ExecuteCommand();//插入可插入部分}//缩写{db.Deleteable<UinitBlukTable>().ExecuteCommand();var x = db.Storageable(list).SplitInsert(it => !it.Any()).ToStorage().AsInsertable.ExecuteCommand();}}#endregion#endregion 完整案例{List<UinitBlukTable> list2 = new List<UinitBlukTable>();list2.Add(new UinitBlukTable() { Id = 1, Name = "a", Create = DateTime.Now });list2.Add(new UinitBlukTable() { Id = 2, Name = "a", Create = DateTime.Now });list2.Add(new UinitBlukTable() { Id = 3, Name = "a", Create = DateTime.Now.AddYears(-2) });list2.Add(new UinitBlukTable() { Id = 4, Name = "", Create = DateTime.Now.AddYears(-2) });var x = db.Storageable(list2).SplitError(it => string.IsNullOrEmpty(it.Item.Name), "名称不能为空").SplitError(it => it.Item.Create < DateTime.Now.AddYears(-1), "不是今年的数据").SplitDelete(it => it.Item.Create < DateTime.Now.AddYears(-10))//删除10年前数据//.Saveable() // Saveable 等于下面2行.SplitUpdate(it => it.Any())//数据库存在更新 根据主键.SplitInsert(it => true)//其余插入 .ToStorage();//输出统计输出错误信息     Console.WriteLine("插入 {0} 更新{1} 错误数据{2} 不计算数据{3} 删除数据{4},总共{5}",x.InsertList.Count,x.UpdateList.Count,x.ErrorList.Count,x.IgnoreList.Count,x.DeleteList.Count,x.TotalList.Count);Console.WriteLine("====================导入数据+验证=========================");foreach (var item in x.ErrorList){Console.WriteLine("id等于" + item.Item.Id + " : " + item.StorageMessage);}x.AsInsertable.ExecuteCommand(); //执行插入x.AsUpdateable.ExecuteCommand(); //执行更新x.AsDeleteable.ExecuteCommand(); //执行删除  }
}

--new 20240716


4.4、并发控制、更新、版本控制


并发累计(累加)
防止提交覆盖(乐观锁)
不依赖库同步
并发幂等版本栈
 public class ULockEntity{[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]public int Id { get; set; }public string? Name { get; set; }[SugarColumn(IsEnableUpdateVersionValidation = true)]//标识版本字段public long Ver { get; set; }//支持Guid long string DateTime (不推荐DateTime 时间有精度问题)/

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

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

相关文章

十九、【文本编辑器(五)】排版功能

目录 一、搭建框架 二、实现段落对齐 三、实现文本排序 一、搭建框架 (1) 在imgprocessor.h文件中添加private变量&#xff1a; QLabel *listLabel; //排序设置项QComboBox *listComboBox;QActionGroup *actGrp;QAction *leftAction;QAction *…

基于jeecgboot-vue3的Flowable流程支持bpmn流程设计器与仿钉钉流程设计器-编辑多版本处理

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、前端编辑带有仿钉钉流程的处理 /** 编辑流程设计弹窗页面 */const handleLoadXml (row) > {console.log("handleLoadXml row",row)const params {flowKey: row.key,ver…

PDF Reader 编辑阅读软件 for Mac v4.0.4(办公必备,小白简单易上手)

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件 安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软…

redis其他类型和配置文件

很多博客只讲了五大基本类型&#xff0c;确实&#xff0c;是最常用的&#xff0c;而且百分之九十的程序员对于Redis只限于了解String这种最常用的。但是我个人认为&#xff0c;既然Redis官方提供了其他的数据类型&#xff0c;肯定是有相应的考量的&#xff0c;在某些特殊的业务…

51单片机嵌入式开发:11、 STC89C52RC 实现一个滑动的led点阵程序

STC89C52RC 实现一个滑动的led点阵程序 1 概述2 LED点阵介绍2.1 LED概述2.2 LED点阵注意事项 3 LED点阵原理3.1 Led点阵内部电路3.2 原理图电路 4 软件实现点阵图案的滑动4.1 软件工程代码4.2 Protues仿真 5 扩展74HC595&#xff08;后续专题开展&#xff09;6 总结 第十一节 1…

MySQL—— if/cast/case.... end/md5 函数

目录 1. if 使用 2. if 嵌套 ​3. case ... end 4. 类型转换 cast&#xff08;&#xff09; 5. 加密函数 md5&#xff08;&#xff09; 1. if 使用 将姓名为smith的员工工资上调10%&#xff1b; 2. if 嵌套 如果岗位是manager&#xff0c;工资上调10%&#xff0c;如果岗位是s…

camtasia怎么剪掉不用的部分 屏幕录制的视频怎么裁剪上下不要的部分 camtasia studio怎么裁剪视频时长 camtasia怎么剪辑视频教程

有时我们录制的屏幕内容&#xff0c;并不一定全部需要。那么&#xff0c;屏幕录制的视频怎么裁剪上下不要的部分&#xff1f;可以使用视频剪辑软件&#xff0c;或者微课制作工具来进行裁剪。屏幕录制的视频怎么旋转&#xff1f;录制视频的旋转也是一样的&#xff0c;均在编辑步…

10.1 标注、注记图层和注记整体说明

文章目录 前言标注、注记图层和注记QGis中的标注QGis中的注释(Annotation)图层QGis中的注记 总结 前言 介绍标注、注记图层和注记说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 标注、注记图层和注记 有时地图需要使用一些文字信息说明其中的地理要素或其…

Redis系列命令更新--Redis列表命令

Redis列表 1、Redis Blpop命令&#xff1a; &#xff08;1&#xff09;说明&#xff1a;Redis Blpop命令移出并获取列表的第一个元素&#xff1b;如果列表没有元素会阻塞列表直到等到超时或发现可弹出元素为止 &#xff08;2&#xff09;语法&#xff1a;redis 127.0.0.1:63…

IDEA快速生成项目树形结构图

下图用的IDEA工具&#xff0c;但我觉得WebStorm 应该也可以 文章目录 进入项目根目录下&#xff0c;进入cmd输入如下指令&#xff1a; 只有文件夹 tree . > list.txt 包括文件夹和文件 tree /f . > list.txt 还可以为相关包路径加上注释

程控电阻器

程控电阻器 由于要测试电阻型温度传感器&#xff0c;一个电阻箱又很贵&#xff0c;就想做一款 程控电阻器 来满足。 设计满足300Ω到400kΩ可调电阻。 设计思路 选择数字电位器去控制电阻输出&#xff0c;最好是精度高&#xff0c;范围大的数字电位器。经过寻找后&#xff0c;发…

CentOS 7 Web面板的文件管理器说明

在使用CentOS 7 Web Panel&#xff08;CWP7&#xff09;时&#xff0c;偶尔要求在服务器曲面上修改&#xff0c;创建&#xff0c;编辑或删除文件。 最简单&#xff0c;最直接的方式是通过利用CWP7的内置文件管理器。 本文将详细介绍如何启动它&#xff0c;使用它&#xff0c;以…

【D3.js in Action 3 精译】2.3 用 D3 选中页面元素

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可视化最佳实践&#xff08;下&#xff09;1.4 本章小结 第二章…

C语言基础and数据结构

C语言程序和程序设计概述 程序:可以连续执行的一条条指令的集合 开发过程:C源程序(.c文件) --> 目标程序(.obj二进制文件,目标文件) --> 可执行文件(.exe文件) -->结果 在任何机器上可以运行C源程序生成的 .exe 文件 没有安装C语言集成开发环境,不能编译C语言程…

【数据结构】二叉树全攻略,从实现到应用详解

​ &#x1f48e;所属专栏&#xff1a;数据结构与算法学习 &#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ ​ &#x1f341;1. 树形结构的介绍 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做…

Java18的主要新特性总结

目录 概述 变动说明 重要变更和信息 下载地址 Java18新特性总结 1、JEP 420: Switch 的模式匹配&#xff08;第二次预览&#xff09; 功能进化 Switch 模式匹配 类型标签 null标签 守卫标签 2、JEP 400&#xff1a;默认UTF-8编码 3、JEP 408&#xff1a;简易Web服务…

Java 虚拟线程:案例研究

一. 关键要点 虚拟线程是 Java 并发编程的一个重要进步&#xff0c;但在运行典型的云原生 Java 工作负载方面&#xff0c;它们并不比 Open Liberty 现有的自主线程池具有明显的优势。对于 CPU 密集型工作负载&#xff0c;由于目前尚不清楚的原因&#xff0c;虚拟线程的吞吐量低…

Idea如何快速高效的修改项目的包名

文章目录 前言一、全局替换的快捷键二、弹出如下的界面 前言 当我们有时候在做项目迁移的时候&#xff0c;需要快速的修改项目的包名&#xff01;那么如何快速高效的修改项目的报名呢&#xff1f; 经过尝试了很多方法&#xff01;最简单的方法就是利用全局替换来直接替换报名&…

QT实现带动态弹出动画的自定义通知提示框

Qt中经常会用到提示框&#xff0c;用于交互操作&#xff01;QMessageBox是被大多数人用到的&#xff0c;用起来是很方便&#xff0c;但是控件类型、大小、布局、样式、往往不是开发者想要的。本实例实现的Notification控件&#xff0c;是一种悬浮在角落的通知提醒框。 一、简述…

Day07-ES集群加密,kibana的RBAC实战,zookeeper集群搭建,zookeeper基本管理及kafka单点部署实战

Day07-ES集群加密&#xff0c;kibana的RBAC实战&#xff0c;zookeeper集群搭建&#xff0c;zookeeper基本管理及kafka单点部署实战 0、昨日内容回顾:1、基于nginx的反向代理控制访问kibana2、配置ES集群TSL认证:3、配置kibana连接ES集群4、配置filebeat连接ES集群5、配置logsta…