• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

OF.DB: 数据库操作相关的公共库

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

OF.DB

开源软件地址:

https://gitee.com/fastdev/OF.DB

开源软件介绍:

#OF.DB一、此类库可以根据数据库表生成实体对象和简单的数据访问对象,提供基本的读、写、更新、删除功能,以及将数据集转换为实体对象的公共方法(ILEmit代码实现,性能高)。

二、提供了生成查询的builder对象,简化了拼接sql条件,内部采用参数方式拼接查询条件,减少sql注入的风险。对大型集合查询采用xml方式传入,尽量采用参数方式构建sql,可以减少编译sql带来的消耗,提高sql缓存的利用率。

三、示例项目说明

OF.DB.Test 这个项目是一个测试 OF.DB 的项目,里面给出了样例用于根据数据库表生成对应的实体层、数据访问层以及使用 OF.DB 来构建查询(包含分页、取总数、多表连接、xml方式传入一组值等常见功能)。项目文件说明:1、test.dbo.Blog.sql 和 test.dbo.User.sql 中包含了创建测试表的sql,本项目使用 test 数据库,链接串在配置文件中。

2、BlogGenerator.cs 中包含了创建实体和创建数据库访问层的代码。其中数据库访问层的更新语句需要传入参数说明哪些列不需要做更新(比如创建时间在更新的时候不需要修改,主键不需要传)。如果需要生成实体和数据访问层,在确保数据库表建立,连接串设置正确的情况下,运行 BlogGenerator 的方法即可生成对应的文件。生成文件在程序根目录下,其中实体访问层有两个文件,一个以{表名}Dao.cs 命名,一个以 {表名}Dao.generate.cs 命名代表里面的代码是自动生成的,这两个文件都是同一个类,只不过是采用partial 方式声明的(如果修改数据层逻辑最好是改 {表名}Dao.cs 文件)。 将生成的文件加入到项目中,本项目中的 Blog 和User 实体及访问层代码即是以这种方式生成的。

3、TestRunGenerateClass.cs 中包含测试实体的数据层的基本方法。

4、TestQueryGenerateClass.cs 中包含查询的构建方式。本项目使用 SqlAndConditionBuilder 类来构建查询,它采用 Builder模式构建查询,可以起到简化查询的构建作用,并且此类中提供了方法来简化 SqlParameter 参数的传入:

(1). 对于多个条件的组合查询,只需要依次构建各个查询条件即可,builder中会自动判断加入 Where 或者 And。

(2). 能够根据查询条件来动态组装需要用到哪些关联表(ER关系为 1:0 或者 N:1的情况),这样可以尽可能减少表的join数量,起到提升性能的作用。SqlAndConditionBuilder 在构建的时候会根据用到的查询字段来判断需不需要加入外表的Join。比如查询blog的信息的时候,用户如果只输入blog的标题或者id则构建的查询中只需要单表查询即可。如果用户输入了blog的作者名则查询就需要关联user表进行链接查询。实现原理是 SqlAndConditionBuilder在构建的时候需要传入本查询相关的所有表的Id(自定义不重复即可,最好使用枚举)和别名字典1,以及Id对应的join语句字典2(主表不需要传)。构建的条件中需要传入表Id和列名,并且跟踪用到了哪些表Id,这样在生成语句的时候会根据字典2取出join的语句。

(3). 对 xml 参数的支持。本项目中提供了方法将 List<int> 类型的参数转换成数据库中对应的 XML 类型的 SqlParameter

变量,并且提供了将变量转换为 Table 类型变量的方法。这样可以用于批量传入一组数据到数据库进行join查询(也可以用于批量写入、更新等)。目前很多类库在实现批量传入参数进行查询的时候都是采用拼接 IN 条件的方法来实现的,但是这样做有几个问题。首先查询效率不高,IN 条件拼接在 sql 中会导致sql语句本身很长,这样数据库运行语句时解析会很长,本人实际运行的时候经常会发现In条件长的语句解析过程花的时间远远高于查询的时间;其次是数据库对sql语句长度有限制,传入的参数太多经常会报sql语句截断的异常;再者把参数值部分放入到sql中会这个语句很难被数据库缓存到,比如两个语句基本一样就In部分有一个值不一样数据库会认为是不同的语句,这样每次调用都会重新进行分析、制定执行计划、编译等动作,而如何通过xml传值方式,数据库就会认为两个sql语句一样只是参数值不同,所以查询的时候就可以用到之前编译过的的查询代码,这样就可以提升性能。

本项目中的例子基本上都是以 SqlParameter 参数完成参数的传入,在公共方法里面也提供了一些支持来简化编码,建议大家在实际的开发过程中也尽量使用 SqlParameter 参数。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap