[NewLife.XCode]高級增刪改


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。

  1. 如果實體對象來自數據庫,Save時調用Update;
  2. 自增主鍵,ID=0時調用Insert,否則調用Update;
  3. 非自增主鍵,查詢一次數據庫,如果有數據則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版]

  1. 增刪改查入門。快速展現用法,代碼配置連接字符串
  2. 數據模型文件。建立表格字段和索引,名字以及數據類型規范,推薦字段(時間,用戶,IP)
  3. 實體類詳解。數據類業務類,泛型基類,接口
  4. 功能設置。連接字符串,調試開關,SQL日志,慢日志,參數化,執行超時。代碼與配置文件設置,連接字符串局部設置
  5. 反向工程。自動建立數據庫數據表
  6. 數據初始化。InitData寫入初始化數據
  7. 高級增刪改。重載攔截,自增字段,Valid驗證,實體模型(時間,用戶,IP)
  8. 臟數據。如何產生,怎么利用
  9. 增量累加。高並發統計
  10. 事務處理。單表和多表,不同連接,多種寫法
  11. 擴展屬性。多表關聯,Map映射
  12. 高級查詢。復雜條件,分頁,自定義擴展FieldItem,查總記錄數,查匯總統計
  13. 數據層緩存。Sql緩存,更新機制
  14. 實體緩存。全表整理緩存,更新機制
  15. 對象緩存。字典緩存,適用用戶等數據較多場景。
  16. 百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存
  17. 實體工廠。元數據,通用處理程序
  18. 角色權限。Membership
  19. 導入導出。Xml,Json,二進制,網絡或文件
  20. 分表分庫。常見拆分邏輯
  21. 高級統計。聚合統計,分組統計
  22. 批量寫入。批量插入,批量Upsert,異步保存
  23. 實體隊列。寫入級緩存,提升性能。
  24. 備份同步。備份數據,恢復數據,同步數據
  25. 數據服務。提供RPC接口服務,遠程執行查詢,例如SQLite網絡版
  26. 大數據分析。ETL抽取,調度計算處理,結果持久化

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM