Delphi的ORM框架:InstantObjects类图与介绍

来源:互联网 发布:时无英雄使竖子 知乎 编辑:程序博客网 时间:2024/06/08 01:27

======================================================
注:本文源代码点此下载
======================================================

 

标签:delphiorm instantobjects io

(开头先从网上抄些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机制,动态生成实体对象的属性,实现丰富的数据映射功能。不过这种侵入式设计,同时带来了一定的复杂性。

2、 io对象元数据类图

元数据记录的是实体对象与数据库映射的信息。分两类:类的元数据、表的元数据。io框架根据元数据类,实现具体的数据到对象、对象到数据映射功能。

3、 数据库连接类图

这里列出的是io框架数据库部分的设计类图。

io框架使用了一套相对比较复杂的设计,目的是使后台支持sql型数据库(mssql、fb)、游览型数据库(dbisam、access、xml数据库)。io在这个设计基础上,提供了两种扩充支持数据库的方式,为框架提供了灵活的扩充功能。图中列出了当前计量使用的ibx控件扩充类(类名以“tinstantibx”开头)。

这个灵活通用的设计,同时带来了效率的问题。不能很好得利用sql型数据库的大量数据操作查找、排序等优点。在计量项目中,部分针对io的修改与扩展就是为了解决这个效率问题。

4、 导入导出类图

这图中列的类,提供了实体对象bin、xml格式的导入导出功能。

导入导出功能,方便应用程序实现数据模板,数据复制等应用功能。

5、 数据游览类图

这部分是io框架为了满足快速的数据感知控件开发而设计的。为实体对象的查询、游览提供数据访问功能(tdataset功能)。

由于数据全部通过访问实体对象而来,故在访问数据前必须先创建、初始化好实体对象,在效率与内存占用上都比一般的数据集差。

6、 iql类图

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

7、 异常机制类图

时序图

用id获取io对象

io对象保存过程

io对象对应数据记录删除过程

io框架的优化讨论

1、 增加属性的迟加载(lazy load)功能

增加这个功能的目的是为了提高实体对象实例化速度,减少内存使用。小骆在2.0io版本中增加过该功能。

2、 增加属性对象的缓存机制

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

(以上uml图,都是用modelmaker制作)

本文出自 “seewind” 博客,请务必保留此出处http://seewind.blog.51cto.com/249547/56111


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
原创粉丝点击