AppFramework1.0数据库访问组件使用说明(一)引言

【工业软件开发学习——AnyCAD篇】模式(Schema)、组件(Component)与参数化对象(Part II) 基于AnyCAD实现属性修改与关联更新 阅读详情

 

 

 

1  概述

1.1  引言

约有90%的企业信息化管理系统基于数据库实现,这类系统中又有超过30%的代码集中在数据访问层负责业务数据存取。除了实现数据的增删改查,数据访问层还要提供一些与业务无关功能,例如面向对象的持久化与访问机制、本地事务与分布式事务支持、多数据库支持,这些机制或功能形成相对独立的逻辑领域,其主要目的有:

1、    提供简单易用的数据库访问方法,提高开发效率;

2、    提供面向对象的方式来简化对数据库访问与操作,也就是ORMap方式;

3、    屏蔽数据库差异,使开发出的产品容易在不同数据库产品上移植。

为了适应软件快速开发的需要,软件企业应该借助组件产品或开源软件项目来搭建这些基础设施。在.Net平台上,目前比较成功和应用较广的开源项目有NHibernate和IBatisNet等,它们在ORMap方面的表现尤为突出。依赖这些平台,软件开发效率和产品质量都得到了极大提高,ORMap机制渐渐成为大势所趋。

本公司致力于软件组件开发,提供的AppFramework数据库访问组件具有高效的ORMap机制,调用接口简单灵活,支持各种主流的数据库平台,是个非常优秀的数据访问组件。本文详尽描述了AppFramework数据库访问组件使用的方法和技巧,有助于开发者最大程度发挥出AppFramework的优势。

1.2  各种优秀ORMap工具比较

NHibernate和IBatisNet等虽然都实现了ORMap,但它们的设计侧重点有所不同,有着各自的优势和缺陷,适合于特定的项目。NHibernate实现了纯对象化的ORMap,在屏蔽数据库差异、面向对象方面做的非常好,但在访问与操作海量数据时其性能表现较差,也不易实现复杂的查询统计功能。NHibernate适合那些数据量不大、性能要求不高、复杂度不高的场合。

IBatisNet是一个轻量级ORMap工具,它把所有的SQL脚本以模板的方式集中到若干个XML配置文件里,用反射的方式向把C#类实体对象属性与SQL模板的参数绑定,动态生成参数化的SQL语句发送给数据库执行,查询的结果集也用反射的方式构造为对象集合返回给程序。由于提供了灵活的SQL模板机制,在海量数据的访问与操作方面其性能比NHibernate要高得多,也很容易实现各种复杂的数据查询统计功能。但是IBatisNet也存在许多几个不足之处,有些还是先天因素造成的:

第一,数据库可移植性差。IBatisNet获得高性能与灵活性也是付出代价的,它牺牲了数据库可移植性:由于编写SQL模板不得不用到数据库产品的一些语法差异,例如ORACLE的TO_DATE、Length()、SYSDATE等,为了把产品移植到其它数据库,开发人员不得不对大量的SQL模板进行翻译。

第二,无法方便地向数据库中插入NULL值。因为IBatisNet是直接把C#的基本类型(如int/DateTime)插入到数据库中字段的。对于一些C#值类型,例如int,并没有NULL状态。于是不得不采用一些特殊的值来表示NULL,例如int.MinValue。IBatisNet数据映射器会自动把int.MinValue转换为NULL插入到数据库,而从数据库中获得NULL时,也会转化为C#的int.MinValue。这样,程序就要对int.MinVaue这个值进行特殊处理,例如不能把int.MinValue直接显示在DataGrid里或界面上。有一种规避的方法,就是避免向数据库插入NULL,即要求所有业务数据入库的值都不为空。但这样作实际上是限制了程序的行为能力,例如无法实现单据草稿的保存。

第三,在插入数据时无法方便的使用字段默认值。最明显的就是类似于LAST_UPDATE_TIME了,通常为了保证这个字段的一致性,通常在插入新记录时采用当前数据库时间作为字段值。但IBatisNet接收的实体类对象属性都是普通C#类型,并不具备传入表达式的能力。如果采用动态SQL,则会导致SQL模板和参数实体类过于复杂,将极大降低性能。

第四,在查询返回大量对象时,用反射的方式构造实体的方式性能损失是相当大的。实体类属性数目越多、返回记录数越多,用到反射的次数也越多,查询性能降低就越明显。

