[NewLife.XCode]高級(jí)增刪改
NewLife.XCode是一個(gè)有10多年歷史的開(kāi)源數(shù)據(jù)中間件,支持nfx/netstandard,由新生命團(tuán)隊(duì)(2002~2019)開(kāi)發(fā)完成并維護(hù)至今,以下簡(jiǎn)稱XCode。
整個(gè)系列教程會(huì)大量結(jié)合示例代碼和運(yùn)行日志來(lái)進(jìn)行深入分析,蘊(yùn)含多年開(kāi)發(fā)經(jīng)驗(yàn)于其中,代表作有百億級(jí)大數(shù)據(jù)實(shí)時(shí)計(jì)算項(xiàng)目。
開(kāi)源地址:https://github.com/NewLifeX/X (求star, 707+)
前文《XCode添刪改》給大家展示了添刪改數(shù)據(jù)的基本概況,本文將詳解添刪改高級(jí)功能。
基本添刪改
最常用的添刪改操作Insert/Update/Delete,實(shí)際是根據(jù)實(shí)體對(duì)象生成相應(yīng)的SQL語(yǔ)句,由IEntityPersistence接口實(shí)現(xiàn)。
** IEntityPersistence在XCode內(nèi)部有一個(gè)默認(rèn)實(shí)現(xiàn),用戶可以自定義后注冊(cè)到對(duì)象容器ObjectContainer中。
Insert 生成標(biāo)準(zhǔn)Insert Into語(yǔ)句,根據(jù)設(shè)置決定是否使用參數(shù)化。(參數(shù)化設(shè)置)

Insert Into User(Name, Password, DisplayName, Sex, Mail, Mobile, Code, Avatar, RoleID, RoleIDs, DepartmentID, Online, Enable, Logins, LastLogin, LastLoginIP, RegisterTime, RegisterIP, Ex1, Ex2, Ex3, Ex4, Ex5, Ex6, UpdateUser, UpdateUserID, UpdateIP, UpdateTime, Remark) Values('張三', 'E10ADC3949BA59ABBE56E057F20F883E', null, 0, null, null, null, null, 0, null, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, null, null, null, null, 0, null, null, null);Select last_insert_rowid() newid
Insert把所有字段加入到SQL中,即使是沒(méi)有設(shè)置數(shù)值的字段,也給予默認(rèn)值。(自增字段顯然不需要加入)
生成的Insert Into語(yǔ)句,最后一部分是獲取最近插入的自增ID,因此執(zhí)行Insert以后,user.ID就取得了最新的自增值。
Update 最精彩的部分,莫過(guò)于臟數(shù)據(jù)(后面將有專門(mén)文章介紹)。
在XCode中,修改數(shù)據(jù)的標(biāo)準(zhǔn)流程是,先查出來(lái),修改屬性后保存。此時(shí)生成的update set語(yǔ)句,只包含修改過(guò)的字段。

Update User Set Mobile='13012345678', Code='abcdef' Where ID=74
如上,修改了3個(gè)字段,但是Name本來(lái)就是“張三”,因此實(shí)際上只修改了兩個(gè)字段,也就是說(shuō)只有兩個(gè)字段有臟數(shù)據(jù)(數(shù)值改變被弄臟了)。
最終生成的update set語(yǔ)句,只包含帶有臟數(shù)據(jù)的字段。最后的where部分,則由主鍵組成。
Delete 就簡(jiǎn)單多了,只取了其中的主鍵字段,拼接where部分。

Delete From User Where ID=74
Save 是一個(gè)包裝操作,它會(huì)根據(jù)主鍵來(lái)判斷調(diào)用Insert或Update。
- 如果實(shí)體對(duì)象來(lái)自數(shù)據(jù)庫(kù),Save時(shí)調(diào)用Update;
- 自增主鍵,ID=0時(shí)調(diào)用Insert,否則調(diào)用Update;
- 非自增主鍵,查詢一次數(shù)據(jù)庫(kù),如果有數(shù)據(jù)則Update,沒(méi)有則Insert,(這樣子顯然很傻)
重載添刪改
實(shí)體類的添刪改操作都可以重載(Insert/Update/Delete/OnInsert/OnUpdate/OnDelete)


重載后可以做業(yè)務(wù)代碼判斷,也可以級(jí)聯(lián)更新其它表,還可以記錄添刪改操作日志,甚至還可以做假刪除(重載OnDelete然后實(shí)際執(zhí)行OnUpdate)
分為兩組重載,實(shí)際執(zhí)行順序是:Insert=>Valid=>EntityModule=>OnInsert
數(shù)據(jù)驗(yàn)證Valid
每個(gè)實(shí)體類在Insert/Update之前,都需要Valid驗(yàn)證數(shù)據(jù) ,參數(shù)isNew以區(qū)分Insert。

Valid常常可用于判斷主要字段的有效性,無(wú)效時(shí)強(qiáng)烈推薦拋出參數(shù)類異常,魔方NewLife.Cube表單將可以捕獲并定位。
除此之外,Valid用得更多的功能是在Insert/Update之前修改完善字段數(shù)據(jù),例如上面對(duì)密碼進(jìn)行MD5散列,以及格式化RoleIDs。
這里出現(xiàn)新技術(shù),IsDirty和Dirtys,這是XCode的臟數(shù)據(jù),前者判斷Password字段是否有臟數(shù)據(jù)(Password被賦予跟原來(lái)不想等的值),后者清空Password臟數(shù)據(jù)。
臟數(shù)據(jù)是生成Update語(yǔ)句的核心,不臟的字段不會(huì)出現(xiàn)在update set 之中,實(shí)現(xiàn)部分字段更新,后續(xù)有專門(mén)章節(jié)講解。
實(shí)體過(guò)濾器
實(shí)體過(guò)濾器EntityModule,用于攔截實(shí)體類的添刪改操作,內(nèi)置最常用的3個(gè)過(guò)濾器UserModule/TimeModule/IPModule
前面《XCode數(shù)據(jù)模型文件》推薦的8個(gè)常用字段還記得嗎? CreateUser/CreateTime/CreateIP 等,所有CreateAbc將在Insert的時(shí)候攔截賦值,所有UpdateAbc將在Insert和Update的時(shí)候攔截賦值。
UserModule取當(dāng)前登錄用戶,由ManageProvider驅(qū)動(dòng);
TimeModule取當(dāng)前時(shí)間;
IPModule取當(dāng)前訪問(wèn)IP,由ManageProvider.UserHost提供;
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門(mén)。快速展現(xiàn)用法,代碼配置連接字符串
- 數(shù)據(jù)模型文件。建立表格字段和索引,名字以及數(shù)據(jù)類型規(guī)范,推薦字段(時(shí)間,用戶,IP)
- 實(shí)體類詳解。數(shù)據(jù)類業(yè)務(wù)類,泛型基類,接口
- 功能設(shè)置。連接字符串,調(diào)試開(kāi)關(guān),SQL日志,慢日志,參數(shù)化,執(zhí)行超時(shí)。代碼與配置文件設(shè)置,連接字符串局部設(shè)置
- 反向工程。自動(dòng)建立數(shù)據(jù)庫(kù)數(shù)據(jù)表
- 數(shù)據(jù)初始化。InitData寫(xiě)入初始化數(shù)據(jù)
- 高級(jí)增刪改。重載攔截,自增字段,Valid驗(yàn)證,實(shí)體模型(時(shí)間,用戶,IP)
- 臟數(shù)據(jù)。如何產(chǎn)生,怎么利用
- 增量累加。高并發(fā)統(tǒng)計(jì)
- 事務(wù)處理。單表和多表,不同連接,多種寫(xiě)法
- 擴(kuò)展屬性。多表關(guān)聯(lián),Map映射
- 高級(jí)查詢。復(fù)雜條件,分頁(yè),自定義擴(kuò)展FieldItem,查總記錄數(shù),查匯總統(tǒng)計(jì)
- 數(shù)據(jù)層緩存。Sql緩存,更新機(jī)制
- 實(shí)體緩存。全表整理緩存,更新機(jī)制
- 對(duì)象緩存。字典緩存,適用用戶等數(shù)據(jù)較多場(chǎng)景。
- 百億級(jí)性能。字段精煉,索引完備,合理查詢,充分利用緩存
- 實(shí)體工廠。元數(shù)據(jù),通用處理程序
- 角色權(quán)限。Membership
- 導(dǎo)入導(dǎo)出。Xml,Json,二進(jìn)制,網(wǎng)絡(luò)或文件
- 分表分庫(kù)。常見(jiàn)拆分邏輯
- 高級(jí)統(tǒng)計(jì)。聚合統(tǒng)計(jì),分組統(tǒng)計(jì)
- 批量寫(xiě)入。批量插入,批量Upsert,異步保存
- 實(shí)體隊(duì)列。寫(xiě)入級(jí)緩存,提升性能。
- 備份同步。備份數(shù)據(jù),恢復(fù)數(shù)據(jù),同步數(shù)據(jù)
- 數(shù)據(jù)服務(wù)。提供RPC接口服務(wù),遠(yuǎn)程執(zhí)行查詢,例如SQLite網(wǎng)絡(luò)版
- 大數(shù)據(jù)分析。ETL抽取,調(diào)度計(jì)算處理,結(jié)果持久化

浙公網(wǎng)安備 33010602011771號(hào)