技 术 文 件
文件名称:
AppFramework 数据库访问组件使用说明
文件编号:
版 本:
0.5
共 60 页
版权声明
本文中的所有信息均为 AppFramework 软件开发有限公司内部公开信息,务请妥善保管,未经公司明确作
出的书面许可,不得为任何目的、以任何形式或手段(包括电子、机械、复印、录音或其他形式)对本
文档的任何部分进行复制、存储、引入检索系统或者传播。
AppFramework 软件开发有限公司
目 录
1 概述.....................................................................................................................................................................1
1.1 引言.............................................................................................................................................................1
1.2 各种优秀 ORMAP 工具比较....................................................................................................................1
1.3 APPFRAMEWORK 数据访问组件的组成和优势....................................................................................2
2 入门.....................................................................................................................................................................5
2.1 安装.............................................................................................................................................................5
2.1.1
软件环境
.............................................................................................................................................5
2.1.2
准备
.....................................................................................................................................................5
2.1.3
安装
CodeGenPlogin
工具
...............................................................................................................5
2.1.4
复制
AppFramework
到项目目录下
...............................................................................................5
2.2 添加引用.....................................................................................................................................................6
2.3 添加配置文件............................................................................................................................................7
2.3.1
配置
DBAccess.config
文件
.............................................................................................................9
2.3.2
配置
CodeGenPlugin.config
文件
................................................................................................10
2.3.3
添加
.DaoGen
文件
..........................................................................................................................11
2.4 编写.DAOGEN 文件.................................................................................................................................13
2.4.1
生成代码的结构
..............................................................................................................................13
2.4.2
生成代码的功能
..............................................................................................................................14
2.4.3
最简单的
.DaoGen
文件
.................................................................................................................15
2.4.4
代码生成
..........................................................................................................................................15
2.5 编写简单的程序......................................................................................................................................19
2.5.1
相关类的关系图
..............................................................................................................................19
2.5.2
引用
...................................................................................................................................................19
2.5.3
插入一个实体
..................................................................................................................................20
2.5.4
根据主键获取一个实体
.................................................................................................................20
2.5.5
根据主键更新一个实体
.................................................................................................................20
2.5.6
根据主键删除一个实体
.................................................................................................................21
2.5.7
查询实体集
......................................................................................................................................21
2.5.8
事务处理
..........................................................................................................................................22
3 精通...................................................................................................................................................................24
3.1 配置文件详解..........................................................................................................................................24
3.1.1
在
DBAccess.config
配置多个数据源
..........................................................................................24
3.1.2
完整的
.DaoGen...............................................................................................................................25
3.1.3
配置
CodeGenPlugin.config
使代码生成到其他项目下
..........................................................27
3.2 基础数据类型..........................................................................................................................................27
3.2.1
有关
DBValue..................................................................................................................................27
3.2.2 DBValue
的属性方法
.....................................................................................................................28
3.2.3
有关
DBField...................................................................................................................................29
3.2.4 DBField
的属性方法
......................................................................................................................30
3.3 IDBSESSION 使用详解............................................................................................................................32
3.3.1
获取
IDBSession.............................................................................................................................32
I
3.3.2
常用属性
..........................................................................................................................................33
3.3.3
打开关闭、事务处理命令
.............................................................................................................34
3.3.4
以纯文本为参数的命令
.................................................................................................................35
3.3.5
以
SqlTemplate
为参数的命令
......................................................................................................36
3.3.6
为代码生成器优化的高性能命令
................................................................................................38
3.3.7
基于
QueryFilter
的命令
...............................................................................................................39
3.3.8 ObjectConstructionEventHandler
代理
......................................................................................43
3.3.9 BatchObjectConstructionEventHandler
代理
............................................................................43
3.3.10
实现分页查询
................................................................................................................................43
3.4 QUERYFILTER 的使用.............................................................................................................................44
3.4.1 QueryFilter
的结构
.........................................................................................................................44
3.4.2
用
QueryFilter
实现查询
...............................................................................................................46
3.5 SQLTEMPLATE 与 SQLMAP 的使用.......................................................................................................48
3.5.1 SqlTemplate
原理
............................................................................................................................48
3.5.2
用
SqlTemplate
语法详解
..............................................................................................................51
3.5.3
在
QueryFilter
中使用
SqlMap.....................................................................................................52
3.6 DAO 类的使用.........................................................................................................................................52
3.6.1
获得实体集合
..................................................................................................................................52
3.6.2
获得
DataTable...............................................................................................................................53
3.6.3
两种查询方式的比较
.....................................................................................................................53
3.7 OBJECTTABLE<T>的使用......................................................................................................................54
3.7.1
对
ObjectTable<T>
进行排序
.......................................................................................................54
3.7.2
对
ObjectTable<T>
进行查找
.......................................................................................................54
3.7.3
用
ObjectTable<T>
绑定到控件
...................................................................................................54
3.8 多数据库支持..........................................................................................................................................54
3.8.1 DBAccess.config
的配置
................................................................................................................54
3.8.2
分布式数据库事务的实现
.............................................................................................................54
3.9 使用数据库内分页查询.........................................................................................................................54
4 高级...................................................................................................................................................................55
4.1 分层开发...................................................................................................................................................55
4.2 与其他数据库访问组件的集成.............................................................................................................55
4.3 调用存储过程..........................................................................................................................................55
4.4 实现分布式事务......................................................................................................................................56
II
AppFramework 数据库访问组件使用说明
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
配置数据库连接串。
评论2