越講到后面,我們離基礎的語法越遠了。看到這篇文章,先恭喜下,說明大家已經能用該框架做日常的開發了。
當然還有一些綁定技巧,比如把枚舉、List<Users>綁定到DorpDownList、CheckBoxList、RadioButtonList 並顯示中文 在下一篇中再解釋。
這一篇中,我們主要講解下用到的一個工廠模式的類:DbFactory。
國際慣例,先來看看這個類有哪些方法吧:全名空間,位於:FS.Core.Bean
1 namespace FS.Core.Bean 2 { 3 /// <summary> 4 /// 數據庫工廠模式 5 /// </summary> 6 public class DbFactory 7 { 8 /// <summary> 9 /// 創建數據庫Sql生成 10 /// </summary> 11 /// <typeparam name="TInfo">實體類</typeparam> 12 /// <param name="dbType">數據庫類型</param> 13 /// <param name="tableName">表名稱</param> 14 internal static DbBuilder<TInfo> CreateDbBuilder<TInfo>(string tableName = "") where TInfo : ModelInfo, new(); 15 16 /// <summary> 17 /// 創建數據庫表達式樹解析器 18 /// </summary> 19 /// <typeparam name="TInfo">實體類</typeparam> 20 /// <param name="dbType">數據庫類型</param> 21 /// <param name="tableName">表名稱</param> 22 internal static DbVisit<TInfo> CreateDbVisit<TInfo>() where TInfo : ModelInfo, new(); 23 24 /// <summary> 25 /// 創建修改數據庫類 26 /// </summary> 27 /// <param name="dbType">數據庫類型</param> 28 /// <param name="connetionString">連接字符串</param> 29 /// <param name="tableName">要操作的表名</param> 30 public static DbOperate CreateDbOperate(DataBaseType dbType, string connetionString, string tableName); 31 32 /// <summary> 33 /// 創建數據庫提供者 34 /// </summary> 35 public static DbProvider CreateDbProvider<TInfo>() where TInfo : ModelInfo, new(); 36 37 /// <summary> 38 /// 創建數據庫提供者 39 /// </summary> 40 /// <param name="dbType">數據庫類型</param> 41 public static DbProvider CreateDbProvider<TInfo>(DataBaseType dbType); 42 43 /// <summary> 44 /// 創建數據庫操作 45 /// </summary> 46 /// <typeparam name="TInfo">實體類</typeparam> 47 /// <param name="tranLevel">開啟事務等級</param> 48 public static DbExecutor CreateDbExecutor<TInfo>(IsolationLevel tranLevel = IsolationLevel.Serializable) where TInfo : ModelInfo, new(); 49 50 /// <summary> 51 /// 創建數據庫操作 52 /// </summary> 53 /// <typeparam name="TInfo">實體類</typeparam> 54 /// <param name="tranLevel">開啟事務等級</param> 55 public static DbExecutor CreateDbExecutor(int dbIndex = 0, IsolationLevel tranLevel = IsolationLevel.Unspecified); 56 57 58 /// <summary> 59 /// 創建數據庫連接字符串 60 /// </summary> 61 /// <param name="dbInfo">數據庫配置</param> 62 public static string CreateConnString(int dbIndex = 0); 63 64 /// <summary> 65 /// 創建數據庫連接字符串 66 /// </summary> 67 /// <param name="dataType">數據庫類型</param> 68 /// <param name="userID">賬號</param> 69 /// <param name="passWord">密碼</param> 70 /// <param name="server">服務器地址</param> 71 /// <param name="catalog">表名</param> 72 /// <param name="dataVer">數據庫版本</param> 73 /// <param name="connectTimeout">鏈接超時時間</param> 74 /// <param name="poolMinSize">連接池最小數量</param> 75 /// <param name="poolMaxSize">連接池最大數量</param> 76 /// <param name="port">端口</param> 77 public static string CreateConnString(DataBaseType dataType, string userID, string passWord, string server, string catalog, string dataVer, int connectTimeout = 60, int poolMinSize = 16, int poolMaxSize = 100, string port = ""); 78 } 79 }
其實這里面主要是方法的調用,很簡單。專門開一篇文章來講,主要是考慮到這個類還是比較常用的。所以專門寫了一篇這個文章,來加深大家的印象。
以上方法,大致分為:
- CreateDbBuilder
- CreateDbVisit
- CreateDbOperate
- CreateDbProvider
- CreateDbExecutor
- CreateConnString
以上六種。各自有一些重載版本。重載版本主要是對數據庫配置的參數。可通過完全的手動編寫數據庫的選擇,或者使用實體類映射,或者數據庫配置三種方式。
提到數據庫配置,可能大家會有疑問,那我的實體是怎么關聯到數據庫配置(DbConfig)的?我有多個數據庫怎么辦?請放心,這些框架都實現了,關於這個問題,在后面有專門的篇幅講到。
現在一一來說明下這6個方法的作用吧。因為方法都比較簡單。就各自說明下其作用就可以。
創建DbBuilder。DbBuilder會因為不同的數據庫類型,有相對應的派生類,比如有:SqlserverBuilder。
而我們用工廠模式的目的,當然是為在切換數據庫的時候,不用修改代碼就可以正常運行。
前面我們說到了很多Insert、Update、Delete、ToList 等等方法。其實它們最終的目地就是為了轉成SQL語句,然后提交到數據庫中。那么DbBuilder就是為了生成真正的SQL而產生的。
比如:
1 public override string ToTable(int pageSize, int pageIndex) 2 { 3 if (Map.ClassInfo.DataVer == "2000") { return base.ToTable(pageIndex, pageSize); } 4 if (pageIndex == 1) { return base.ToTable(pageSize); } 5 6 if (SortString.Length == 0) { SortString.AppendFormat("ORDER BY {0} ASC", Map.IndexName); } 7 return string.Format( 8 "SELECT {0} FROM (SELECT {0},ROW_NUMBER() OVER({1}) as Row FROM {2} {3}) a WHERE Row BETWEEN {4} AND {5};", 9 GetFields(), SortString, TableName, WhereString, (pageIndex - 1) * pageSize + 1, pageIndex * pageSize); 10 }
上面,是摘自SqlserverDbBuilder中的方法。用的是重寫方法。我們再看看DbBuilder中的方法又是如何的(SqlserverDbBuilder繼承自DbBuilder中):
1 public virtual string ToTable(int pageSize, int pageIndex) 2 { 3 // 不分頁 4 if (pageIndex == 1) { return ToTable(pageSize); } 5 if (SortString.Length == 0) { SortString.AppendFormat("ORDER BY {0} ASC", Map.IndexName); } 6 7 var sort2 = SortString.ToString().Replace(" DESC", " [倒序]").Replace("ASC", "DESC").Replace("[倒序]", "ASC"); 8 9 return string.Format("SELECT TOP {1} {0} FROM (SELECT TOP {2} {0} FROM {3} {4} {5}) a {6};", 10 GetFields(), pageSize, pageSize * pageIndex, TableName, WhereString, SortString, sort2); 11 }
是個虛方法,我們利用了Sqlserver ROW_NUMBER()的特性做了分頁功能。所以我們不需要DbBuilder中的實現。
到這里,大家明白了DbBuilder的作用了吧,就是用來生產Sql的。
創建CreateDbVisit。CreateDbVisit會因為不同的數據庫類型,有相對應的派生類,比如有:SqlserverVisit。
我們一直使用的是Lambda表達式來做條件的。比如:Where(o=>o.ID == 1) 或者:Select(o=>new { o.ID,o.UserName } );
那么DbVisit的目地就是用來解析這些過程。解析過程用的是對表達式樹的解析:Expression<Func<實體類,bool>>
將這些Lbmbda表達式樹進行解析成數據庫所有識別的SQL語句。換句說話就是解析表達式樹Expression
創建CreateDbOperate。CreateDbOperate會因為不同的數據庫類型,有相對應的派生類,比如有:SqlserverOperate。
這個類的作用是對數據庫進行物理操作。比如創建表、創建字段、刪除字段、修改字段等。
當然,通常我們對數據庫的維護是使用SQL Server Management Studio ,但不除排有些項目,需要能實現讓客戶自定義物理字段的可能。(當然有些是利用JSON結構之類的,這里就不展開講解了)
這個方法比較少用到,大家有所了解就行。知道有這么個方法。具體需要使用的時候,可以在源碼里查看返回的類里面所包含的有哪些方法。
創建CreateDbProvider。CreateDbProvider會因為不同的數據庫類型,有相對應的派生類,比如有:SqlserverDbProvider。
什么是DbProvider,我們先看下DbProvider的工作方式,如下圖:
每個數據庫類型都會包含有自己的Provider。 這個Provider主要是提供數據庫的特有的特性。
舉個例子,在Sqlserver中。對於表名、字段名的保護符號是:[] 中括號。為了避免一些名稱定義成SQLSERVER特有的關鍵詞,可以理解為是一種轉義符。而MySql用的是: ‘’ 兩個單引號。
創建CreateDbExecutor。框架最終執行,都是到這個類里把生成的SQL傳進來的。因此你也可以使用自己傳進來的SQL進行執行你想要的結果。
前面兩章:事務、SQL執行都用到了這個方法。這里不作解講了。
創建CreateConnString。創建數據庫的連接字符串。我們知道不同的數據庫、不同的數據庫的版本,對應的ConnnectionString 都會不一樣。
那么這個方法的目地就是為了創建不同數據庫的連接字符串了。查看過~/App_Data/Db.Config應該知道,為個配置文件,用的不是連接字符串,而是采用:
1 <?xml version="1.0"?> 2 <DbConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3 <DbList> 4 <DbInfo> 5 <Server>.</Server> 6 <UserID>sa</UserID> 7 <PassWord>123456</PassWord> 8 <DataType>SqlServer</DataType> 9 <DataVer>2005</DataVer> 10 <Catalog>Farseer</Catalog> 11 <PoolMinSize>16</PoolMinSize> 12 <PoolMaxSize>100</PoolMaxSize> 13 <ConnectTimeout>30</ConnectTimeout> 14 <CommandTimeout>60</CommandTimeout> 15 </DbInfo> 16 </DbList> 17 </DbConfig>
這種格式進行對數據庫的配置。那么,框架就是利用這個方法來生成數據庫連接字符串的。
好啦,這篇文章就講解到這里,發覺越講越多內容需要說明。。。。。。
QQ群:116228666 (Farseer.net開源框架交流) 請注明:Farseer.Net
Farseer.Net是一款ORM框架 + 常用工具 + 擴展集合。
Farseer 意為:先知、預言家 通常在某些場合時,提供計謀、策略。也希望該框架能給大家提供最大化的便捷。
ORM:其英文全稱是:Object(對象) Relational(關系) Mapping(映射)
Farseer.Net的目標是:快速上手、快速開發、簡單方便。
1 new User { ID = 1, Name = "張三" }.Insert()