(开头先从网上抄些ORM的介绍)
什么是ORM?
ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射。ORM也可理解是一种规范,具体的ORM框架可作为应用程序和数据库的桥梁。这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。
为什么需要ORM
面向对象的程序设计语言,代表了目前程序设计语言的主流和趋势,其具备非常多的优势,比如:
1、 面向对象的建模、操作。
2、 多态、继承。
3、 摒弃难以理解的过程。
4、 简单易用,易理解性。
但数据库的发展并未与程序设计语言同步,而且,关系数据库系统的某些优势,也是面向对象的语言目前无法解决的。比如:
1、 大量数据操作查找、排序。
2、 集合数据连接操作、映射。
3、 数据库访问的并发、事务。
4、 数据库的约束、隔离。
面对这种面向对象语言与关系数据库系统并存的局面,采用ORM就变成一种必然。


InstantObjects(简称IO)
简介
IO是用DELPHI实现的ORM框架([url]http://www.instantobjects.org/[/url])。IO有以上描述的大部分优点,同时还有以下特点(演示IO自带的DEMO:PrimerCross):
1、 支持多种数据库;
2、 支持自动创建数据库和更新数据库结构;
3、 提供集成到IDE里面的数据模型设计器;
4、 支持包括BLOB、MEMO等多种数据类型;
5、 支持1对多、多对多数据关系的映射;
6、 提供IO对象的缓存与共享,生命周期的管理;
7、 提供IO对象BIN、XML格式的导入导出功能;
8、 提供IQL查询语言;


IO框架模型介绍
1、 IO对象类图
该类图显示出了IO是如何设计ORM的运行期实体对象的。
IO充分利用了DELPHI的RTTI机制,动态生成实体对象的属性,实现丰富的数据映射功能。不过这种侵入式设计,同时带来了一定的复杂性。
Delphi的ORM框架:InstantObjects类图与介绍_InstantObjects

2、 IO对象元数据类图
元数据记录的是实体对象与数据库映射的信息。分两类:类的元数据、表的元数据。IO框架根据元数据类,实现具体的数据到对象、对象到数据映射功能。
Delphi的ORM框架:InstantObjects类图与介绍_IO_02
 
Delphi的ORM框架:InstantObjects类图与介绍_休闲_03

3、 数据库连接类图
这里列出的是IO框架数据库部分的设计类图。
IO框架使用了一套相对比较复杂的设计,目的是使后台支持SQL型数据库(MsSQL、FB)、游览型数据库(Dbisam、Access、XML数据库)。IO在这个设计基础上,提供了两种扩充支持数据库的方式,为框架提供了灵活的扩充功能。图中列出了当前计量使用的IBX控件扩充类(类名以“TInstantIBX”开头)。
这个灵活通用的设计,同时带来了效率的问题。不能很好得利用SQL型数据库的大量数据操作查找、排序等优点。在计量项目中,部分针对IO的修改与扩展就是为了解决这个效率问题。
Delphi的ORM框架:InstantObjects类图与介绍_IO_04

4、 导入导出类图
这图中列的类,提供了实体对象BIN、XML格式的导入导出功能。
导入导出功能,方便应用程序实现数据模板,数据复制等应用功能。

5、 数据游览类图
这部分是IO框架为了满足快速的数据感知控件开发而设计的。为实体对象的查询、游览提供数据访问功能(TdataSet功能)。
由于数据全部通过访问实体对象而来,故在访问数据前必须先创建、初始化好实体对象,在效率与内存占用上都比一般的数据集差。
Delphi的ORM框架:InstantObjects类图与介绍_IO_05

6、 IQL类图
上面ORM介绍中提到“查询语言,是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合”。不过当前很少使用到IQL语言,对这方面的了解也比较少。

7、 异常机制类图


时序图
用ID获取IO对象
Delphi的ORM框架:InstantObjects类图与介绍_IO_06
IO对象保存过程
Delphi的ORM框架:InstantObjects类图与介绍_休闲_07
IO对象对应数据记录删除过程
Delphi的ORM框架:InstantObjects类图与介绍_ORM_08

IO框架的优化讨论
1、 增加属性的迟加载(Lazy Load)功能
增加这个功能的目的是为了提高实体对象实例化速度,减少内存使用。小骆在2.0IO版本中增加过该功能。

2、 增加属性对象的缓存机制
IO实体对象的属性是一个真实的对象,一个实体对象会含有多个属性对象,属性对象的创建与释放次数是很多的。由于属性对象种类比较固定,可以考虑增加属性对象缓存池,解决大量的对象创建、释放带来的效率慢及内存碎片问题。


(以上UML图,都是用ModelMaker制作)