NewLife.XCode是一個有10多年曆史的開源資料中介軟體,支援nfx/netstandard,由新生命團隊(2002~2019)開發完成並維護至今,以下簡稱XCode。
整個系列教程會大量結合示例程式碼和執行日誌來進行深入分析,蘊含多年開發經驗於其中,代表作有百億級大資料實時計算專案。
開源地址:https://github.com/NewLifeX/X (求star, 707+)
前文《XCode添刪改》給大家展示了添刪改資料的基本概況,本文將詳解添刪改高階功能。
回到目錄
基本添刪改
最常用的添刪改操作Insert/Update/Delete,實際是根據物體物件生成相應的SQL陳述句,由IEntityPersistence介面實現。
** IEntityPersistence在XCode內部有一個預設實現,使用者可以自定義後註冊到物件容器ObjectContainer中。
Insert 生成標準Insert Into陳述句,根據設定決定是否使用引數化。(引數化設定)
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中,即使是沒有設定數值的欄位,也給予預設值。(自增欄位顯然不需要加入)
生成的Insert Into陳述句,最後一部分是獲取最近插入的自增ID,因此執行Insert以後,user.ID就取得了最新的自增值。
Update 最精彩的部分,莫過於臟資料(後面將有專門文章介紹)。
在XCode中,修改資料的標準流程是,先查出來,修改屬性後儲存。此時生成的update set陳述句,只包含修改過的欄位。
Update User Set Mobile='13012345678', Code='abcdef' Where ID=74
如上,修改了3個欄位,但是Name本來就是“張三”,因此實際上只修改了兩個欄位,也就是說只有兩個欄位有臟資料(數值改變被弄髒了)。
最終生成的update set陳述句,只包含帶有臟資料的欄位。最後的where部分,則由主鍵組成。
Delete 就簡單多了,只取了其中的主鍵欄位,拼接where部分。
Delete From User Where ID=74
Save 是一個包裝操作,它會根據主鍵來判斷呼叫Insert或Update。
- 如果物體物件來自資料庫,Save時呼叫Update;
- 自增主鍵,ID=0時呼叫Insert,否則呼叫Update;
- 非自增主鍵,查詢一次資料庫,如果有資料則Update,沒有則Insert,(這樣子顯然很傻)
回到目錄
多載添刪改
物體類的添刪改操作都可以多載(Insert/Update/Delete/OnInsert/OnUpdate/OnDelete)
多載後可以做業務程式碼判斷,也可以級聯更新其它表,還可以記錄添刪改操作日誌,甚至還可以做假刪除(多載OnDelete然後實際執行OnUpdate)
分為兩組多載,實際執行順序是:Insert=>Valid=>EntityModule=>OnInsert
回到目錄
資料驗證Valid
每個物體類在Insert/Update之前,都需要Valid驗證資料 ,引數isNew以區分Insert。
Valid常常可用於判斷主要欄位的有效性,無效時強烈推薦丟擲引數類異常,魔方NewLife.Cube表單將可以捕獲並定位。
除此之外,Valid用得更多的功能是在Insert/Update之前修改完善欄位資料,例如上面對密碼進行MD5雜湊,以及格式化RoleIDs。
這裡出現新技術,IsDirty和Dirtys,這是XCode的臟資料,前者判斷Password欄位是否有臟資料(Password被賦予跟原來不想等的值),後者清空Password臟資料。
臟資料是生成Update陳述句的核心,不髒的欄位不會出現在update set 之中,實現部分欄位更新,後續有專門章節講解。
回到目錄
物體過濾器
物體過濾器EntityModule,用於攔截物體類的添刪改操作,內建最常用的3個過濾器UserModule/TimeModule/IPModule
前面《XCode資料模型檔案》推薦的8個常用欄位還記得嗎? CreateUser/CreateTime/CreateIP 等,所有CreateAbc將在Insert的時候攔截賦值,所有UpdateAbc將在Insert和Update的時候攔截賦值。
UserModule取當前登入使用者,由ManageProvider驅動;
TimeModule取當前時間;
IPModule取當前訪問IP,由ManageProvider.UserHost提供;
回到目錄
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門。快速展現用法,程式碼配置連線字串
- 資料模型檔案。建立表格欄位和索引,名字以及資料型別規範,推薦欄位(時間,使用者,IP)
- 物體類詳解。資料類業務類,泛型基類,介面
- 功能設定。連線字串,除錯開關,SQL日誌,慢日誌,引數化,執行超時。程式碼與配置檔案設定,連線字串區域性設定
- 反向工程。自動建立資料庫資料表
- 資料初始化。InitData寫入初始化資料
- 高階增刪改。多載攔截,自增欄位,Valid驗證,物體模型(時間,使用者,IP)
- 臟資料。如何產生,怎麼利用
- 增量累加。高併發統計
- 事務處理。單表和多表,不同連線,多種寫法
- 擴充套件屬性。多表關聯,Map對映
- 高階查詢。複雜條件,分頁,自定義擴充套件FieldItem,查總記錄數,查彙總統計
- 資料層快取。Sql快取,更新機制
- 物體快取。全表整理快取,更新機制
- 物件快取。字典快取,適用使用者等資料較多場景。
- 百億級效能。欄位精煉,索引完備,合理查詢,充分利用快取
- 物體工廠。元資料,通用處理程式
- 角色許可權。Membership
- 匯入匯出。Xml,Json,二進位制,網路或檔案
- 分表分庫。常見拆分邏輯
- 高階統計。聚合統計,分組統計
- 批次寫入。批次插入,批次Upsert,非同步儲存
- 物體佇列。寫入級快取,提升效能。
- 備份同步。備份資料,恢復資料,同步資料
- 資料服務。提供RPC介面服務,遠端執行查詢,例如SQLite網路版
- 大資料分析。ETL抽取,排程計算處理,結果持久化
受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。