SqlSugar新增数据
1、插入方式
1.1 单条插入实体
//返回插入行数db.Insertable(insertObj).ExecuteCommand(); //都是参数化实现//异步: await db.Insertable(insertObj).ExecuteCommandAsync()//插入返回自增列 (实体除ORACLE外实体要配置自增,Oracle需要配置序列)db.Insertable(insertObj).ExecuteReturnIdentity();//异步: await db.Insertable(insertObj).ExecuteReturnIdentityAsync();//返回雪花ID 看文档3.0具体用法(在最底部)long id= db.Insertable(实体).ExecuteReturnSnowflakeId();//导航插入//具体文档:https://www.donet5.com/Home/Doc?typeId=2430//实用技巧1:获取数据库时间我们可以用 var dbTime = db.GetDate();//实用技巧2: 强制设置表名(默认表名来自实体) db.Insertable(insertObj).AS("table01").ExecuteCommand();//更多返回值方法看 1.6 |
1.2 批量 插入实体 (4种)
//(1)、非参数化插入(防注入) //优点:综合性能比较平均,列少1万条也不慢,属于万金油写法,不加事务情况下部分库有失败回滚机质//缺点:数据量超过5万以上占用内存会比较大些,内存小可以用下面2种方式处理db.Insertable(List<实体>).ExecuteCommand() db.Insertable(List<实体>).PageSize(1000).ExecuteCommand() //新功能:分页插入 5.1.4.103-prevoew04+//错误: db.Insertable<List<实体>>(List).ExecuteCommand()//<>里面不能是list//正确: Insertable<实体>(List).ExecuteCommand() //正确: Insertable(List).ExecuteCommand() //(2)、参数化内部分页插入(底层是分页插入)//优点:适合插入条数固定,并且条数较少,请求频繁高的功能(最大利用执行计划缓存)//缺点:个别库500以上就开始慢了,要加事务才能回滚 db.Insertable(List<实体>).UseParameter().ExecuteCommand()//5.0.3.8-Preview及以上版本支持(NUGET搜索勾上包括预览)//(3)、大数据写入(特色功能:大数据处理上比所有框架都要快30%)//优点:1000条以上性能无敌手//缺点:不支持数据库默认值, API功能简单, 小数据量并发执行不如普通插入,插入数据越大越适合用这个//新功能 5.0.44db.Fastest<实体>().PageSize(100000).BulkCopy(List<实体>);//MySql连接字符串要加AllowLoadLocalInfile=true//详细文档:https://www.donet5.com/Home/Doc?typeId=2404//(4)、Into Select ,从一个表导入到另一个表 //优点:性能好//缺点:数据必须在数据库已存在,才能这样插入到新表//例1:不同实体插入 db.Queryable<Order>() //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了 .Select(it=>new { name=it.name,......}) .IntoTable<实体2>(); //例2: 同实体不同表插入 db.Queryable<Order>() //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了.IntoTable<Order>("新表名"); |
1.3 根据字典 插入
//可以是 Dictionary 或者 List<Dictionary >var dc= new Dictionary<string, object>(); dc.Add("name", "1"); dc.Add("CreateTime", DateTime.Now);db.Insertable(dc).AS("student").ExecuteCommand(); |
1.4 根据Datatable 插入
//方案1List<Dictionary<string,object>> dc= db.Utilities.DataTableToDictionaryList(dataTable);//5.0.23版本支持db.Insertable(dc).AS("student").ExecuteReturnIdentity();//注意:5.0.7.7 以下存在BUG//方案2 :直接用datatable插入db.Fastest<System.Data.DataTable>().AS("order").BulkCopy(dataTable);//具体用法 要看文档 https://www.donet5.com/Home/Doc?typeId=2404 |
1.5 匿名、Object、接口、抽象类插入
//1.匿名对象插入(最新)db.InsertableByDynamic(new { name="",price=1 }) .AS("[Order]") .ExecuteCommand(); //2.Object、接口、抽象类插入//o必须是真实的类对象 (比如根据type反射出来的对象,或者转成了Object的实体) db.InsertableByObject(o).ExecuteCommand(); //3.更多功能 :动态建类等https://www.donet5.com/Home/Doc?typeId=2562 |
1.6 插入返回值
| 方法名 | 描述 |
|---|---|
| ExecuteCommand |
注意:批量插入用该方法性能最好 返回数据库受影响的行数,例如查询返回0,更新0条返回0,更新1条返回1 |
|
新功能 (5.1.2.4 prview01 ) ExecuteReturnPkList<T>(); 用例: ExecuteReturnPkList<int>(); ExecuteReturnPkList<Long>(); ExecuteReturnPkList<Guid>(); |
批量返回主键 1、支持 批量返回自增 ,SqlServer和PgSql性能比较好(其它库性能差些) 2、支持返回雪花ID (等同于ExecuteReturnSnowflakeIdList) 3、支持返回GUID 不支持用触发器的主键 |
| ExecuteReturnIdentity | 返回单个自增列 (int) |
| ExecuteReturnBigIdentity | 返回单个自增列 (long) |
| ExecuteReturnEntity | 返回实体(如果有自增会返回到实体里面,不支批量自增,不支持默认值) |
| ExecuteCommandIdentityIntoEntity | 给传入实体添加自增列 (不支持批量) |
| ExecuteReturnSnowflakeId | 返回雪花ID 看文档 3.0用法 5.0.3.5支持 |
| ExecuteReturnSnowflakeIdList | 返回雪花ID集合 文档 3.0用法 5.0.3.5支持 |
2、功能案例
2.1 不插入指定字段
//忽略 name testiddb.Insertable(insertObj).IgnoreColumns(it => new { it.Name, it.TestId }).ExecuteReturnIdentity();db.Insertable(insertObj).IgnoreColumns( "Name","TestId").ExecuteReturnIdentity(); |
2.2 只插入指定字段
//只插入 name schoolid db.Insertable(insertObj).InsertColumns(it => new { it.Name, it.SchoolId }).ExecuteReturnIdentity();db.Insertable(insertObj).InsertColumns("Name","SchoolId").ExecuteReturnIdentity(); |
2.3 NULL列不插入
注意:因为插入的列不同不支持批量操作,如果有需要可以自已循环操作
db.Insertable(insertObj2).IgnoreColumns(ignoreNullColumn:true).ExecuteCommand(); |
2.4 异步
await Db.Insertable(new Order() { Name = "a", CustomId = 1 }).ExecuteCommandAsync(); |
2.5 级联、导航插入
新功能 5.0.9.2
db.InsertNav(list) .Include(z1 => z1.SchoolA)// 插入第一层 SchoolA .ThenInclude(z1 => z1.RoomList) //插入 SchoolA 下面的 RoomList .Include(z1 => z1.Books)//插入第一层 Books .ExecuteCommand(); |
实体配置: https://www.donet5.com/Home/Doc?typeId=2430
2.6 大数据插入
//插入 100万 数秒时间db.Fastest<RealmAuctionDatum>().BulkCopy(GetList());//性能 比现有任何Bulkcopy都要快30%db.Fastest<RealmAuctionDatum>().PageSize(50000).BulkCopy(List<实体>);//大数据分页插 |
更多文档: https://www.donet5.com/Home/Doc?typeId=2404
//如果不支持可以用:普通分页插入 db.Insertable(List<实体>).PageSize(1000).ExecuteCommand();//普通分页插入 |
2.7 插入默认值
方式1:如果数据库存在默认值用这个方法
public class Order{ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } [SugarColumn(IsOnlyIgnoreInsert =true)]//设置后插入会取数据库默认值 public DateTime CreateTime { get; set; }} |
方式2 (5.1.3.41):通过特性指定默认值
//InsertServerTime=true 插入取数据库当前时间 支持多库 //IsOnlyIgnoreUpdate=true 是指在Update操作不更新该列 (可用可不用根据需求来) [SugarColumn(InsertServerTime =true, IsOnlyIgnoreUpdate =true)]// getdate() now() sysdate public DateTime CreateTime { get; set; } //插入根据SQL进行插入 [SugarColumn(InsertSql = "getdate()")] //生成 getdate() public DateTime CreateTime2 { get; set; } [SugarColumn(InsertSql = "''")] // 生成 '' public string Str { get; set; } [SugarColumn(InsertSql = "0")]// 生成 0 public string Str { get; set; } |
方式3:通过AOP实现,文档搜索:AOP , 看标题2
2.8 Guid主键自动赋值
只要设置为主键,并且C#类型是Guid 只要不传值,会自动赋值
注意只能用: ExecuteCommand 方法不能用自增列的方法
2.9 调用实体内方法
var data=new UnitInsertMethod(){ Name="a",Time=DateTime.Now}; db.Insertable(data).ExecuteCommand(); db.Updateable(data).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; } } |
3.0 雪花ID
https://www.donet5.com/Home/Doc?typeId=2561
3.1 强制插入自增列
需要数据库的支持才行,ORM只是把SQL中的 自增列 加上去了,有些需要写脚本
//请升级到:5.1.4.73-preview12db.Insertable(insertObj).OffIdentity().ExecuteCommand() //老版本:SqlServer支持不友好//db.Insertable(insertObj).IgnoreColumns(false,true).ExecuteCommand() |
3.2 Into Select
//例1:不同实体插入 Select Intodb.Queryable<Order>() //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了 .Select(it=>new { name=it.name,......}) .IntoTable<实体2>(); //例2: 同实体不同表插入 db.Queryable<Order>() //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了.IntoTable<Order>("新表名"); |
3.3 分页插入
可以用分页插入慢慢处理
db.Insertable(List<实体>).PageSize(1000).ExecuteCommand();//普通分页db.Fastest<RealmAuctionDatum>().PageSize(100000).BulkCopy(GetList());//大数据分页 |
SqlSugar新增数据的更多相关文章
- Web jquery表格组件 JQGrid 的使用 - 8.Pager、新增数据、查询、刷新、查看数据
系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...
- 使用Hibernate框架,新增数据后如何返回新增数据的全部信息
一.需求描述:一个修改事物(TRANSACTION)先后包括子事物修改和子事物新增,修改事物完成后返回其子事物新增的全部数据 二.实现:若实现修改对象后还需要新增一个新对象,并返回新对象的需求,保存 ...
- SSM Mybatis将新增数据写入数据库时出现的500状态码:Error updating database.的可能
关于maven下ssm整合的项目推荐这篇博客:https://www.cnblogs.com/yiye/p/5969157.html 今日在ssm下的将新增数据写回数据库时遇到不少的问题,现作记录 如 ...
- mybatis入门篇:Mapper接口/关联查询/新增数据
1.数据准备 2.编写实体类 package com.forest.owl.entity; import java.util.Date; public class User { private Lon ...
- ASP.NET新增数据返回自增ID
一.情景引入 项目需求:对于一个数据表(表A)的增.删.改全部要有日志记录,日志表(表B)结构 中需要记录表A的自增ID,这样才能将日志与操作的数据一一对应起来. 对于删和改都好办,获取Model时都 ...
- mybatis学习之路----mysql批量新增数据
原文:https://blog.csdn.net/xu1916659422/article/details/77971867 接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到. ...
- MyBatis基础入门《十三》批量新增数据
MyBatis基础入门<十三>批量新增数据 批量新增数据方式1:(数据小于一万) xml文件 接口: 测试方法: 测试结果: =============================== ...
- C#高效新增数据到数据库(十万级别测试)
我们在对数据库进行新增数据时,怎么能把速度提到最快,时间缩到最短呢?下面针对三种方法进行比较 新增 逐条新增数据模式 Stopwatch s2 = new Stopwatch(); s2.Start( ...
- 【SQL Server】sql server更改了数据表的字段/新增数据表的字段 无法保存
sql server更改了数据表的字段/新增数据表的字段 无法保存 解决方法:进入 工具-->选项-->Designers-->表设计器和数据库设计器-->取消勾选 即可
- Thinkphp5.0 获取新增数据的ID
// 方法1 insertGetId方法新增数据并返回主键值使用getLastInsID方法: Db::name('user')->insert($data); $userId = Db::na ...
随机推荐
- Kubernetes(K8S) Service 介绍
定义一组 Pod 的访问规则 存在的意义 防止 Pod 失联(服务发现),Pod 重启后,IP会变 定义一组 Pod 访问策略,负载均衡 Pod 和 Service 关系 根据 label 和 sel ...
- Pytest.mark.parametrize()基本用法
Pytest.mark.parametrize()基本用法 @pytest.mark.parametrize()基本用法 数据驱动:就是把我们测试用例的数据放到excel,yaml,csv,mysql ...
- Axure RP 9 下载、破解激活教程、最新激活码,亲测可用
本教程适用于 Axure RP 9 Enterprise/Pro/Team 的激活.破解,最新激活码,适用于 windows, mac系统,仅用于学习 简介 Axure RP 9.0 破解版是一款功能 ...
- three.js项目引入vue,因代码编写不当导致的严重影响性能的问题,卡顿掉帧严重
three.js项目引入vue,因代码编写不当导致的严重影响性能的问题,卡顿掉帧严重 问题排查 使用谷歌浏览器的Performance分析页面性能 可以看到vue.js的reactiveGetter方 ...
- Educational Codeforces Round 109 (Rated for Div. 2) 个人补题记录(A~D,AB思维,C模拟构造,D题DP)
补题链接:Here 1525A. Potion-making (思维 [题意描述] 作为一个魔法师,现在我想配置一杯药物浓度为 \(k\%\) 的药水, 每次操作能进行添加: 一升水 一升药物精华 作 ...
- JVM自定义类加载器在代码扩展性的实践
一.背景 名单管理系统是手机上各个模块将需要管控的应用配置到文件中,然后下发到手机上进行应用管控的系统,比如各个应用的耗电量管控:各个模块的管控应用文件考虑到安全问题,有自己的不同的加密方式,按照以往 ...
- ==和equals的区别和联系,StringBuffer和StringBuilder,clone方法
==和equals的区别和联系? ( 1)对于==,比较的是值是否相等 如果作用于基本数据类型的变量,则直接比较其存储的 "值"是否相等: 如果作用于引用类型的变量,则比较的是所指 ...
- 电缆厂 3D 可视化管控系统 | 图扑数字孪生
近年来,我国各类器材制造业已经开始向数字化生产转型,使得生产流程变得更加精准高效.通过应用智能设备.物联网和大数据分析等技术,企业可以更好地监控生产线上的运行和质量情况,及时发现和解决问题,从而提高生 ...
- SpringBoot AOP 记录操作日志、异常日志
使用SpringBoot AOP 记录操作日志.异常日志 我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能.在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因 ...
- [java] - servlet路径跳转
Index.jsp <a href="servlet/HelloServlet">servlet/HelloServlet</a><br> &l ...