歡迎光臨
每天分享高質量文章

[NewLife.XCode]增刪改查入門

NewLife.XCode是一個有10多年曆史的開源資料中介軟體,由新生命團隊(2002~2019)開發完成並維護至今,以下簡稱XCode。

整個系列教程會大量結合示例程式碼和執行日誌來進行深入分析,蘊含多年開發經驗於其中。

開源地址:https://github.com/NewLifeX/X

回到目錄

增刪改查入門

新建控制檯專案(.NET Core),從nuget取用NewLife.XCode,(也可以從別的專案取用下載後複製XCode.dll和NewLife.Core.dll來使用,區分nfx和netcore版本),敲入以下程式碼

// 啟用控制檯日誌
XTrace.UseConsole();

// 新增
var user = new UserX
{
    Name = "大石頭",
    Enable = true
};
user.Insert();
// 自增欄位user.ID已經取得值
XTrace.WriteLine("使用者ID:{0}", user.ID);

// 查詢
var user2 = UserX.Find(UserX._.Name == "大石頭");

// 更新
user2.Logins++;
user2.LastLogin = DateTime.Now;
user2.Update();

// 刪除
var user3 = UserX.FindByID(user.ID);
user3.Delete();

Console.ReadLine();

先跑起來看看效果:

#Software: ConsoleApp4
#ProcessID: 21252 x64
#AppDomain: ConsoleApp4
#FileName: C:\Program Files\dotnet\dotnet.exe
#BaseDirectory: D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\
#CommandLine: D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\ConsoleApp4.dll
#ApplicationType: Console
#CLR: 4.0.30319.42000, 
#OS: Microsoft Windows NT 6.2.9200.0, X3/Stone
#CPU: 8
#GC: IsServerGC=False, LatencyMode=Interactive
#Date: 2019-02-25
#欄位: 時間 執行緒ID 執行緒池Y網頁W普通N 執行緒名 訊息內容
#Fields: Time ThreadID IsPoolThread ThreadName Message
22:57:13.089  1 N - NewLife.Core v8.0.2019.0101 Build 2019-01-26 23:22:36 
22:57:13.104  1 N - 新生命X元件核心庫 ©2002-2019 新生命開發團隊
22:57:13.114  1 N - ConsoleApp4 v1.0.0.0 Build 2000-01-01 
22:57:13.115  1 N - ConsoleApp4 
22:57:13.115  1 N - Setting的配置檔案Config\Core.config 不存在,準備用預設配置改寫!
22:57:13.277  1 N - Setting的配置檔案Config\XCode.config 不存在,準備用預設配置改寫!
22:57:13.282  1 N - XCode v9.10.2019.0101 Build 2019-01-26 23:22:38 
22:57:13.282  1 N - 資料中介軟體 ©2002-2019 新生命開發團隊
22:57:13.628  1 N - 自動為[Membership]設定SQLite連線字串:Data Source=.\Membership.db;Migration=On
22:57:13.652  1 N - System.Data.SQLite.dll不存在或平臺版本不正確,準備聯網獲取 http://x.newlifex.com/
22:57:13.835  1 N - 下載連結 http://x.newlifex.com/,標的 System.Data.SQLite.win-x64,System.Data.SQLite.win,System.Data.SQLite.st,System.Data.SQLite
22:57:13.964  4 Y 1 WebClientX.Get http://x.newlifex.com/
22:57:15.660  1 N - 分析得到檔案 System.Data.SQLite.win-x64_20180823112512.zip,準備下載 http://x.newlifex.com/System.Data.SQLite.win-x64_20180823112512.zip
22:57:15.663  4 Y 19 WebClientX.Get http://x.newlifex.com/System.Data.SQLite.win-x64_20180823112512.zip
22:57:16.897  1 N - 下載完成,共924,475位元組,耗時1,232毫秒
22:57:16.897  1 N - 解壓縮到 D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Plugins
22:57:17.074  1 N - TypeX.GetType("System.Data.SQLite.SQLiteFactory") => Plugins\System.Data.SQLite.dll
22:57:17.074  1 N - System.Data.SQLite驅動D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Plugins\System.Data.SQLite.dll 版本v1.0.109.0
22:57:17.145  1 N - Data Source=D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Membership.db;Cache Size=-524288;Synchronous=Off;Journal Mode=WAL
22:57:17.154  4 Y 198 檢查物體XCode.Membership.UserX的資料表架構,樣式:CheckTableWhenFirstUse
22:57:17.160  4 Y 198 建立資料庫:Membership
22:57:17.161  4 Y 198 建立資料庫:D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Membership.db
22:57:17.181  4 Y 198 select * from sqlite_master
22:57:17.284  4 Y 198 建立表:User(使用者)
22:57:17.298  4 Y 198 Create Table User(
    ID integer Primary Key AUTOINCREMENT,
    Name nvarchar(50) NOT NULL COLLATE NOCASE,
    Password nvarchar(50) NULL COLLATE NOCASE,
    DisplayName nvarchar(50) NULL COLLATE NOCASE,
    Sex int NOT NULL,
    Mail nvarchar(50) NULL COLLATE NOCASE,
    Mobile nvarchar(50) NULL COLLATE NOCASE,
    Code nvarchar(50) NULL COLLATE NOCASE,
    Avatar nvarchar(200) NULL COLLATE NOCASE,
    RoleID int NOT NULL,
    RoleIDs nvarchar(200) NULL COLLATE NOCASE,
    DepartmentID int NOT NULL,
    Online bit NOT NULL,
    Enab...etime NULL,
    LastLoginIP nvarchar(50) NULL COLLATE NOCASE,
    RegisterTime datetime NULL,
    RegisterIP nvarchar(50) NULL COLLATE NOCASE,
    Ex1 int NOT NULL,
    Ex2 int NOT NULL,
    Ex3 real NOT NULL,
    Ex4 nvarchar(50) NULL COLLATE NOCASE,
    Ex5 nvarchar(50) NULL COLLATE NOCASE,
    Ex6 nvarchar(50) NULL COLLATE NOCASE,
    UpdateUser nvarchar(50) NULL COLLATE NOCASE,
    UpdateUserID int NOT NULL,
    UpdateIP nvarchar(50) NULL COLLATE NOCASE,
    UpdateTime datetime NULL,
    Remark nvarchar(200) NULL COLLATE NOCASE
)
22:57:17.309  4 Y 198 Create Unique Index IU_User_Name On User (Name)
22:57:17.311  4 Y 198 Create Index IX_User_RoleID On User (RoleID)
22:57:17.312  4 Y 198 Create Index IX_User_UpdateTime On User (UpdateTime)
22:57:17.320  4 Y 198 UserX.Count 快速計算表記錄數(非精確)[User/Membership] 參考值 -2
22:57:17.332  4 Y 198 開始檢查連線[Membership/SQLite]的資料庫架構……
22:57:17.355  4 Y 198 [Membership]的所有物體類(5個):Parameter,UserX,Menu,Role,Department
22:57:17.356  4 Y 198 [Membership]需要檢查架構的物體類(1個):Parameter
22:57:17.357  4 Y 198 Membership待檢查表架構的物體個數:1
22:57:17.358  4 Y 198 select * from sqlite_master
22:57:17.365  4 Y 198 建立表:Parameter(字典引數)
22:57:17.368  4 Y 198 Create Table Parameter(
    ID integer Primary Key AUTOINCREMENT,
    Category nvarchar(50) NULL COLLATE NOCASE,
    Name nvarchar(50) NULL COLLATE NOCASE,
    Value nvarchar(200) NULL COLLATE NOCASE,
    LongValue nvarchar(2000) NULL COLLATE NOCASE,
    Kind int NOT NULL,
    Enable bit NOT NULL,
    Ex1 int NOT NULL,
    Ex2 int NOT NULL,
    Ex3 real NOT NULL,
    Ex4 nvarchar(50) NULL COLLATE NOCASE,
    Ex5 nvarchar(50) NULL COLLATE NOCASE,
    Ex6 nvarchar(50) NULL COLLATE NOCASE,
    CreateUser nvarchar(50) NULL COLLATE NOCASE,
    CreateUserID int NOT NULL,
    CreateIP nvarchar(50) NULL COLLATE NOCASE,
    CreateTime datetime NULL,
    UpdateUser nvarchar(50) NULL COLLATE NOCASE,
    UpdateUserID int NOT NULL,
    UpdateIP nvarchar(50) NULL COLLATE NOCASE,
    UpdateTime datetime NULL,
    Remark nvarchar(200) NULL COLLATE NOCASE
)
22:57:17.369  4 Y 198 Create Unique Index IU_Parameter_Category_Name On Parameter (Category, Name)
22:57:17.370  4 Y 198 Create Index IX_Parameter_Name On Parameter (Name)
22:57:17.370  4 Y 198 Create Index IX_Parameter_UpdateTime On Parameter (UpdateTime)
22:57:17.372  4 Y 198 檢查連線[Membership/SQLite]的資料庫架構耗時38ms
22:57:17.383  4 Y 198 Select * From User Order By ID Desc limit 1
22:57:17.388  4 Y 198 Select Count(*) From User
22:57:17.398  4 Y 198 Select Count(*) From User
22:57:17.401  4 Y 198 開始初始化UserX使用者資料……
22:57:17.455  4 Y 198 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('admin', '21232F297A57A5A743894A0E4A801FC3', '管理員', 0, null, null, null, null, 1, '', 0, 0, 1, 0, null, null, null, null, 0, 0, 0, null, null, null, null, 0, null, null, null);Select last_insert_rowid() newid
22:57:17.479  4 Y 198 自動為[Log]設定SQLite連線字串:Data Source=.\Log.db;Migration=On
22:57:17.491  4 Y 198 Data Source=D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Log.db;Cache Size=-524288;Synchronous=Off;Journal Mode=WAL
22:57:17.514  4 Y 198 完成初始化UserX使用者資料!
22:57:17.548  1 N - 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('大石頭', null, null, 0, null, null, null, null, 0, null, 0, 0, 1, 0, null, null, null, null, 0, 0, 0, null, null, null, null, 0, null, null, null);Select last_insert_rowid() newid
22:57:17.561  1 N - 使用者ID:2
22:57:17.574  1 N - Select * From User Where Name='大石頭' Order By ID Desc limit 1
22:57:17.601  1 N - Update User Set Logins=Logins+1, LastLogin='2019-02-25 22:57:17' Where ID=2
22:57:17.613  1 N - Select * From User Order By ID Desc
22:57:17.620  1 N - Delete From User Where ID=2
22:57:18.519  6 Y 199 檢查物體XCode.Membership.Log的資料表架構,樣式:CheckTableWhenFirstUse
22:57:18.520  6 Y 199 建立資料庫:Log
22:57:18.521  6 Y 199 建立資料庫:D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Log.db
22:57:18.532  6 Y 199 建立表:Log(日誌)
22:57:18.537  4 Y EQ 開始檢查連線[Log/SQLite]的資料庫架構……
22:57:18.555  4 Y EQ [Log]的所有物體類(3個):Log,UserOnline,VisitStat
22:57:18.555  4 Y EQ [Log]需要檢查架構的物體類(2個):UserOnline,VisitStat
22:57:18.558  4 Y EQ Log待檢查表架構的物體個數:2
22:57:18.559  4 Y EQ 建立表:UserOnline(使用者線上)
22:57:18.561  4 Y EQ 建立表:VisitStat(訪問統計)
22:57:18.564  4 Y EQ 檢查連線[Log/SQLite]的資料庫架構耗時24ms

這是前述程式碼的完整執行日誌,這裡我們不做過多分析。

日誌大意是:自動配置SQLite資料庫,下載平臺要求的SQLite驅動,建庫建表,增刪改查

這裡特別需要關註的是這幾行:

22:57:17.548  1 N - 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('大石頭', null, null, 0, null, null, null, null, 0, null, 0, 0, 1, 0, null, null, null, null, 0, 0, 0, null, null, null, null, 0, null, null, null);Select last_insert_rowid() newid
22:57:17.561  1 N - 使用者ID:2
22:57:17.574  1 N - Select * From User Where Name='大石頭' Order By ID Desc limit 1
22:57:17.601  1 N - Update User Set Logins=Logins+1, LastLogin='2019-02-25 22:57:17' Where ID=2
22:57:17.613  1 N - Select * From User Order By ID Desc
22:57:17.620  1 N - Delete From User Where ID=2

 一句user.Insert,生成了一個Insert Into陳述句,並取得自增欄位賦值給ID。

一個簡單的Find單欄位查詢,透過user2.Update更新了兩個欄位,user3.Delete則刪除了這行資料。

這就是一個完成的增刪改查!

短短的一段程式碼,也許帶給你許多疑問,這些疑問都將在後續文章中得到詳細解答:

  • UserX類來自哪裡?(XCode內建許可權體系Membership)
  • 為何不需要配置資料庫?(無配置時預設使用SQLite)
  • 下載了什麼東西?(SQLite驅動分為.Net2.0/.Net4.0/.Net4.5等,還有.netstandard以及Linux版本之分,XCode根據平臺自動下載正確版本)
  • 為何會自動建表?(這是XCode最為強大的反向工程,2008年開始支援,類似於EF後來的資料遷移)
  • 自增ID。Insert後會即刻取回新插入的自增值
  • Logins=Logins+1。這叫做累加欄位
  • UserX.FindByID為何生成不帶where的Select查詢?(UserX.FindByID內部帶有物體快取,並非簡單的Find(ID==2))

系列教程

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抽取,排程計算處理,結果持久化

End.

 

受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。

    贊(0)

    分享創造快樂