第五,不能方便地限定查询语句返回的字段。ADO.Net执行查询时,select语句里设置了几个字段就返回几个字段到DataTable。而IBatisNet若要返回不同的字段就要定义多套ResultMap,否则就定义一套所有字段的ResultMap,任何查询都返回所有字段。这样无疑浪费了数据库服务器与应用服务器之间的网络带宽,在进行海量数据访问时性能将严重降低。

第六,返回的结果IList不能够方便地进行二次查询。相比之下,ADO.Net返回的DataTable虽然性能差一些,但可以实现在应用程序内存中灵活和高性能的二次查询。

第七,无法直接利用数据库的特殊语法支持海量数据的分页查询功能。众所周知Oracle提供了ROWNUM实现数据数据库内分页功能,若要利用这一特性,就要在SQL模板里直接硬编码这些特殊语法,这必然导致大量的移植工作。

第八、缺少代码生成和检查工具。程序里的变量名与Sql模板里的变量经常会出现不一致,而这些错误无法在编译时发现,靠人工检查很容易造成错误泄漏。也没提供工具直接生成SQL模板和映射配置文件。

第九,IBatisNet的SqlMap文件里的SQL语句以明文存放,容易被修改造成重大安全隐患,尤其不适合开发C/S应用程序。

第十,由于Sql模板采用动态加载的方式,如果写错了SQL,程序里难以跟踪调试,这对初学者来说无疑是对耐心和信心的极大考验。

总之,IBatisNet虽然提灵活、高性能的ORMap机制,但却损失了数据库可移植性的,在使用方便性和局部性能方面也都有很大提高的余地。

1.3  AppFramework数据访问组件的组成和优势

AppFramework数据访问组件由下列文件组成:

1、       AppFramework.DBAccess.dll

提供多数据库统一的访问接口,提供DAO管理器、数据库会话管理器。

2、       AppFramework.Data.dll

提供核心的数据结构和基础类。

3、       AppFramework.Tools.CodeGenPlugin.msi

提供集成于Visual Studio 2005的C#代码生成器插件,用于生成DAO/Model/各种接口。

4、       DBAccess.config

配置数据库连接串。

5、       CodeGenPlogin.config

配置代码生成器参数。

6、       *.DaoGen文件

配置DAO生成信息,并由CodeGenPlugin解析生成代码。

 

AppFramework数据库访问组件针对IBatisNet的种种缺陷提出相应的解决方案,相比之下有如下优势:

1、  从扩展基础数据类型入手,解决了空值问题和默认值问题;

2、  提供了内置的数据库内分页访问机制,极大地提高了海量查询的响应速度;

3、  增加ObjectTable<T>泛型类来承载查询返回的对象集,不但比IList更加强类型化,还提供了二分查找功能,使得对象结果集可以在应用程序内存中进行重排序和快速查找;

4、  提供了强大的QueryFilter类构造查询条件,使得实现数据查询不再需要编写复杂的SQL语句;

5、  提供类似IBatisNet的Sql模板功能,为复杂的查询统计提供较直观的开发模式;

6、  提供代码生成工具,生成的类代码的同时可以类之间的继承关系和接口实现关系,所有DAO类方法均以接口作为参数,使得代码更加具有可扩展性和灵活性。

7、  Sql模板和ORMap直接生成.cs原代码,编译为可执行代码,各种ORMap映射文件无需再随主程序集一起部署,提高了代码的安全性,提高了代码的可调试性,也提高了ORMap的性能。

 

下面三张表格罗列的测试数据,可以明显看出AppFramework数据库访问组件的性能全面超越了IBatisNet:

 

表I –10并发20循环(数据库和测试机分开)

对比项目

iBatis2.0

(毫秒)

AppFramework

(毫秒)

后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)

19.8

16.1

QueryFilter:18.0

1.23

1.10

每秒插入实体

(20次insert)

41

21

1.95

更新实体

(20次单条update)

27

19

SqlMap:24

1.42

1.13

查询结果集(平均101行)

(2循环200次select)

1100

690

不定字段:720

1.59

1.53

 

表II –50并发4循环(数据库和测试机分开)

对比项目

iBatis2.0

(毫秒)

AppFramework

(毫秒)

后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)

17.5

13.3

QueryFilter:14.5

1.32

1.21

插入实体

(20次insert)

