[NewLife.XCode]增刪改查入門

2021-02-14 dotNET跨平臺

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版]

增刪改查入門。快速展現用法,代碼配置連接字符串

數據模型文件。建立表格欄位和索引,名字以及數據類型規範,推薦欄位(時間,用戶,IP)

實體類結構。數據類業務類,泛型基類,接口

功能設置。連接字符串,調試開關,SQL日誌,慢日誌,參數化,執行超時。代碼與配置文件設置,連接字符串局部設置

反向工程。自動建立資料庫數據表

數據初始化。InitData寫入初始化數據

高級增刪改。重載攔截,自增欄位,Valid驗證,實體模型(時間,用戶,IP)

髒數據。如何產生,怎麼利用

增量累加。高並發統計

事務處理。單表和多表,不同連接,多種寫法

擴展屬性。多表關聯,Map映射

高級查詢。複雜條件,分頁,自定義擴展FieldItem,查總記錄數,查匯總統計

數據層緩存。Sql緩存,更新機制

實體緩存。全表整理緩存,更新機制

對象緩存。字典緩存,適用用戶等數據較多場景。

百億級性能。欄位精煉,索引完備,合理查詢,充分利用緩存

實體工廠。元數據,通用處理程序

角色權限。Membership

導入導出。Xml,Json,二進位,網絡或文件

分表分庫。常見拆分邏輯

高級統計。聚合統計,分組統計

批量寫入。批量插入,批量Upsert,異步保存

實體隊列。寫入級緩存,提升性能。

備份同步。備份數據,恢復數據,同步數據

數據服務。提供RPC接口服務,遠程執行查詢,例如SQLite網絡版

大數據分析。ETL抽取,調度計算處理,結果持久化

 

End.

