Farseer.net轻量级开源框架 中级篇:DbFactory数据工厂
越讲到后面,我们离基础的语法越远了。看到这篇文章,先恭喜下,说明大家已经能用该框架做日常的开发了。
当然还有一些绑定技巧,比如把枚举、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()