東莞做營(yíng)銷(xiāo)型網(wǎng)站seo專(zhuān)員是干什么的
系列文章目錄
🎀🎀🎀 .NET開(kāi)源 ORM 框架 SqlSugar 系列 🎀🎀🎀
文章目錄
- 系列文章目錄
- 一、前言 🍃
- 二、插入方式 💯
- 2.1 單條插入實(shí)體
- 2.2 批量 插入實(shí)體
- 2.3 根據(jù)字典插入
- 2.4 根據(jù) Datatable 插入
- 2.5 匿名、Object、接口、抽象類(lèi)插入
- 2.6 插入返回值
- 三、功能案例
- 3.1 不插入指定字段
- 3.2 只插入指定字段
- 3.3 NULL列不插入 💯
- 3.4 異步執(zhí)行
- 3.5 級(jí)聯(lián)、導(dǎo)航插入
- 3.6 大數(shù)據(jù)插入
- 3.7 插入默認(rèn)值
- 3.8 Guid主鍵自動(dòng)賦值
- 3.9 調(diào)用實(shí)體內(nèi)方法
- 3.10 雪花ID
- 3.11 強(qiáng)制插入自增列
- 3.12 Into Select
- 3.13 分頁(yè)插入
- 四、總結(jié)
- 🎀🎀🎀 .NET開(kāi)源 ORM 框架 SqlSugar 系列 🎀🎀🎀
一、前言 🍃
前面的章節(jié)介紹了各種 SqlSugar
各種場(chǎng)景的 查詢(xún) 操作,接下來(lái)將介紹 SqlSugar
增、刪、改 相關(guān)操作。數(shù)據(jù)庫(kù) 插入 數(shù)據(jù)的方法包括:使用 SQL
插入語(yǔ)句、通過(guò) ORM
框架、使用 批量插入 技術(shù)、利用 存儲(chǔ)過(guò)程。
二、插入方式 💯
2.1 單條插入實(shí)體
單條插入實(shí)體是最常見(jiàn)也是最基本的用法,以下羅列了一些單條實(shí)體插入的示例。
- 🔢返回插入行數(shù)
- 🛗插入返回自增列 (實(shí)體除
ORACLE
外實(shí)體要配置自增,Oracle
需要配置序列) - ??返回雪花ID
- 🧭導(dǎo)航插入
- ??獲取數(shù)據(jù)庫(kù)時(shí)間
- 🎯強(qiáng)制設(shè)置表名
🌰 具體 demo 如下:
//返回插入行數(shù)
db.Insertable(insertObj).ExecuteCommand(); //都是參數(shù)化實(shí)現(xiàn)
//異步: await db.Insertable(insertObj).ExecuteCommandAsync()//插入返回自增列 (實(shí)體除ORACLE外實(shí)體要配置自增,Oracle需要配置序列)
db.Insertable(insertObj).ExecuteReturnIdentity();
//異步: await db.Insertable(insertObj).ExecuteReturnIdentityAsync();//返回雪花ID
long id= db.Insertable(實(shí)體).ExecuteReturnSnowflakeId();//導(dǎo)航插入
//具體文檔:https://www.donet5.com/Home/Doc?typeId=2430//實(shí)用技巧1:獲取數(shù)據(jù)庫(kù)時(shí)間我們可以用
var dbTime = db.GetDate();
//實(shí)用技巧2: 強(qiáng)制設(shè)置表名(默認(rèn)表名來(lái)自實(shí)體)
db.Insertable(insertObj).AS("table01").ExecuteCommand();//更多返回值方法看 1.6
2.2 批量 插入實(shí)體
批量插入主要有如下四種方式🆚:
-
非參數(shù)化插入(防注入)
- ?優(yōu)點(diǎn):綜合性能比較平均,列少1萬(wàn)條也不慢,屬于萬(wàn)金油寫(xiě)法,不加事務(wù)情況下部分庫(kù)有失敗回滾機(jī)質(zhì)。
- 🚫缺點(diǎn):數(shù)據(jù)量超過(guò)5萬(wàn)以上占用內(nèi)存會(huì)比較大些,內(nèi)存小可以用下面2種方式處理。
-
參數(shù)化內(nèi)部分頁(yè)插入(底層是分頁(yè)插入)
- ?優(yōu)點(diǎn):適合插入條數(shù)固定,并且條數(shù)較少,請(qǐng)求頻繁高的功能(最大利用執(zhí)行計(jì)劃緩存)。
- 🚫缺點(diǎn):個(gè)別庫(kù)500以上就開(kāi)始慢了,要加事務(wù)才能回滾。
-
大數(shù)據(jù)寫(xiě)入(特色功能:大數(shù)據(jù)處理上比所有框架都要快30%)
- ?優(yōu)點(diǎn):1000條以上性能無(wú)敵手。
- 🚫缺點(diǎn):不支持?jǐn)?shù)據(jù)庫(kù)默認(rèn)值, API功能簡(jiǎn)單, 小數(shù)據(jù)量并發(fā)執(zhí)行不如普通插入,插入數(shù)據(jù)越大越適合用這個(gè)。
-
Into Select ,從一個(gè)表導(dǎo)入到另一個(gè)表
- ?優(yōu)點(diǎn):性能好。
- 🚫缺點(diǎn):數(shù)據(jù)必須在數(shù)據(jù)庫(kù)已存在,才能這樣插入到新表。
//(1)、非參數(shù)化插入(防注入)
//優(yōu)點(diǎn):綜合性能比較平均,列少1萬(wàn)條也不慢,屬于萬(wàn)金油寫(xiě)法,不加事務(wù)情況下部分庫(kù)有失敗回滾機(jī)質(zhì)
//缺點(diǎn):數(shù)據(jù)量超過(guò)5萬(wàn)以上占用內(nèi)存會(huì)比較大些,內(nèi)存小可以用下面2種方式處理
db.Insertable(List<實(shí)體>).ExecuteCommand()
db.Insertable(List<實(shí)體>).PageSize(1000).ExecuteCommand() //新功能:分頁(yè)插入 5.1.4.103+
//錯(cuò)誤: db.Insertable<List<實(shí)體>>(List).ExecuteCommand()//<>里面不能是list
//正確: Insertable<實(shí)體>(List).ExecuteCommand()
//正確: Insertable(List).ExecuteCommand() //(2)、參數(shù)化內(nèi)部分頁(yè)插入(底層是分頁(yè)插入)
//優(yōu)點(diǎn):適合插入條數(shù)固定,并且條數(shù)較少,請(qǐng)求頻繁高的功能(最大利用執(zhí)行計(jì)劃緩存)
//缺點(diǎn):個(gè)別庫(kù)500以上就開(kāi)始慢了,要加事務(wù)才能回滾
db.Insertable(List<實(shí)體>).UseParameter().ExecuteCommand()//5.0.3.8及以上 //(3)、大數(shù)據(jù)寫(xiě)入(特色功能:大數(shù)據(jù)處理上比所有框架都要快30%)
//優(yōu)點(diǎn):1000條以上性能無(wú)敵手
//缺點(diǎn):不支持?jǐn)?shù)據(jù)庫(kù)默認(rèn)值, API功能簡(jiǎn)單, 小數(shù)據(jù)量并發(fā)執(zhí)行不如普通插入,插入數(shù)據(jù)越大越適合用這個(gè)
//新功能 5.0.44
db.Fastest<實(shí)體>().PageSize(100000).BulkCopy(List<實(shí)體>);//MySql連接字符串要加AllowLoadLocalInfile=true
//詳細(xì)文檔:https://www.donet5.com/Home/Doc?typeId=2404//(4)、Into Select ,從一個(gè)表導(dǎo)入到另一個(gè)表
//優(yōu)點(diǎn):性能好
//缺點(diǎn):數(shù)據(jù)必須在數(shù)據(jù)庫(kù)已存在,才能這樣插入到新表//例1:不同實(shí)體插入
db.Queryable<Order>()//.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不過(guò)ID就不一樣了 .Select(it=>new { name=it.name,......}) .IntoTable<實(shí)體2>();//例2: 同實(shí)體不同表插入
db.Queryable<Order>()//.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不過(guò)ID就不一樣了
.IntoTable<Order>("新表名");
2.3 根據(jù)字典插入
//可以是 Dictionary 或者 List<Dictionary >
var dc= new Dictionary<string, object>();dc.Add("name", "1");dc.Add("CreateTime", DateTime.Now);
db.Insertable(dc).AS("student").ExecuteCommand();
2.4 根據(jù) Datatable 插入
//方案1
List<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
2.5 匿名、Object、接口、抽象類(lèi)插入
//1.匿名對(duì)象插入(最新)
db.InsertableByDynamic(new { name="",price=1 }).AS("[Order]").ExecuteCommand();//2.Object、接口、抽象類(lèi)插入
//o必須是真實(shí)的類(lèi)對(duì)象 (比如根據(jù)type反射出來(lái)的對(duì)象,或者轉(zhuǎn)成了Object的實(shí)體)db.InsertableByObject(o).ExecuteCommand();//3.更多功能 :動(dòng)態(tài)建類(lèi)等
https://www.donet5.com/Home/Doc?typeId=2562
2.6 插入返回值
三、功能案例
3.1 不插入指定字段
//忽略 name testid
db.Insertable(insertObj).IgnoreColumns(it => new { it.Name, it.TestId }).ExecuteReturnIdentity();
db.Insertable(insertObj).IgnoreColumns( "Name","TestId").ExecuteReturnIdentity();
3.2 只插入指定字段
//只插入 name schoolid
db.Insertable(insertObj).InsertColumns(it => new { it.Name, it.SchoolId }).ExecuteReturnIdentity();
db.Insertable(insertObj).InsertColumns("Name","SchoolId").ExecuteReturnIdentity();
3.3 NULL列不插入 💯
注意:因?yàn)椴迦氲牧胁煌恢С峙坎僮?#xff0c;如果有需要可以自已循環(huán)操作
db.Insertable(insertObj2).IgnoreColumns(ignoreNullColumn:true).ExecuteCommand();
3.4 異步執(zhí)行
await Db.Insertable(new Order() { Name = "a", CustomId = 1 }).ExecuteCommandAsync();
3.5 級(jí)聯(lián)、導(dǎo)航插入
db.InsertNav(list).Include(z1 => z1.SchoolA)// 插入第一層 SchoolA.ThenInclude(z1 => z1.RoomList) //插入 SchoolA 下面的 RoomList.Include(z1 => z1.Books)//插入第一層 Books.ExecuteCommand();
3.6 大數(shù)據(jù)插入
//插入 100萬(wàn) 數(shù)秒時(shí)間
db.Fastest<RealmAuctionDatum>().BulkCopy(GetList());//性能 比現(xiàn)有任何Bulkcopy都要快30%
db.Fastest<RealmAuctionDatum>().PageSize(50000).BulkCopy(List<實(shí)體>);//大數(shù)據(jù)分頁(yè)插
//如果不支持可以用:普通分頁(yè)插入
db.Insertable(List<實(shí)體>).PageSize(1000).ExecuteCommand();//普通分頁(yè)插入
3.7 插入默認(rèn)值
方式1: 如果數(shù)據(jù)庫(kù)存在默認(rèn)值用這個(gè)方法
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)]//設(shè)置后插入會(huì)取數(shù)據(jù)庫(kù)默認(rèn)值public DateTime CreateTime { get; set; }
}
方式2:通過(guò)特性指定默認(rèn)值
//InsertServerTime=true 插入取數(shù)據(jù)庫(kù)當(dāng)前時(shí)間 支持多庫(kù) //IsOnlyIgnoreUpdate=true 是指在Update操作不更新該列 (可用可不用根據(jù)需求來(lái))[SugarColumn(InsertServerTime =true, IsOnlyIgnoreUpdate =true)]// getdate() now() sysdatepublic DateTime CreateTime { get; set; }//插入根據(jù)SQL進(jìn)行插入 [SugarColumn(InsertSql = "getdate()")] //生成 getdate()public DateTime CreateTime2 { get; set; }[SugarColumn(InsertSql = "''")] // 生成 ''public string Str { get; set; }[SugarColumn(InsertSql = "0")]// 生成 0public string Str { get; set; }
方式3: 通過(guò)AOP實(shí)現(xiàn),會(huì)有單獨(dú)篇幅介紹
3.8 Guid主鍵自動(dòng)賦值
只要設(shè)置為主鍵,并且 C#
類(lèi)型是 Guid
只要不傳值,會(huì)自動(dòng)賦值。
🎯注意: 只能用ExecuteCommand
方法不能用自增列的方法
3.9 調(diào)用實(shí)體內(nèi)方法
var data=new UnitInsertMethod(){ Name="a",Time=DateTime.Now};db.Insertable(data).ExecuteCommand();db.Updateable(data).CallEntityMethod(it => it.modify("admint")).ExecuteCommand();//實(shí)體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.10 雪花ID
詳情請(qǐng)移步:SqlSugar雪花ID常見(jiàn)問(wèn)題
3.11 強(qiáng)制插入自增列
🎯需要數(shù)據(jù)庫(kù)的支持才行,ORM
只是把 SQL
中的 自增列 加上去了,有些需要寫(xiě)腳本。
//請(qǐng)升級(jí)到:5.1.4.73-preview12
db.Insertable(insertObj).OffIdentity().ExecuteCommand() //老版本:SqlServer支持不友好
//db.Insertable(insertObj).IgnoreColumns(false,true).ExecuteCommand()
3.12 Into Select
//例1:不同實(shí)體插入 Select Into
db.Queryable<Order>()//.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不過(guò)ID就不一樣了 .Select(it=>new { name=it.name,......}) .IntoTable<實(shí)體2>();//例2: 同實(shí)體不同表插入
db.Queryable<Order>()//.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不過(guò)ID就不一樣了
.IntoTable<Order>("新表名");
3.13 分頁(yè)插入
可以用分頁(yè)插入慢慢處理
db.Insertable(List<實(shí)體>).PageSize(1000).ExecuteCommand();//普通分頁(yè)
db.Fastest<RealmAuctionDatum>().PageSize(100000).BulkCopy(GetList());//大數(shù)據(jù)分頁(yè)
四、總結(jié)
以上介紹了 SqlSugar 的各種插入操作,除此之外還有 無(wú)實(shí)體插入、導(dǎo)航插入、AOP插入等等。
🎀🎀🎀 .NET開(kāi)源 ORM 框架 SqlSugar 系列 🎀🎀🎀
【開(kāi)篇】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【入門(mén)必看】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【實(shí)體配置】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【Db First】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【Code First】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【數(shù)據(jù)事務(wù)】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【連接池】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【查詢(xún)目錄】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【查詢(xún)基礎(chǔ)】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【排序用法】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【分組去重】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【聯(lián)表查詢(xún)】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【導(dǎo)航查詢(xún)】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【子查詢(xún)】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【嵌套查詢(xún)】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【配置查詢(xún)】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【并集查詢(xún)】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【樹(shù)型查詢(xún)】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【表格查詢(xún)】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【動(dòng)態(tài)表達(dá)式】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【查詢(xún)函數(shù)】.NET開(kāi)源ORM框架 SqlSugar 系列
【過(guò)濾器】.NET開(kāi)源 ORM 框架 SqlSugar 系列
【跨庫(kù)查詢(xún)、多庫(kù)查詢(xún)】.NET開(kāi)源 ORM 框架
?【報(bào)表查詢(xún)】.NET開(kāi)源ORM框架 SqlSugar 系列
【W(wǎng)here語(yǔ)法全解密】.NET開(kāi)源ORM框架 SqlSugar 系列
【Select 語(yǔ)法全解密】.NET開(kāi)源ORM框架 SqlSugar 系列