前面两篇文章介绍了框架的思路及里面大概的实现过程,那时候忘记上传项目,就补发一下。顺便介绍下框架使用方式,并分析下框架使用的优缺点。
先发一下前两章的链接
篇一:http://www.cnblogs.com/jnxzk/p/6443192.html
篇二:http://www.cnblogs.com/jnxzk/p/6493054.html
进入正题:
之前说了,一开始做的时候是为了方便数据库的访问,其实数据库的访问,最重要的就是sql语句。因此,我的框架并没有创造什么语法,使用风格是类似sql语法,因为我想,如果创造语法,那么使用的人还需要先学习怎么使用,而完全sql风格,那就不用说了,大家都学过了,一看明了的。
并且为了更进一步封装方法,有点类似ORM框架,封装四个方法 Select,Update,Delete和Insert扩展方法,这个直接可以在模型对象上就可以点出来的方法,所以也比较方便。框架支持sql 和 mysql,其他的数据库需用户自己扩展。
首先,是配置。使用框架需要配置。
一:数据库使用都有配置文件,只要在配置文件加上connectionStrings,这个节点里存放一个是数据库名字,连接串和数据库类型。
例:
<add name="SQL" connectionString="Data Source=CN-20161106HMJI;Initial Catalog=ShopInfo;Integrated Security=True" providerName="SQL"/>
这里要注意的是最前面的name和最后的数据库类型。
因为框架支持多数据库,因此name是用来区分正使用哪个数据库的关键,并且在其他还会用到,下面再说。第二个是provideName,这是数据库类型,类型只能是静态类DBType中的静态字段,目前只有SQL和MySQL,这是用来区分数据库的。如果使用了配置,那在应用程序一开始执的行时候调用 Config.Start()方法即可。
二:模型的类上,可以加上两个特性,Connection 与 OConnection。
这两个特性就是为四个简便的扩展方法而用。Connection构造函数有一个参数,这个参数就是上边说到很重要的name。要跟你要将模型保存到哪个数据库,上边就填写哪个数据库的name。
而OConnection是为了更智能性,用户可以通过配置,来一次性定义保存模型到哪个库中。这个配置文件配置在appsettings中。key用户自己命名,那value就是上边的数据库名name。使用这个配置后,在应用程序一开始时候加上Config.ConfigConnection(key);key就是你刚刚那个配置里的key里的值。
模型类上使用其中的任意一种。
三:这个是必须的,在模型里,作为主键的属性上边,加上PKey特性(如果一张表有多个,那么都加上),这个很显然的功能。
四:异常的设置,如果执行阶段的发生的异常需要保存,那就写个无参无返回值的静态方法,使用DBException.AddEvent += 你的方法名 即可。
上面对数据库的配置好处就是,如果数据库改变了,或是原本是mysq,现在升级成sql,那配置里修改即可,代码都不需要动。
好了,配置完成了。来介绍下使用方式,按上边看,就知道了有两种使用方式。
第一种较为简单,使用Select,Update,Delete和Insert扩展方法,都要先实例模型对象,然后在模型对象上使用方法。
Select,Delete,Update使用的要求是主键要有值,这样才能找出你要操作是哪个是吧。Update不会更新主键部分;Insert就没什么要求,所有字段有值就可以。
这几个方法都有一个可选参数,就是操作的字段(除了Delete)。在使用的地方要引用该类库。
第二种方式:
使用DBHelper,在使用后要调用dispose,或者using来释放空间。
DBHelper里有几种最终执行的方法,比如执行影响行数,获取List,等等。这里最重要的是ExcuteString方法。
DBHelper因为是链式的,因此有先后执行顺序,使用方法的顺序是:
helper先调用Connection(string name)获取数据库(数据库name) 或者createConnection(string Name, string ConnectionString, string type) 创建数据库。
其次就是先使用ExcuteString()
最后是最后执行的操作,ToList,ToModel,ExcuteResult等等,在项目里有注释各个功能。
ExcuteString需要解释下,这里面其实是拼接字符串,也同样是链式编程。使用格式如下:
(Sleect | Delete | Insert | Update) + Form(可选参数,给视图,存储过程使用) +AndPKey(补充主键约束,如果是模型中的表,使用这个就可以了,如果多表那就使用AndMulTable,自动补充表间关联字段) + (where 条件 | or 条件 | where 不等 条件 | or 不等条件) + OrderBy(可选参数) + Top(可选参数)
例子:
helper.ExcuteString(o => o.Select<PlaceInfo>().AndNIn("SAddNo", o1 => o1.Select<PlaceInfo>().Top(5)).Top(5)).ToList<PlaceInfo>();
支持嵌套查询,因此做最常用的分页也不是难事。上边这个是分页的操作,如果把两个top里面数值改成需要传的参数,就可以改造成任意的页了,项目中也写好了注释。
好了,使用方式就到此为止,来分析下框架吧。
首先,已经屏蔽掉所有底层的东西了。
第二,因为里面大量的使用反射,时间消耗自然是很慢的,所以设置反射的缓存是必须的,不过缓存不是对数据,是在反射,还有搜索主键的地方,在使用久后,里面对各个模型类都已经有了缓存,使用就不会有问题了。
第三,对多种数据库也只使用一套模型,如果是EF,那一套模型只对应一个数据库,如果下次更换数据库,那不是得重新的做。
第四,扩展部分。之前文章里说过,框架是极大的支持开闭原则。因此,如果以后要扩展数据库,那只要再DBType里多增加一个你的字段比如 Oracle,然后底层的实现方法,新建三个实现IDBCode ,IDBExcute,IDBInstance接口的类,在三个类下实现那些方法。好了,这样就扩展了一个数据库。这时候如果要用这个数据库,只需要在配置处修改你想保存新的数据库中,其他代码可以一个字都不要动。
缺点是:
第一,没有可视化工具。他们工具都可以自动生成,这个目前没有,如果等我学校毕业后,有大量时间投在编代码上时,我就可以拿出许多时间写了。
第二,链式编程,还没办法实现像EF这样,其实链式最厉害的应该是拼接,拼接如果能够做到前后顺序无关,我觉得是极大的提升。
其他缺点,就留给读者去发现了。
好了,对数据库的封装结束了,框架是EasyDb类库中。其他地方要使用就引用该类库就可以了,里面还有一个是我作为测试的控制台程序。
链接是:https://files.cnblogs.com/files/jnxzk/EasyDbSolution.rar
有什么问题可以在下边评论~~