Farseer.net輕量級開源框架 中級篇:DbFactory數據工廠


導航

目   錄:Farseer.net輕量級開源框架 目錄

上一篇:Farseer.net輕量級開源框架 中級篇: 執行SQL語句

下一篇:Farseer.net輕量級開源框架 中級篇: 數據綁定

越講到后面,我們離基礎的語法越遠了。看到這篇文章,先恭喜下,說明大家已經能用該框架做日常的開發了。

當然還有一些綁定技巧,比如把枚舉、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 }

其實這里面主要是方法的調用,很簡單。專門開一篇文章來講,主要是考慮到這個類還是比較常用的。所以專門寫了一篇這個文章,來加深大家的印象。

以上方法,大致分為:

  1. CreateDbBuilder
  2. CreateDbVisit
  3. CreateDbOperate
  4. CreateDbProvider
  5. CreateDbExecutor
  6. CreateConnString

以上六種。各自有一些重載版本。重載版本主要是對數據庫配置的參數。可通過完全的手動編寫數據庫的選擇,或者使用實體類映射,或者數據庫配置三種方式。

提到數據庫配置,可能大家會有疑問,那我的實體是怎么關聯到數據庫配置(DbConfig)的?我有多個數據庫怎么辦?請放心,這些框架都實現了,關於這個問題,在后面有專門的篇幅講到。

現在一一來說明下這6個方法的作用吧。因為方法都比較簡單。就各自說明下其作用就可以。

CreateDbBuilder

  創建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。CreateDbVisit會因為不同的數據庫類型,有相對應的派生類,比如有:SqlserverVisit。

  我們一直使用的是Lambda表達式來做條件的。比如:Where(o=>o.ID == 1)  或者:Select(o=>new { o.ID,o.UserName } );

  那么DbVisit的目地就是用來解析這些過程。解析過程用的是對表達式樹的解析:Expression<Func<實體類,bool>>

  將這些Lbmbda表達式樹進行解析成數據庫所有識別的SQL語句。換句說話就是解析表達式樹Expression

CreateDbOperate

  創建CreateDbOperate。CreateDbOperate會因為不同的數據庫類型,有相對應的派生類,比如有:SqlserverOperate。

  這個類的作用是對數據庫進行物理操作。比如創建表、創建字段、刪除字段、修改字段等。

  當然,通常我們對數據庫的維護是使用SQL Server Management Studio ,但不除排有些項目,需要能實現讓客戶自定義物理字段的可能。(當然有些是利用JSON結構之類的,這里就不展開講解了)

  這個方法比較少用到,大家有所了解就行。知道有這么個方法。具體需要使用的時候,可以在源碼里查看返回的類里面所包含的有哪些方法。

CreateDbProvider

  創建CreateDbProvider。CreateDbProvider會因為不同的數據庫類型,有相對應的派生類,比如有:SqlserverDbProvider。

  什么是DbProvider,我們先看下DbProvider的工作方式,如下圖:

  

  每個數據庫類型都會包含有自己的Provider。 這個Provider主要是提供數據庫的特有的特性。

  舉個例子,在Sqlserver中。對於表名、字段名的保護符號是:[]  中括號。為了避免一些名稱定義成SQLSERVER特有的關鍵詞,可以理解為是一種轉義符。而MySql用的是:  ‘’  兩個單引號。

CreateDbExecutor

  創建CreateDbExecutor。框架最終執行,都是到這個類里把生成的SQL傳進來的。因此你也可以使用自己傳進來的SQL進行執行你想要的結果。

  前面兩章:事務、SQL執行都用到了這個方法。這里不作解講了。

CreateConnString

  創建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>

這種格式進行對數據庫的配置。那么,框架就是利用這個方法來生成數據庫連接字符串的。

好啦,這篇文章就講解到這里,發覺越講越多內容需要說明。。。。。。

導航

目   錄:Farseer.net輕量級開源框架 目錄

上一篇:Farseer.net輕量級開源框架 中級篇: 執行SQL語句

下一篇:Farseer.net輕量級開源框架 中級篇: 數據綁定

廣告時間

QQ群:116228666 (Farseer.net開源框架交流) 請注明:Farseer.Net

Farseer.Net是一款ORM框架 + 常用工具 + 擴展集合。

Farseer 意為:先知、預言家 通常在某些場合時,提供計謀、策略。也希望該框架能給大家提供最大化的便捷。

ORM:其英文全稱是:Object(對象) Relational(關系) Mapping(映射)

Farseer.Net的目標是:快速上手、快速開發、簡單方便。

1 new User { ID = 1, Name = "張三" }.Insert()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM