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