相關焦點

  • PHP怎麼實現字符串的增刪改查
    源 / php中文網      源 / www.php.cn對於PHP初學者來說,字符串的增刪改查可能略有陌生。其實相對於mysql資料庫或者PHP數組元素的增刪改查來說,字符串的增刪改查更加簡單易懂。
  • Neo4j入門(一)節點、關係的增刪改查
    本文作為筆者入門Neo4j的第一篇文章,後續將會更多地介紹Neo4j及知識圖譜相關的內容。Neo4j logo  Neo4j是圖資料庫中的佼佼者,採用Java編寫,社區版已開源,商業版需收費。Neo4j是一個高性能的NoSQL圖形資料庫(Graph Database),它將結構化數據存儲在網絡上而不是表中。
  • [NewLife.XCode]髒數據
    回到目錄系列教程NewLife.XCode教程系列[2019版]增刪改查入門。快速展現用法,代碼配置連接字符串數據模型文件。建立表格欄位和索引,名字以及數據類型規範,推薦欄位(時間,用戶,IP)實體類詳解。數據類業務類,泛型基類,接口功能設置。
  • [NewLife.XCode]高級增刪改
    UserModule取當前登錄用戶,由ManageProvider驅動;TimeModule取當前時間;IPModule取當前訪問IP,由ManageProvider.UserHost提供; 回到目錄系列教程NewLife.XCode教程系列[2019版]增刪改查入門。
  • java 小工具 | 封裝通用的 Mybatis 生成模板 |1 秒寫完增刪改查
    項目背景前段時間我們介紹了如何使用thymeleaf去生成mybatis相關的模板:https://www.lixiang.red/articles/2019/07/23/1563857782748.html今天小刀和各位小夥伴們一起來深入下這個問題,我們來研究下怎麼去封裝一個通用的Mybatis模板,讓簡單的增刪改查操作
  • Go 數據存儲篇(五):建立資料庫連接並進行增刪改查操作
    前面給大家介紹了 Go 語言中的內存存儲和文件存儲,文件存儲的好處是可以持久化數據,但是並不是 Web 應用數據存儲的終極方案,因為這樣存儲起來的數據檢索和管理起來非常麻煩,為此又誕生了資料庫管理系統來處理數據的增刪改查。
  • 29、通過註解的方式整合spring和mybatis實現增刪改查功能
    這是之前通過配置文件整合spring和mybatis實現增刪改查功能的文章:
  • linux文本處理三劍客之sed增刪改查
  • Linux三劍客sed命令-增刪改查排除
    常用功能有對文件實現快速增刪改查(crud),其中查詢的功能中最常用的2大功能是過濾(過濾指定字符串)和取行(取出指定行)。【sed參數選項】sed常用參數選項選項解釋說明-n取消默認sed的輸出-i修改文件內容-e允許多次編輯-r識別擴展正則符號sed的常用內置命令字符增刪改查功能說明參數解釋說明a全拼append,表示追加文本,在指定行後添加一行或多行文本d
  • 通過 Laravel Eloquent 模型實現簡單增刪改查操作
    phpnamespace App;use Illuminate\Database\Eloquent\Model;class Post extends Model{    //}裡面什麼東西都沒有,但是我們就可以通過它完成數據表記錄的增刪改查操作了,怎麼做到的?這就是「約定優於配置」的功勞了。
  • 教你一招徹底擺脫增刪改查!
    小明接了個項目,業務方的需求裡面有很多組織管理、人員管理、事件管理的需求,這些業務有面向終端客戶的查詢,也有面向內部管理人員的管理。
  • 基於 abp vNext 和 .NET Core 開發博客項目 - 自定義倉儲之增刪改查
    由於是博客項目,無非就是一些增刪改查。今天先不寫博客業務,先完成對資料庫文章表meowv_posts的一個簡單CRUD。在.Application層新建Blog文件夾,添加一個IBlogService.cs博客接口服務類,分別添加增刪改查四個方法。
  • Java對象轉JSON時如何動態的增刪改查屬性
    方法來完成額外新增欄位,完整的代碼片段:String json = "{\n" +        "    \"username\":\"felord.cn\",\n" +        "    \"age\":18\n" +        "}";ObjectMapper objectMapper = n
  • DDL之資料庫--增刪改查
    create database dt55-mysql;2、show databases3、查看當前用戶連接的是哪個資料庫:select database();4、查看指定的資料庫下有哪些表:show tables  DDL表操作DDL之對表的增刪改查
  • Nest.js 快速入門:實現對 Mysql 單表的 CRUD
    Nest.js 在國內外用的都挺多的,今天我們就來入門下吧:做一個筆記管理功能,實現對 mysql 單表的增刪改查並提供 Restful 的接口。Node.js 代碼裡同樣可以連接上資料庫服務,然後遠程執行 sql 來對資料庫表做增刪改查。但直接執行 sql 比較繁瑣,能不能我只操作對象,對象屬性變了就自動去執行 sql 來同步資料庫呢?就像 vue 的數據變了自動同步視圖一樣。
  • 關於 Xcode 10 New Build System,你需要了解的 5 件事
    查看之前關於 Xcode new build system 的博客[2]以了解更詳細的信息。參考連結https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes/build_system_release_notes_for_xcode_10https://medium.com/xcblog/xcode-new-build-system-for-speedy-swift-builds-c39ea6596e17
  • MyBatis學習--簡單的增刪改查(三)
    MyBatis實例  應用MyBatis來實現簡單的增刪改查,下面分別實現:  對象類如下:
  • Kustomize下篇丨Kustomize 中的增刪改查
    /cnamePrefix: overlay-ucommonLabels: auto: label生成之後會發現,從 Service、Deployment、Configmap 一直到 Pod,都會打上新標籤。
  • 六爻入門從金老師細講《增刪卜易》開始
    六爻入門《增刪卜易》《增刪卜易》這部書,成書於明末清初,是易經六爻卜卦的經典巨著。該書條理明晰,以理服人,有理有據,給出的方法和結論都很明確,從不拖泥帶水,讓初學者很容易切入,而深奧的易理要靠學習者不斷的研讀,待水平提高後才能慢慢領悟到,所以這是一部可以從「入門」讀到「大師」的書。正如書中序言所說:「是書也,講解甚明,初學者不用投師即知佔卜,知易者愈得其精,精易者愈得其奧。」
  • 基於 Spring Boot 的 Restful 風格實現增刪改查
    在這裡我們使用spring的JPA來完成基本的增刪改查。說明:一般有兩種方式實現與資料庫實現CRUD:第一種是xml的mapper配置。第二種是使用註解,@Insert、@Select、@Update、@Delete 這些來完成。本篇使用的是第二種。