36.1

17.4

2.07

更新实体

(20次单条update)

23.5

15.9

SqlMap:20.3

1.48

1.16

查询结果集(平均101行)

(1循环200次select)

1055.1

666.8

不定字段:710.1

1.58

1.50

 

表III –50并发10循环(数据库和测试机同机)

对比项目

iBatis2.0

(毫秒)

AppFramework

(毫秒)

后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)

6.1

5.3

QueryFilter: 5.75

1.15

1.06

插入实体

(20次insert)

15.1

10.8

1.40

更新实体

(20次单条update)

10.4

7.5

SqlMap:9.3

1.38

1.12

查询结果集(平均101行)

(1循环200次select)

560

360

不定字段:380

1.56

1.47

 

总之,AppFramework数据库访问组件是一个高性能、接口简单、可移植性强、高灵活性的综合数据访问解决方案。使用AppFramework数据库访问组件,可以降低企业的开发人员培训成本,提高产品的开发速度,提高产品稳定可靠性,提高产品的可伸缩性和可移植性。下文将分入门、精通、高级三个篇章,详细讲述如何使用AppFramework数据库访问组件来搭建应用程序。 
Debian 9下手工部署Nextcloud 18:LAMP深度调优与安全加固指南 Nextcloud 是开源私有云的核心平台,其本质是基于 PHP 的 Web 应用服务,依赖 LAMP(Linux-Apache-MySQL-PHP)技术栈实现文件同步、协作办公与数据自治。理解其运行原理需掌握 Apache MPM 模式切换、PHP-FPM 进程管理、OPcache 缓存机制及 MariaDB 字符集配置等底层知识。这类传统部署方式虽步骤较多,但具备极高的可审计性、安全可控性和长期稳定性,特别适合教育机构、中小团队及边缘服务器等对数据主权和运维透明度要求严格的场景。本文聚焦 Debian 阅读详情

相关推荐

appframework-1.0.3.jar

org.jdesktop.application.Application appframework-1.0.3.jar

appframework简单布局

1.Header右上角加了一个设置图标,主要是考虑到现在很多app右上角会有一个按钮。 2.Page内容里面的分割线小于1px的实现,主要是app现在越来越弱化分割线,很多app不仔细看基本上很难看到有这个线

mofijeck的专栏 2912

appframework

appframework.rar

AppFramework1.0数据库访问组件使用说明(六)QueryFilter的使用

 1.1  QueryFilter的使用QueryFilter是AppFramework提供的一个功能强大、不需要编写SQL语句、跨数据库、参数化、执行性能优异的查询条件构造器。有了QueryFilter我们不需要再拼装SQL语句,不用再担心单引号导致SQL注入的安全漏洞,不用担心被众多的AND、OR、NOT等逻辑运算符弄得晕头转向,不用区分处理TO_DATE、UPPER等无法跨数据库的表

框架提高生产力 5312

【FPGA XDMA AXI Bridge 模式】PCIe:BARs 和 AXI:BARs 含义解析

Xilinx的 DMA/Bridge Subsystem for PCI Express IP核中,支持普通的XDMA模式,但是这种模式只允许主机端发起PCIe 读写请求,FPGA内部无法主动发起读写请求,也即FPGA无法主动读写HOST的内存。而该IP核的另一种模式,AXI Bridge模式则支持HOST主动读写,以及FPGA主动读写。该模式下有个参数需要配置,分别是PCIe:BARs以及AXI:BARs。而上述的普通模式只有PCIe:BARs需要配置。下面详细说说这两个参数的含义。

weixin_45888152的博客 3730

基于物联网技术智慧园林绿化养护管理信息平台

