14 Star 15 Fork 5

FastDev / OF.DB

加入 Gitee
与超过 600 万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README.md

#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 )

你可以在登录后,发表评论

简介

数据库操作相关的公共库 展开 收起
C#
Apache-2.0
取消

发行版

暂无发行版

OF.DB

贡献者

全部

近期动态

加载更多
不能加载更多了
C#
1
https://gitee.com/fastdev/OF.DB.git
git@gitee.com:fastdev/OF.DB.git
fastdev
OF.DB
OF.DB
master

搜索帮助