zoukankan      html  css  js  c++  java
  • C# .NET更智能的数据库操作封装项目

      前面两篇文章介绍了框架的思路及里面大概的实现过程,那时候忘记上传项目,就补发一下。顺便介绍下框架使用方式,并分析下框架使用的优缺点。

      先发一下前两章的链接

      篇一: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

      有什么问题可以在下边评论~~

  • 相关阅读:
    vim复制
    嵌入式Linux学习(二)
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1025 数的划分
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
  • 原文地址:https://www.cnblogs.com/jnxzk/p/6516389.html
Copyright © 2011-2022 走看看