SqlSugar更新数据
1、根据实体对象更新
所谓按实体对象更新就是:db.Updateable(参数对象) 有参数的重载
db.Updateable(实体或者集合).ExecuteCommand() //右标题1 下面的所有菜单 |
优点
1、代码少
2、支持各种批量修改
缺点
1、不支持表达式和sql函数
2、依赖 实体对象 ,没实体对象就需要手动构造
1.1 单条与批量
根据实体更新需要给实体配置主键,参考文档实体配置
//根据主键更新单条 参数 Class var result= db.Updateable(updateObj).ExecuteCommand(); //实体有多少列更新多少列 //批量更新参数 List<Class> var result= db.Updateable(updateObjs).ExecuteCommand(); //分页更新 5.1.4.129+ 低版本 存在 UpateColumns设置无效 db.Updateable(List<实体>).PageSize(1000).ExecuteCommand() var updateObj= new Class(){Id=1 }; //主键要有值 //只更新修改字段 (5.1.4.59支持了批量) db.Tracking(updateObj); //创建跟踪 updateObj.Name = "a1" + Guid.NewGuid(); //只改修改了name那么只会更新name db.Updateable(updateObj).ExecuteCommand(); //因为每条记录的列数不一样,批量数据多性能差,不建议用 //可以清空 db.ClearTracking(); //5.1.4.108-preview30+ //大数据批量更新 适合列多数据多的更新 db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList()); //联表更新看标题6.2 |
函数 | 说明 |
ExecuteCommand | 返回受影响行数 , update where 如果没找到那么就会返回 0 |
ExecuteCommandHasChange | 返回bool ,等同于 bool isChange= ExecuteCommand()>0 |
1.2 不更新某列
不更新 TestId和CreateTime
var result=db.Updateable(updateObj).IgnoreColumns(it => new { it.CreateTime,it.TestId }).ExecuteCommand() |
1.3 只更新某列
只更新 Name 和 CreateTime
var result=db.Updateable(updateObj).UpdateColumns(it => new { it.Name,it.CreateTime }).ExecuteCommand(); //注意:5.1.4.62版本支持了多个UpdateColumn叠加,之前版本不支持 |
追加AOP赋值列 5.1.4.106-preview19+
//例如:AOP修改 Price那么更新的列就是 Price Name Creatime 加了true就追加了一列 var result=db.Updateable(updateObj) .UpdateColumns(it => new { it.Name,it.CreateTime }, true ) //true表示追加AOP赋值列 .ExecuteCommand(); |
1.4 NULL列不更新
注意:高版本支持批量 ,用该方法批量性能差些,因为列不同所以没必然用批量语法
//更新忽略null字段 db.Updateable(data).IgnoreColumns(ignoreAllNullColumns: true ).ExecuteCommand(); //更新忽略null并且忽略默认值 (比如int默认值是0就不更新) db.Updateable(data). IgnoreColumns(ignoreAllNullColumns: true ,ignoreAllDefaultValue: true ).ExecuteCommand(); |
1.5 无主键/指定列
用法同上唯一区别就是用WhereColumns指定条件
var result= db.Updateable(updateObj).WhereColumns(it=> new { it.Id}).ExecuteCommand(); //更新单 条根据ID var result= db.Updateable(updateObjs).WhereColumns(it=> new { it.Id}).ExecuteCommand(); //更新集合根据ID by id |
可以多列
WhereColumns(it=> new { it.Id,it.Name}) //条件列不会被更新,只会作为条件 |
1.6 更新添加条件
注意:单条操作都支持
db.Updateable(updateObj).Where(it=>it.Id==1).ExecuteCommand() //如果是集合操作请更新到5.0.4版本之前版本禁止使用, 并且只有部分库支持 |
1.7 大数据更新 5.0.4.5
//大数据更新,适合大数据更新,可以处理百万级 db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList()); //特色功能:吊打所有框架N倍,30列100万8秒更新完 |
1.8 重新赋值1:list中的值修改
请升级新版本 ,老版本存在BUG,所以没公开这个函数
//单个字段 db.Updateable(updateObj) .ReSetValue(it=> { it.Name = it.Name+ "a" ;}) // updateObj.Name值的基础上在处理 .ExecuteCommand() //多个字段 db.Updateable(updateObj) .ReSetValue(it=> { it.Name = it.Name+ "a" ; it.CreateTime = DateTime.Now; }) .ExecuteCommand() //注意:该功能是在UpdateObj参数上修改,如果是在数据库字段+1 看1.9和2.3 |
1.9 重新赋值2: 列中的值+1
(1) SET=字段+固定变量 SqlSugarCore 5.1.4.72 +
var result67 = db.Updateable(updateObjs) //批量更新单独处理num列 set num=num+1 .PublicSetColumns(it => it.Num, it => it.Num+ 1) .ExecuteCommand(); //该功能默认是更新整个LIST,如果只更新一个字段需要加UpdateColumn指定一下 //2.3也有该功能不过是针对表达式方式更新,不是通过实体方式 |
(2) SET=字段+集合变量 SqlSugarCore 5.1.4.77 preview02 +
db.Updateable(list) .PublicSetColumns(it => it.Price, "+" ) //set price=price+list[i].price .ExecuteCommand(); //,该功能默认是更新整个LIST,如果只更新一个字段需要加UpdateColumn指定一下 |
2、 根据表达式更新(像SQL)
这种无参数重载我们称为表达式更新,他不依赖实体或者集合参数 db.Updateable<Student>()
db.Updateable<Student>().SetColumns(...).Where(...).ExecuteCommand() //正确没参数我们称为表达式更新 db.Updateable(实体或者集合).SetColumns(...).Where(...).ExecuteCommand() //错误 如果带有参数 实体或者集合 看标题1 //注意:一定要看右边菜单 1和2的用法不要用混了 |
优点
1、需要更新什么写什么
2、支持SqlFunc函数也支持字段相加比如 Num=it.Num+1
缺点
1、不支持批量更新不同记录,只支持批量更新统一的结果
2、没有实体更新节约代码
根据表达式更新和上面的实体更新有着本质的区别,实体更新是要处理实体里面哪些字段要更新哪些不要更新
表达式则是需要更新什么写什么,哪种方式都可以就看你喜欢哪一种
2.1 指定多个字段更新
更新 name,createtime 条件id=11
var result= db.Updateable<Student>() .SetColumns(it => new Student() { Name = "a" , CreateTime = DateTime.Now }) //类只能在表达示里面不能提取 .Where(it => it.Id == 11) .ExecuteCommand(); //表达式写2列更新2列,其他不会更新 |
2.2 一个字段更新
只更新 name 条件id=1
var result= db.Updateable<Student>() .SetColumns(it => it.Name == "jack" ) //SetColumns是可以叠加的 写2个就2个字段赋值 .Where(it => it.Id == 1) .ExecuteCommand(); // Sql // Update Student set Name='jack' where id=1 //如果需要获取数据库时间我们可以用 SqlFunc.GetDate() |
2.3 字段+1更新
//实现在原有字段+1 var result= db.Updateable<Student>() .SetColumns(it => it.Num== it.Num+1) .Where(it => it.Id == 1) .ExecuteCommand(); // update Studentset iNum=iNum+1 where id=1 |
2.4 Set语法是支持多个的
var result71 = db.Updateable<Order>() //生成 [name]=name .SetColumns(it => it.Name == it.Name) //加一个必须更新条件防止SETIF没有列 //第一条件为true 生成 createtime=变量 .SetColumnsIF(p!= null ,it => it.CreateTime == p.Value) //第一条件为true 生成 X=变量 .SetColumnsIF(X!= null ,it => it.X== X) .Where(it => it.Id == 11).ExecuteCommand(); |
2.5 批量更新IN
var ids= new int []{1,2,3}; var result71 = db.Updateable<Order>() .SetColumns(it => it.Name == "a" ) .Where(it => ids.Contains(it.Id)).ExecuteCommand(); // in (1,2,3) |
2.6表达式无实体更新
db.Updateable< object >() .AS( "Order" ) .SetColumns( "name" , 1) .Where( "id=1" ).ExecuteCommand(); //SQL: //UPDATE [Order] SET // [Name]=@Const0 WHERE id=1 |
3、根据字典更新
//字典 var dt = new Dictionary< string , object >(); dt.Add( "id" , 1); dt.Add( "name" , null ); dt.Add( "createTime" , DateTime.Now); var t66 = db.Updateable(dt).AS( "student" ).WhereColumns( "id" ).ExecuteCommand(); //字典集合 var dtList = new List<Dictionary< string , object >>(); dtList.Add(dt); dtList.Add(dt2); var t666 = db.Updateable(dtList).AS( "student" ).WhereColumns( "id" ).ExecuteCommand(); // |
4、根据DataTable更新
将datatable转成字典集合插入
List<Dictionary< string , object >> dc= db.Utilities.DataTableToDictionaryList(dataTable); //转成字典 var t666 = db.Updateable(dc).AS( "student" ).WhereColumns( "id" ).ExecuteCommand(); |
5、匿名、Object、接口和抽象类更新
匿名对象:
https://www.donet5.com/Home/Doc?typeId=2423
Object、接口和抽象类:
//这个object必须真实类对象,比如反射的Object 或者接口接收的类对象 db.UpdateableByObject( object ).ExecuteCommand(); //更多功能 :动态建类等 https: //www.donet5.com/Home/Doc?typeId=2562 |
6、更多功能
6.1 更新主键
ORM默认不支持修改主键,这种需求有2种方案
1、删除当前记录,然后在添加一条新记录(因为主键都可以更新,说明没有外部引用,可以直接删掉在加)
2、新建一个没有主键的实体,指定表名用Wherecolumns更新
6.2 联表更新
//多库兼容 var t17 = db.Updateable<Student>() .SetColumns(it => new Student() { SchoolId=SqlFunc.Subqueryable<School>().Where(s=>s.Id ==it.SchoolId).Select(s=>s.Id), Name = "newname" }) .ExecuteCommand(); //也可以在Where加条件 //.Where(it => SqlFunc.Subqueryable<School>().Where(s => s.Id == it.SchoolId).Any()) //优雅写法:MySql PgSql SqlServer Oracle 达梦、金仓 //其中Oracle和达梦只支持2表 var t= db.Updateable<Order>() .InnerJoin<Custom>((x, y) => x.CustomId == y.Id) .SetColumns((x, y) => new Order() { Name = y.Name, Price = y.Id }) .Where((x, y) => x.Id == 1) .ExecuteCommand(); |
sql
UPDATE [STudent] SET [SchoolId] = ( SELECT TOP 1 [Id] FROM [School] WHERE ( [Id] =[STudent].[SchoolId] )) , [ Name ] = @Const0 WHERE ( [ID] = @Id1 ) |
6.3 调用实体内方法
db.Insertable( new UnitInsertMethod() { ...... }) .CallEntityMethod(it=>it.Create()).ExecuteCommand(); db.Updateable( new UnitInsertMethod() { ..... }) .CallEntityMethod(it => it.modify( "admint" )).ExecuteCommand(); //实体 public class UnitInsertMethod { [SqlSugar.SugarColumn(IsPrimaryKey = true , IsIdentity = true )] public int Id { get ; set ; } public string Name { get ; set ; } public DateTime Time { get ; set ; } [SqlSugar.SugarColumn(IsNullable = true )] public string UserId { get ; set ; } public void Create() { this .Time = DateTime.Now; this .UserId = "1" ; } public void modify( string a) { this .Time = DateTime.Now; this .UserId = a; } } |
6.4 高性能更新
适合超大数据更新
db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList()); //更新 吊打所有框架N倍,30列100万8秒更新完 |
6.5 导航更新
https://www.donet5.com/Home/Doc?typeId=2432
6.5 默认值
方式1 (5.1.3.42-preview01):通过特性指定默认值
//更新取数据库当前时间 支持多库 //UpdateServerTime =true 更新的时候取服务器时间 //IsOnlyIgnoreInsert =true 插入的时候不插入该列(可用可不用根据需求来) [SugarColumn(UpdateServerTime = true ,IsOnlyIgnoreInsert = true )] // getdate() now() sysdate public DateTime UpdateTime { get ; set ; } //更新根据SQL进行插入 [SugarColumn(UpdateSql = "getdate()" )] //生成 getdate() public DateTime UpdateTime2 { get ; set ; } [SugarColumn(UpdateSql = "''" )] // 生成 '' public string Str { get ; set ; } [SugarColumn(UpdateSql = "0" )] // 生成 0 public string Str { get ; set ; } [SugarColumn(UpdateSql = "num+1" )] // 生成 num+1 public string num { get ; set ; } |
注意:
表达更新:SetColumns(it=>new class{ name=it.name},true) 如果用到SetColumn需要加个true
实体更新:无需任何操作
方式2:通过AOP实现,文档搜索:AOP , 看标题2
注意:方式1和方式2不要冲突了
SqlSugar更新数据的更多相关文章
- CRL快速开发框架系列教程三(更新数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- C#使用ListView更新数据出现闪烁解决办法
C#使用ListView更新数据出现闪烁解决办法 在使用vs自动控件ListView控件时候,更新里面的部分代码时候出现闪烁的情况 如图: 解决以后: 解决办法使用双缓冲:添加新类继承ListView ...
- flask+sqlite3+echarts3+ajax 异步更新数据
结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...
- 使用AjaxPro实现无刷新更新数据
需求 在一个页面动态无刷新的更新后台得到的数据.要想无刷新的更新数据,需要使用Javascript能够获取后台返回的数据,然后通过第三方Javascript库(JQuery等)动态更新web页面DOM ...
- Android 数据库管理— — —更新数据
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...
- MySql使用游标Cursor循环(While)更新数据
#要修改的变量 DECLARE var_ID VARCHAR(50) DEFAULT ''; #需要修改的数据的数量 DECLARE var_UpdateCount INT; #当前循环次数 DECL ...
- hibernate persist update 方法没有正常工作(不保存数据,不更新数据)
工程结构 问题描述 在工程中通过spring aop的方式配置事务,使用hibernate做持久化.在代码实现中使用hibernate persit()方法插入数据到数据库,使用hibernate u ...
- WinForm中DataGridView显示更新数据--人性版
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Oracle 常用操作【01】修改、更新数据
1. oracle 修改表名.列名.字段类型.添加表列.删除表列 alert table scott.test rename to test1--修改表名 alter table scott.tes ...
- mysql 插入/更新数据
mysql 插入/更新数据 INSERT 语句 1.一次性列出全部字段的值,例如: INSERT INTO student VALUES('Chenqi','M', 29); INSERT INTO ...
随机推荐
- 微信公众号短链实时阅读量、点赞数爬虫(不会Hook可用)
众所周知,微信分享的公众号分享出的一般都是短链,在这个锻炼下使用浏览器打开并不能获取微信公众的阅读量点赞数等这些信息,如图1所示. 但是实际拥有详细信息的则是这个链接下面,提取链接所需要提交的信息包括 ...
- 这应该是java最好用的orm之一了
这应该是java最好用的orm之一了 说起orm大家肯定都不会陌生,作者是一个.net菜鸟.并且是在.net繁荣的orm圈子下成长的,所以这次给大家带来的是媲美efcore,freesql,sqlsu ...
- JSP | IDEA中部署tomcat,运行JSP文件,编译后的JSP文件存放地点总结
首先保证你正常部署了Tomcat,并且正常在浏览器中运行了JSP文件. 参考博客:Here 那么Tomcat编译后的JSP文件(_jsp.class 和 _jsp.java)的存放地点: (一)一般存 ...
- AtCoder Regular Contest 116 (A~F补题记录)
补题链接:Here 第一次打 ARC,被数学题虐惨了 赛后部分数学证明学习自 ACwisher A - Odd vs Even \(T(1≤T≤2×10^5)\)组测试数据,每次询问一个正整数 \(N ...
- 第六届蓝桥杯(2015)C/C++大学A组省赛题解
第一题.方程整数解 答案:10 18 24,最小的为 10 int main() { ios_base::sync_with_stdio(false), cin.tie(0); for (int i ...
- v-html会导致xss攻击
- [Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event.
在基于 Element-ui 写项目的时候,Chrome 提醒: [Violation] Added non-passive event listener to a scroll-blocking ' ...
- vue-li3结合vantUI框架实现国际化语言切换
vue-cli3结合vantUI框架实现国际化语言切换 https://blog.csdn.net/weixin_45045199/article/details/105838517?utm_medi ...
- 使用 Sealos 一键部署 Kubernetes 集群
Sealos 是一款以 Kubernetes 为内核的云操作系统发行版,使用户能够像使用个人电脑一样简单地使用云. 与此同时,Sealos 还提供一套强大的工具,可以便利地管理整个 Kubernete ...
- Jensen 不等式证明
Jensen 不等式定义 若 \(f(x)\) 为区间 \(I\) 上的下凸函数,则对于任意 \(x_{i} \in I\) 和满足 \(\displaystyle\sum_{i=1}^{n} \la ...