NewLife.XCode是一個有10多年曆史的開源資料中介軟體,支援nfx/netstandard,由新生命團隊(2002~2019)開發完成並維護至今,以下簡稱XCode。
整個系列教程會大量結合示例程式碼和執行日誌來進行深入分析,蘊含多年開發經驗於其中,代表作有百億級大資料實時計算專案。
開源地址:https://github.com/NewLifeX/X (求star, 656+)
回到目錄
大殺器
反向工程是XCode的大殺器,區別於其它ORM的最強功能!
通俗理解:基於XCode開發的應用,無需資料庫安裝指令碼,連線字串指向哪一臺哪一種資料庫,系統就自動在上面建庫建表!
正式定義:基於物體類的表結構資訊,在連線字串指定的標的資料庫上自動執行建庫建表、添刪改欄位、建立索引等操作,支援各種資料庫!
應用系統首次啟動完成的時候,也是自動建表建庫並初始化完成的時候。
反向工程是XCode數萬級分表的主要倚仗!
建立控制檯專案,從Nuget取用NewLife.XCode
建立物體類,模型如下(可參考前面幾章來生成物體類):
測試程式碼:
執行日誌:
自始至終,我們沒有編寫SQL指令碼,沒有去資料庫建立資料表。
程式碼寫完就跑起來,測試透過就部署到正式庫。
從日誌來看,程式自動下載SQLite驅動,因為我們並沒有指定物體類使用哪一種資料庫,XCode自動給我們配置了SQLite。(上一章連線字串部分有講解)
加一行程式碼把資料庫指向MySql:
執行日誌:
同樣的首先下載MySql驅動,(當然也可以自己透過nuget取用)。
首次連線資料庫時,庫名指定School報錯,因為根本就不存在這個庫。
因此,XCode切換到系統庫,開始建立資料庫School,並建立資料表和索引。這裡完全是MySql語法,不同於上面的SQLite建表陳述句。
感興趣的同學,還可以試試Oracle和SqlServer等資料庫。
回到目錄
正向工程
正向工程就是從資料庫讀取表結構資訊,生成模型資訊。
我們來試試寫幾行程式碼讀取上面建立的資料表:
執行日誌:
從上面可以看到,讀取dal.Tables得到了這個連線的所有表結構資訊,輸出為Xml時,跟前面用來建立物體類的模型檔案極為相似。
其實這就是一個模型檔案,只是為了生成物體類的模型檔案多增加了幾個屬性而已。
新生命碼神工具XCoder,(https://github.com/NewLifeX/XCoder),其中的資料建模工具,可以匯出各種資料庫的表結構資訊,正是基於dal.Tables來實現。
正向工程由3個基本介面構成:
- IDataTable。資料表介面,dal.Tables就是IDataTable集合,包括名稱、描述等
- IDataColumn。資料列介面,每張資料表有多個資料列,包括名稱、型別、長度、描述等
- IDataIndex。資料索引介面,每張資料表沒有或者有多個索引,索引指定包括哪些欄位 ,是否唯一
回到目錄
反向工程
有了IDataTable,我們就可以主動控制資料表結構。
DAL.SetTables(IDataTable[] tables);
這是反向工程高階用法,實際日常工作中用不到,各個物體類載入時,將會逐個連線進行反向工程檢查,正是呼叫該方法。
給上面的資料模型,增加一個欄位Code和對應索引:
跑起來:
程式自動為我們添加了欄位,以及建立了索引!
前面的幾個SHOW,就是XCode的正向工程,取得資料庫表結構,然後跟物體類結構對比,不相同時執行反向操作。
回到目錄
反向工程設定
大家還記得上一章系統設定中提到的Migration嗎?
XCode.config和連線字串中都支援這個設定。
可用設定項如下:
- Off 關閉,不執行反向工程
- ReadOnly 只讀不執行,非同步執行反向工程檢查,對比後生成變更DDL寫入日誌
- On 開啟,僅新建,預設設定。新建表、增加欄位、建立索引等可以執行,禁止修改欄位長度型別,禁止刪除欄位,以免造成資料丟失
- Full 完全,修改刪除。除了新建表、增加欄位、建立索引外,還可以修改欄位長度型別、刪除欄位等,極其危險,慎用
反向工程設計於2008年,10多年經驗表明,預設On最合理,不僅滿足開發需要,(隨時加欄位),還避免了欄位改變而導致的資料丟失風險;
反向工程如此神奇的功能,你想到了什麼高階用法嗎?我們將在數萬級分表分庫章節等你!
回到目錄
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門。快速展現用法,程式碼配置連線字串
- 資料模型檔案。建立表格欄位和索引,名字以及資料型別規範,推薦欄位(時間,使用者,IP)
- 物體類詳解。資料類業務類,泛型基類,介面
- 功能設定。連線字串,除錯開關,SQL日誌,慢日誌,引數化,執行超時。程式碼與配置檔案設定,連線字串區域性設定
- 反向工程。自動建立資料庫資料表
- 資料初始化。InitData寫入初始化資料
- 高階增刪改。多載攔截,自增欄位,Valid驗證,物體模型(時間,使用者,IP)
- 臟資料。如何產生,怎麼利用
- 增量累加。高併發統計
- 事務處理。單表和多表,不同連線,多種寫法
- 擴充套件屬性。多表關聯,Map對映
- 高階查詢。複雜條件,分頁,自定義擴充套件FieldItem,查總記錄數,查彙總統計
- 資料層快取。Sql快取,更新機制
- 物體快取。全表整理快取,更新機制
- 物件快取。字典快取,適用使用者等資料較多場景。
- 百億級效能。欄位精煉,索引完備,合理查詢,充分利用快取
- 物體工廠。元資料,通用處理程式
- 角色許可權。Membership
- 匯入匯出。Xml,Json,二進位制,網路或檔案
- 分表分庫。常見拆分邏輯
- 高階統計。聚合統計,分組統計
- 批次寫入。批次插入,批次Upsert,非同步儲存
- 物體佇列。寫入級快取,提升效能。
- 備份同步。備份資料,恢復資料,同步資料
- 資料服務。提供RPC介面服務,遠端執行查詢,例如SQLite網路版
- 大資料分析。ETL抽取,排程計算處理,結果持久化
受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。