近几年来,随着经济不断的发展,城市面积不断的扩大,城市管理中的园林绿化工作也在这种趋势下不断的发生着深刻改变。管养企业是否按制定的管养计划严格执行?绿化事件整改是否及时到位?绿地面积是否在稳步增长?管养的效果如何?如何客观评价管养企业的管养工作?这些都是我们各级管理者需要面对的问题。   智慧园林绿化养护管理信息平台的开发思路以“考核”为核心,整个信息平台体现出“新、快、高、全、享”五个特点。   智慧园林绿化养护管理信息平台的整个开发理念为:依托五大技术手段(全球卫星定位系统技术、地理信...

Cesium的博客QQ2252224326 2458

AppFramework1.0数据库访问组件使用说明(四)基础数据类型

 1.1  基础数据类型1.1.1  有关DBValue 为了规避IBatisNet的空值问题,AppFramework不使用C#基本类型来构造实体类。AppFramework对C#基本类型作了简单封装,增加了一个是否有值的属性来标志字段值是否非空。每一种基本的C#类型都有对应的DBValue对其进行封装。

框架提高生产力 1399

Calibre PEX提参实战:如何用hcell和xcell文件精准屏蔽模块(附避坑指南)

本文深入解析Calibre PEX工具中hcell与xcell文件的协同工作机制,提供模块级寄生参数提取方案。通过实战案例和避坑指南,帮助工程师精准屏蔽已验证IP模块,提升仿真效率和数据一致性,适用于65nm以下工艺节点的复杂SoC设计。

weixin_29275257的博客 626

AppFramework1.0数据库访问组件使用说明(二)入门

 2.1 安装1.1.1  软件环境要求已安装如下软件:1、       安装了.Net Framework 2.02、       安装了Visual Studio 20053、       如果要访问MSAccess数据库,需安装了MDAC(1.7以上版本)4、       如果要访问Oracle数据库,需安装了ODP.NET专业的开发人员一般都知道如何获取和安

框架提高生产力 2523

从零手搓大模型(一)文本如何变成 LLM 的输入

本文介绍了从原始文本到LLM输入向量的完整处理流程。主要内容包括: 文本预处理:通过正则表达式将原始文本分割成token列表,处理标点和空格。 词表构建:创建token到ID的映射字典(vocabulary),这是文本数字化的关键步骤。 简单tokenizer实现:封装了编码(encode)和解码(decode)功能,完成文本与token ID的相互转换。 处理流程:原始文本 → 分词 → token ID → 嵌入表示 → 最终输入向量。 数据形状变化:从字符串逐步转换为(batch_size, cont

echo的博客 998

【Apache Paimon】-- 13 -- 利用 paimon-flink-action 同步 mysql 表数据

在Paimon 诞生以前,若 mysql/pg 等数据源的表结构发生变化时,我们有几种处理方式(1)人工通知(比如常规的使用邮件),然后运维人员手动同步到数据仓库中(2)使用 flink 消费 DDL binlog ,然后自动更新 Hive 的外部表和内部表 schema那么现在,有了 Paimon ,我们可以利用其特性,自动识别并同步 DDL 这些变化,并同步至 hive 的 paimon 格式表中。

欢迎来到我的博客,一起探索代码里的世界! 1249

AppFramework1.0数据库访问组件使用说明(八)DAO类的使用

 1.1  DAO类的使用在AppFramework里DAO类可以由代码生成工具自动生成,开发者只需要通过DAO类基本上就可以完成大部分增删查改业务,一些特殊的业务如果无法用DAO实现,则可以通过SqlMap结合IDBSession来实现。DAO主要处理三类对象:1、       表:生成的代码有增删改查等方法;2、       视图:生成的代码有查询方法;3、      

框架提高生产力 1409

【软件系统架构】系列四:嵌入式技术

嵌入式系统是以应用为中心、以计算机技术为基础,并将可配置与可裁剪的软硬件集成于一体的专用计算机系统。它需要满足功能、可靠性、成本、体积、功耗等方面的严格要求。 嵌入式系统一般由以下组成部分构成:

moton2017的博客 999

AppFramework1.0数据库访问组件使用说明(五)IDBSession使用详解

 1.1  IDBSession使用详解IDBSession负责与数据库打交道,它通过ADO.NET实现几种常用数据库的连接。目前支持3种数据库:SQLServer(7.0、2000、2005三个版本,推荐2005)、ORACLE(8.1.7以上,推荐9i)、MSAccess(需要MDAC1.7以上支持)。与IDBSession有关的关系图如下:       

框架提高生产力 2444

Copilot在游戏开发中的应用:Unity脚本自动生成实践

2021年GitHub Copilot的发布,为代码自动生成带来了革命性突破。作为基于GPT模型训练的AI辅助编程工具,Copilot能根据注释、函数名、代码上下文,实时生成符合语法和逻辑的代码片段,甚至完整脚本。减少重复劳动:自动生成模板代码(如生命周期、结构),让你专注核心逻辑;降低API学习成本:对Unity特有的组件(RigidbodyAnimator)、类(),Copilot能生成符合最佳实践的调用代码;统一代码风格:通过团队共享提示词模板,让生成的代码符合项目规范;快速原型迭代。

AIGC应用创新大全的博客 1617

AutoSAR从0开始实战 --- 目录

​​​​​​本专栏是全网最真实的AutoSAR实战专栏,博主将从一个0基础小白的身份来讲解AutoSAR工具的配置,以及相应代码的讲解。

wj博客 1728

AppFramework1.0数据库访问组件使用说明(七)SqlTemplate与SqlMap的使用

 1.1  SqlTemplate与SqlMap的使用1.1.1  SqlTemplate原理在早期做过报表系统开发的都知道,众多的查询条件和复杂的统计逻辑都直接硬编码在程序里,程序代码与SQL代码交织在一起,程序文件变得冗长杂乱,时间久了就变得难以维护。SqlTemplate是AppFramework提供的一种可视化、结构化的动态SQL语法,其代码为XML格式,从程序中剥离出来编写在

框架提高生产力 1711

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

AppFramework1.0数据库访问组件使用说明(三)配置文件详解

  1.1  配置文件详解1.1.1  在DBAccess.config配置多个数据源如果应用系统规模较大,有可能会使用多个数据源。AppFramework支持多个数据源,配置方法是在DBAccess.config里配置多个节点,并给每个数据源命名不同的名称。注意,为了提高性能,应该把最常用的数据源设置为默认数据源,在DataSource节点里把Default属性设置值为true,例如

框架提高生产力 1456

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

用 AppFramework 替换 Discuz!NT 的数据库访问层

(一)分析DIscuz!NT 支持2种数据源,SqlServer和MSAccess,但其数据库访问层实际上已经支持了 MySQL,只是安装程序还未提供基于 MySQL  的。 Discuz!NT采用了"页面类 -> 业务类 -> 数据库访问类 -> DbHelper -> 数据库"这样的分层方式。数据库访问类有1个大接口3个大实现。所谓大接口就是 IDataProvider 接口,定义了9

框架提高生产力 2289

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

用AppFramework重写Discuz数据访问层源代码

下载地址:http://download.csdn.net/source/331414 修改的地方主要有:1)在解决方案里增加了“Discuz.Data.AppFramework”项目2)AppFramework插件生成的代码放在“Discuz.Data.AppFramework”项目的GenerateCode目录下3)对论坛管理的数据访问类源代码ForumManage.cs做了重

框架提高生产力 2311

凌驾于数据库之上的数据静态缓存技术思考和范例

    一个性能良好的系统,数据的读、写、查、删、改效率至关重要,其中读和查更是重中之重,本篇将以一个简单的实例来探索与数据库无关的数据静态缓存技术。所谓与数据库无关,就是无论存储数据库是何种类型,这个缓存技术都是适用的,要实现这样的数据库无关性,我们需要在数据访问层动刀,及将数据访问层进一步细分为数据库访问中间件层-数据缓存层-数据访问层,其中:    数据库访问中间件层负责与物理数据库打交

liveweb的专栏 1016

java lzma解压_lzma-java

相关开源项目DWR NetBeans plugin:DWR NetBeans pluginCapivara:Capivara是一个文件同步(FileSync)管理器,支持SFTP与FTP服务器.纯Java开发,支持Linux与Windows系统.Jeppers:Jeppers是一个基于Web的Java电子表格.它同时也提供一个用在Swing应用程序的LGPL Grid组件.GWTChismes:G...

weixin_34175388的博客 459

10分钟学会使用mybatis

pipeliner/src/main/java/com/age/sale/dao/SqlMapConfig.xml 数据库配置文件:(这里配置了,tomcat的server.xml就不用配了)

ouyida3的专栏 819

ownCloud Core 服务端技术指南:从 README 到源码的架构、构建与运维全解析

ownCloud Core 是 ownCloud Classic 的服务端核心仓库,承担文件存储、同步、分享以及 WebDAV/CalDAV/CardDAV 等服务端能力。本文以仓库 [README.md](https://link.gitcode.com/i/2e6b17129d3cb824b3db33e218af34d0) 为骨架,结合源码、配置与测试文件,完整梳理 ownCloud Core

gitblog_00908的博客 392
下一篇: AppFramework通用数据库访问组件之来龙去脉
AppFramework
博客等级 码龄19年 61粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值