基于C++的对象关系映射架构

合集下载

c 面向对象编程

c 面向对象编程

c 面向对象编程C语言是一种广泛应用于系统开发和嵌入式领域的编程语言,它提供了丰富的面向对象编程(Object-Oriented Programming, OOP)特性。

面向对象编程是一种编程范式,通过将数据和操作封装在对象中,使得代码更易于理解、维护和重用。

在C语言中,可以通过结构体和函数指针来实现面向对象编程的特性。

面向对象编程的核心思想是将数据和操作封装在对象中。

在C语言中,可以使用结构体来定义对象的数据成员,使用函数指针来定义对象的操作。

通过将相关的数据和操作封装在一个对象中,可以提高代码的可读性和可维护性。

同时,通过定义接口函数来操作对象,可以对对象的数据进行封装,保证数据的安全性和一致性。

面向对象编程的另一个重要特性是继承。

继承是指一个对象可以从另一个对象中继承数据和操作。

在C语言中,可以通过在结构体中包含其他结构体来实现继承的效果。

通过继承,可以实现代码的重用,减少代码的冗余。

多态是面向对象编程的另一个重要特性。

多态是指一个对象可以根据不同的上下文环境表现出不同的行为。

在C语言中,可以通过函数指针和函数回调来实现多态的效果。

通过多态,可以实现代码的灵活性和扩展性,使得程序可以根据不同的需求进行适应和变化。

除了上述特性之外,面向对象编程还包括封装、抽象和消息传递等概念。

封装是指将对象的数据和操作隐藏起来,只提供有限的接口函数来访问和操作对象。

通过封装,可以实现数据的保护和隔离,提高代码的安全性和可靠性。

抽象是指将对象的共同特征提取出来,形成一个抽象类或接口,从而实现代码的模块化和重用。

消息传递是指对象之间通过发送消息来进行通信和交互。

通过消息传递,可以实现对象之间的解耦和松散耦合,提高代码的灵活性和可维护性。

虽然C语言不是一种纯粹的面向对象编程语言,但是通过结构体和函数指针的组合使用,可以在C语言中实现面向对象编程的特性。

通过合理的设计和封装,可以将复杂的系统分解成多个对象,提高代码的可读性和可维护性。

C语言对象的名词解释

C语言对象的名词解释

C语言对象的名词解释引言:C语言是一种通用的、面向过程的程序设计语言,对于初学者而言,熟悉和理解C语言的基本概念和术语至关重要。

本文将深入探讨C语言中的对象,解释其涵义、分类以及常见的应用场景。

一、对象概述对象是C语言中的核心概念之一,指代程序中的基本数据单元。

它是数据的抽象,可以具体化成某种数据类型,存储和处理数据。

对象承载程序的状态和行为,通过操作对象实现程序的功能。

C语言中的对象可以是简单的变量,也可以是复杂的数据结构。

二、对象的分类1. 简单对象:简单对象是C语言中使用最广泛的对象类型,包括整型、浮点型、字符型等。

它们是一种基本的数据类型,具有固定大小和内置的操作特性。

简单对象对应的变量只能存储一个值。

2. 复合对象:复合对象是由多个简单对象组合而成的,例如结构体和联合体。

结构体是一种用户自定义的数据类型,可以包含多个不同类型的成员变量,通过点操作符访问各个成员。

联合体是一种特殊的数据类型,不同成员变量共享相同的内存空间,同一时间只能存储一个成员的值。

3. 数组对象:数组对象由相同类型的数据元素组成,通过下标访问各个元素。

数组在C语言中被广泛应用于存储和处理大量的数据。

数组对象的大小在编译时确定,数组名即代表数组对象本身。

4. 指针对象:指针对象是存储内存地址的变量,用于间接引用其他对象。

指针是C语言的重要特性,可以用于动态分配内存、传递参数和实现数据结构等。

通过指针对象,我们可以操作和修改其他对象的值。

三、对象的应用场景1. 程序状态管理:对象在程序中的状态管理中起着重要作用。

通过定义和操作对象,我们可以跟踪程序中的各个变量的值。

例如,我们可以使用简单对象来存储用户输入的数据,并根据其值做出相应的操作。

2. 数据结构实现:对象的灵活组合和嵌套特性使其成为实现数据结构的重要工具。

通过定义数据结构对象,我们可以更好地组织和管理程序中的数据。

例如,我们可以使用结构体对象来存储学生的姓名、年龄和成绩,并使用指针对象实现链表等高级数据结构。

sqlalchemy反射机制__解释说明

sqlalchemy反射机制__解释说明

sqlalchemy反射机制解释说明1. 引言1.1 概述引言部分将对本文所要讨论的主题进行简要说明。

本篇文章将介绍sqlalchemy 反射机制的原理和应用场景。

通过使用sqlalchemy的反射机制,我们可以动态地将数据库中的表格映射到ORM(对象关系映射)类中,从而方便地操作数据库。

1.2 文章结构本文主要分为五个部分。

首先,在引言部分,我们将概述文章的主题和目标。

接下来,在第二部分中,我们将深入了解反射机制,并介绍sqlalchemy中的反射机制以及其应用场景。

在第三部分,我们将详细讲解反射机制的实现原理,包括数据库元数据和sqlalchemy中的元数据对象。

第四部分将重点介绍如何使用反射机制进行数据库操作,包括创建数据库连接引擎和会话对象、动态生成ORM 类以及执行CRUD操作等高级功能示例。

最后,在第五部分中,我们将总结全文并对未来发展方向进行展望。

1.3 目的本文旨在帮助读者了解sqlalchemy反射机制,并掌握其在实际项目开发中的应用技巧。

通过学习本文内容,读者能够深入理解反射机制的实现原理,掌握sqlalchemy中反射表格函数的使用方法,并能够灵活地运用反射机制进行数据库操作。

无论是初学者还是有一定经验的开发人员,都可以通过本文获得有关sqlalchemy反射机制的详细指南。

2. sqlalchemy反射机制:2.1 理解反射机制:在编程中,反射是指某个程序可以访问、检测和修改该程序本身的状态或行为的能力。

SQLAlchemy反射机制就是利用了Python的元编程特性,使得程序可以自动地根据数据库中已存在的表格结构来生成相应的ORM类,省去了手动定义类与表之间映射关系的过程。

2.2 sqlalchemy中的反射机制:SQLAlchemy是一个功能强大且灵活的关系型数据库ORM框架。

它提供了对多种数据库引擎的支持,并且具备对象关系映射(ORM)和基于SQL表达式构建查询等强大特性。

采用技术选型文档(基本)

采用技术选型文档(基本)

一、开发语言:1、Java语言2、C#语言二、数据库:1、OracleOracle数据库管理系统是一个以关系型和面向对象为中心管理数据的数据库管理软件系统,其在管理信息系统、企业数据处理、因特网及电子商务等领域有着非常广泛的应用。

因其在数据安全性与数据完整性控制方面的优越性能,以及跨操作系统、跨硬件平台的数据互操作能力,使得越来越多的用户将Oracle作为其应用数据的处理系统。

2、MS Sql ServerSQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS),它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的,并于1988年推出了第一个OS/2版本。

SQL Server近年来不断更新版本,1996年,Microsoft推出了SQL Server6.5版本;1998年,SQL Server7.0版本和用户见面;SQL Server 2000是Microsoft公司于2000年推出,目前最新版本是SQL SERVER2008。

三、基本技术构架:1、Struts2框架Struts2是Struts的下一代产品,是在struts和WebWork的技术基础上进行了合并的全新的Struts2框架。

其全新的Struts2的体系结构与Struts1的体系结构的差别巨大。

Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts2可以理解为WebWork的更新产品。

虽然从Struts1到Struts2有着太大的变化,但是相对于WebWork,Struts2只有很小的变化。

2、SpringMVC框架Spring框架提供了构建Web应用程序的全功能MVC模块。

使用Spring可插入的MVC架构,可以选择是使用内置的Spring Web框架还是Struts这样的Web框架。

工业控制资产组件映射模型_解释说明以及概述

工业控制资产组件映射模型_解释说明以及概述

工业控制资产组件映射模型解释说明以及概述1. 引言1.1 概述工业控制资产组件映射模型是一种用于描述和管理工业控制系统中各种组件之间关系的模型。

在工业控制系统中,各个组件之间的连接和交互非常复杂,包括传感器、执行器、设备和软件等。

为了更好地理解和控制这些组件之间的关系,工业控制资产组件映射模型被提出。

1.2 文章结构本文将分为四个部分来介绍工业控制资产组件映射模型。

首先,在引言部分,我们将对该模型进行概述,并说明文章的结构。

接下来,我们将详细解释工业控制资产组件映射模型的定义和原理,以及实际应用案例的分析。

然后,我们将对该模型进行整体概述,包括其重要性和必要性、基本架构和设计原则、以及实施步骤和挑战分析。

最后,在结论部分,我们将总结要点并展望未来对该模型发展的看法。

1.3 目的本文旨在全面介绍工业控制资产组件映射模型,并阐明其在工业控制系统中的重要性和应用。

通过本文的阐述,读者将能够更好地理解和运用该模型,提高工业控制系统的管理效率和安全性。

2. 工业控制资产组件映射模型解释说明2.1 资产组件概念在工业控制领域中,资产组件是指系统中的可独立配置、管理和监控的实体。

这些资产组件可以是物理设备(如传感器、执行器等)、软件模块(如算法、控制逻辑等)或者虚拟资源(如数据库、网络连接等)。

每个资产组件都有自己的属性和功能,可以单独进行配置和维护。

2.2 映射模型定义和原理工业控制资产组件映射模型是一种描述工业控制系统中资产组件之间关系的方法。

这个模型通过将每个资产组件分配一个唯一标识,并使用图谱来表示它们之间的依赖关系和交互方式。

映射模型基于对象关系图(Object Relationship Diagram,简称ORD)理论,使用节点表示资产组件,边表示不同资产组件之间的连接。

映射模型的基本原理是建立一个全局视图,将复杂而庞大的工业控制系统抽象成一张清晰易懂的图谱。

通过对各个资产组件进行分析和建模,可以更好地了解系统架构、功能流程以及信息传递路径。

c对象过程

c对象过程

c对象过程
C是一种面向过程的编程语言,它的主要特点是程序由一系列过程(函数)组成,这些过程按照一定的顺序执行,从而完成特定的任务。

在C中,对象的概念并不像面向对象语言那样那么重要,但是我们仍然可以使用结构体来创建一些类似对象的抽象数据类型。

在C中,我们可以通过定义结构体来实现一个对象的创建。

结构体包含了一组相关的数据成员,这些数据成员可以是不同的数据类型,通过结构体,我们可以将这些数据成员组合在一起,形成一个对象。

举个例子,我们可以定义一个结构体来表示一个学生的信息,包括姓名、年龄、性别、学号等等。

然后我们可以使用这个结构体来创建一个学生对象,并对其进行操作。

比如,我们可以通过结构体中的成员来修改和读取学生的姓名、年龄等信息。

另外,在C中,我们还可以使用指针来实现对象的操作。

指针是一个非常重要的概念,在C语言中,我们可以通过指针来访问对象的属性和方法。

通过指针我们可以将一个对象传递给函数,从而实现对象的方法调用。

总之,在C语言中,对象的概念并不像面向对象语言那样那么重要,但是我们仍然可以使用结构体来创建类似对象的抽象数据类型,并且通过指针来实现对象的操作。

- 1 -。

简述orm框架的基本结构。 -回复

简述orm框架的基本结构。

-回复ORM(Object-Relational Mapping)是一种用于将对象模型与关系数据库模型进行映射的技术。

它通过将数据库的表、行和列等关系型数据和编程语言中的对象进行映射,实现了对象与数据库的互相转化。

ORM框架的基本结构通常包括三个主要的部分:持久化层、映射层和数据访问层。

1. 持久化层持久化层是ORM框架的基础部分,主要负责将对象模型持久化到关系数据库中。

它提供了数据库连接的管理、事务处理、数据写入和读取等功能。

在持久化层中,通常会定义数据库的连接池以提高数据库访问的性能,通过连接管理器管理数据库连接的分配和释放。

同时,持久化层还负责管理事务,保证数据的一致性和完整性。

2. 映射层映射层是ORM框架的核心部分,主要负责将对象模型与数据库模型之间进行映射。

它通过定义对象与关系数据库之间的映射规则,实现了对象的持久化和查询。

在映射层中,通常会定义对象模型和数据库表之间的映射关系。

这些映射关系通常通过注解或配置文件的方式定义,包括对象类与数据库表的映射关系、对象属性与数据库列的映射关系以及关联关系等。

3. 数据访问层数据访问层是ORM框架的上层部分,提供了对数据库的增删改查等操作接口。

它将数据库操作的细节对开发者屏蔽,提供了一系列高层次的API 供开发者使用,简化了数据库操作的过程。

数据访问层的接口通常以持久化对象的形式提供,封装了数据库操作的细节,包括增删改查等常见的数据操作。

通过调用数据访问层的接口,开发者可以方便地进行数据库操作,并获取到所需的数据。

在ORM框架中,通常还会包括一些额外的功能模块,用于支持对象与数据库之间复杂的映射关系和查询操作。

例如,一对多、多对一、一对一、多对多等关联关系的映射,可以通过外键约束或中间表的方式来实现。

此外,ORM框架还提供了灵活的查询语言,用于支持对象模型的高级查询操作,例如多条件、分页、排序等。

一些常见的ORM框架还提供了缓存、日志、性能优化等功能,进一步提高了开发效率和程序的执行性能。

关于Hibernate的对象关系的映射框架

Hibernate可编程的配置方式可编程的配置方式并不是最好的方式,但通过了解可编程的配置方式,可对Hibernate的配置过程的实现有一个更好的了解,而且通过这种方式还可以了解hibernate的一些配置属性的作用和使用方法。

1.获得配置属性编程的配置方式是直接实例化Configuration来获取一个实例,并为它指定XML映射定义文件。

如果映射定义文件在类路径(classpath)中,就使用addResource()方法将XML映射定义文件的信息加载从而进行Hibernate的配置。

For example:Configuration cfg=new Configuration().addResource(“item.hbm.xml”).addResource(“Bid.hbm.xml”);一种更好的方式是指定被映射类,让Hibernate寻找映射定义文件:Configuration cfg=new Configuration().addClass(org.hibernate.auction.item.class) .addClass(org.hibernate.auction.bid.class);Hibernate将会在类路径中寻找名字为/org/hibernate/auction/item.hbm.xml 和/org/hibernate/auction/Bid.hbm.xml映射的定义文件。

这种文Hibernate是一个面向Java环境的对象/关系数据库映射件消除了任何对文件名的硬编码。

Configuration 也会允许开发者编码指定配置属性:Configuration cfg=new Configuration().addClass(org.hibernate.auction.item.class).addClass(org.hibernate.auction.Bid.class).setProperty(“hibernate.dialect”,“org.hibernate.dialect.MySQLinnoDBDialect”).setProperty(“hibernate.connection.datasource”,”java:co mp/env/jdbc/test”).setProperty(“hibernate.order_update”,”true”);2.获得SessionFactory当所有映射定义被Configuration解析后,应用程序必须获得一个用于构造Session实例的工厂。

(整理)C语言嵌入式系统编程修炼之软件架构篇.

C语言嵌入式系统编程修炼之软件架构篇- -模块划分模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。

C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了相对论),C语言模块化程序设计需理解如下概念:(1)模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;(2)某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;(3)模块内的函数和全局变量需在.c文件开头冠以static关键字声明;(4)永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。

如:以上程序的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,这个世界上从来不需要这样的程序。

正确的做法是:这样如果模块1、2、3操作a的话,对应的是同一片内存单元。

一个嵌入式系统通常包括两类模块:(1)硬件驱动模块,一种特定硬件对应一个模块;(2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。

多任务还是单任务所谓"单任务系统"是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。

而多任务系统则可以宏观并行(微观上可能串行)地"同时"执行多个任务。

多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务OS的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。

TCB包括任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。

调度器在任务被激活时,要用到这些信息。

此外,TCB还被用来存放任务的"上下文"(context)。

declarative_base参数

declarative_base参数declarative_base是一个非常有用的工具,它可以帮助我们更加有效地使用SQLAlchemy这个Python ORM工具,提高我们的开发效率。

这篇文章将深入探讨declarative_base的参数,介绍它们的作用以及如何使用它们。

什么是declarative_base?让我们简单地介绍一下declarative_base是什么。

在SQLAlchemy中,我们可以使用两种方式来定义对象关系映射(ORM):基于对象(Object Relational Mapping,ORM)和基于SQL(Structured Query Language,SQL)。

基于对象的ORM让我们可以使用Python 对象来表示数据库中的数据,而SQLAlchemy中最常用的ORM方式就是declarative_base。

declarative_base是一个函数,它接收一个参数,这个参数是一个类,表示所有ORM 类的基础类。

这个基础类会提供给我们一些常用的属性和方法,例如__tablename__、primary_key()等。

我们需要继承这个类,然后在子类中定义我们自己的ORM类。

假设我们需要定义一个名为User的ORM类,它映射了数据库中的一个user表。

我们可以这样写:```pythonfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, StringBase = declarative_base()class User(Base):__tablename__ = 'user'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)```这里我们首先从sqlalchemy.ext.declarative模块中导入declarative_base函数,然后调用它来创建Base类作为所有ORM类的基础类。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第36卷 VoL36 第7期 No.7 计算机工程 Computer Engineering 2010年4月 

April 2010 

・软件技术与数据库・ 文章编号:1o00—_3428(201o)07—_0071—-02 文献标识码:A 中图分类号:TP393 基于C++的对象关系映射架构 

雷文平,韩捷,董辛曼,王丽雅 (郑州大学机械工程学院,郑州450001) 

摘要:为了解决领域模型和数据库之问的紧耦合问题,提出基于c++的对象关系映射(ORM)架构。给出抽象基类、映射器注册表类的关 键技术和部分实现代码,通过智能指针实现领域对象的关系映射和生命周期管理。基于该架构设计并实现的ORM子系统,已应用于设备 状态检测-j安全评价系统中,运行情况良好。 关键词:对象关系映射;智能指针;c++语言 

obj ect Relation Mapping Architecture Based Oil C++ LEI Wen-ping,HAN Jie,DONG Xin-min,"WANG Li-) (School ofMechanical Engineering,Zhengzhou University,Zhengzhou 450001) 

【Abstract】In order to resolve the tight coupling problem between domain model and database,this paper proposes Object Relation Mapping(ORM)architecture based on C++.It gives some key technologies and sectional implement codes about abstract base classes,mapper registry classes,realizes relation mapping and lifecycle management of domain object through intelligent pointer The ORM subsystem designed and realized based on tifs architecture is applied in equipment state monitor and security evaluation system,its operation situation is wel1. [Key words]Object Relation Mapping(ORM1:intelligent pointer;C++language 

传统c++的数据库应用大多采用面向过程的方法,常导 致系统难以扩展和维护。然而,由于c++自身不足,因此该 领域至今仍无完整意义上的对象关系映射(Object—Relation Mapping,ORM)产品。本文利用C++实现对象关系映射的部 分关键技术。 1总体架构 对象关系映射的基本思想是为了解决领域模型和数据库 之间的紧耦合而引入一个中间映射层…(Mapper),如图1所示。 

圈1总体架构 在图1中,Mapper承担了数据映射器(层)的角色; DomainO ̄ect表示领域模型,包含数据和业务逻辑。为了叙 述方便,假设数据库(Database,DB)中有表Sensor和 SensorType,其结构由DDL定义为 create table sensor(ID primary key,name varchar,typelD int foreign Key),create table sensorType(ID primary key,name varchar) 其对应的领域模型类分别为Sensor和SensorType,对应 的数据映射器分别为SensorMapper和SensorTypeMapper。 2领域对象及其标志 为r方便对内存的领域对象进行身份识别以及缓存管 理,需要为对象制定一个标识域,通常它与关系数据库的主 键相对应。考虑现存数据库表中大量采用组合键,且键的数 

目不定,因此,必须有一个统一的键的封装类。以下是任意 个数整型组合键的Key类的部分c++实现: class Key{ //复合键类 private: vector<int>m key;//整型复合链的数编 public: Key(int kO){m key pushback(k0 J;}; 

//构造方法,单一整型主键 Key(int k0,int k1);//构造方法,2整型主键 Key&operator<(const Key&k)const; //应用map必须实现此重载l^J BOOL operator:=(const Key&k)const;//方便进行键值的比较 int value(int i);//返回键值 …//其他构造或助手方法 } 通过Key类的定义,对于任意个数的整型键有一个统一 

的封装。 通过Key的定义,可定义DomainO ̄ect,每个Domain Object都有一个Key唯一标志。每个需要持久化的领域对象 (如Sensor)都从DomainONect继承,如图1所示。 3数据映射器的设计 3.1抽象基类 如果每个领域对象对应一个数据映射器,则必然有很多 

基金项目:国家自然科学基金资助项目“全矢谱技术体系构建及故 障诊断基础研究”(50675209);河南省杰出人才创新基金资助项目“同 源信息融合空间域体系构建与系列产品研发”(062】00500) 作者筒介:雷文平(1977一),男,讲师、硕士,主研方向:数据库 技术,系统状态监测与故障诊断;韩捷,教授、博士生导师; 董辛曼,副教授、博士研究生;乇丽雅,副教授、硕士 收稿日期:2009—09-1 3 E—mail:1wp@ZZH.edu.cn 

7】一 功能相似的数据映射器。为了减少冗余代码,从中抽取一个 共同的抽象基类AbstractMapper,其主要职责有:(1)封装数 据库的CRUD(Create,Retrieve,Update,Delete)逻辑。(2)进行 缓存的管理。客户端(调用者)主要通过AbstractMapper的接 口来完成访问操作,该类的接El定义如下: typedefboost::share0ptr<Domain0hject>DOPTR; class AbstractMapper{ protected:map<Ke y’DOPTR>m cachemap; //缓存容器 public:int Delete(Key k); DOPTR Load(Key k); Key Insert(DOPTR dp); void Update(DOPTR dp); 

3.2智能指针与裸指针 本文用自定义类型智能指针(DOPTR)取代裸指针 DomainObject 主要是防止由于指针所有权不明带来的内存泄 露问题。DOPTR在映射器和客户端之间的传递如图2所示。 

图2 DOPTR在映射器和客户靖之间的传递 由图2可知,当客户clientl调用Load()时,如果 XXMapper从堆中更新一个DomainObject对象指针,加载数 据后将该对象指针缓存到mcachemap容器中,然后将对象 指针返回给客户clientl,此时有2个用户fm cache map和 elient1)同时拥有该指针,如果client2请求同一对象,因此, 该DomainObject对象指针同时有3个所有者,且很难决定由 谁删除该对象。可见,这是缺少垃圾回收机制的c++带来的 问题,会导致内存泄露。为了解决该问题,采用boost扩展 库提供的智能指针shared ptr,shared ptr支持共享所有权和 引用计数,当指针的引用计数减少为0时自动删除对象,且 由于shared ̄tr能与标准C++容器兼容 J,因此也简便了缓 存的管理。用shared ptr封装DomainObject指针可以在各个 子系统之问方便地传输对象指针,而不用考虑释放问题。 3.3 CRUD操作与缓存管理 数据映射器的CRUD操作是通过AbstractMapper和其子 类(in SensorMapper)协作完成的,以Load()为例,在基类中 Load实现为 DOPTR AbstractMapper::Load(Key k){ DOPTR pret=FindFromcache(k);//查询缓存 if(pret.get()!=NULL)return pret; CODBCRecordset mset(PersistDatabase::GetDatabase()); mset.Open(‘‘select from”+GetDBTableName()); msel=LoadByRs(&mset); //钩子函数,子类实现 pset Close(); PutIntoCache(pret); } 其中,PersistDatabase类封装了数据库连接管理功能; 

CODBCRecordset类为CRecordset的派生类,进行记录集的 管理;GetDBTableName()函数让其子类提供要操作的数据库 表名;FindFromCache0表示查看加载的对象是否在本地缓存 中,其作用是为了避免重复加载,保证内存中对象的唯一性, 每次从数据库加载一个新的对象后,用PutlntoCache0将其缓 存。子类中LoadByRs0函数为 ~72一 DOPTR SensorMapper::LoadByRs(CODBCRecordset pset){ DOPTR doptr(new Sensor()); Sensor psensor (Sensor )(doptr.get()); psensor.>SetlD(pset.>Getlnt(“ID”));//读取数据库字段值 int sensorTypeld=pset一>Getlnt(“typelD”); doptr一>SetKey(Key(psel1sor_>m—ID)); MapperRegistry pmr=MapperRegjstry::Instance();//获取注册表 SensorTypeMapper pMap=(SensorYypeMapper )pmr一>GetMap— per(fypeid(Sens0rType)name()); psensor一>SetSensorType(pMap一>Load(Key(sensorrypeId))); // ̄fl载关联对象 return doptr;} 4映射器注册表 由于应用中有许多的DomainObjectMapper,因此为了简 化访问,为所有映射器提供一个全局访问点,定义单件类 MapperRegistry class MapperRegistry{ map<CString,AbstractMapper >mmappers; MapperRegistry(); //私有构造函数 static MapperRegistry instance; public: static MapperRegistry&Instance(); AbstractMapper GetMapper(CString classname);}; 对应实现文件(即.cpp文件)在初始化时进行映射器的注 册工作,注册代码为 mmappers.insert(makepair(typeid(sensor).name(),new Sensor— Mapper())); MapperRegistry类通过一个集合m~mappers来管理所有 映射器,客户通过GetMapper0方法来访问映射器。 5对象关系映射 对于数据库中有关联表TableA,TableB,TableC以及对应 的领域对象DObjA.DObjB,一般有3种方式描述它们之间的 关系: (1)一对一。即TableA与TableB采用外键连接,如,本 文中Sensor表的typelD和Sensortype表的主键ID对应,对 象的关联实现方式是在类Sensor中加入指向SensorType的智 能指针(DOPTR msensorType)。为了保证关联的简单性,这 时2个领域对象的关系是单向关联,即在类SensorYype里不 含有指向Sensor的指针。 (2)一对多。即TableB中引用了TableA的主键,每个ObjA 对象就有多个ObjB对象与其关联。经典的一对多关联为: 从Sensortype表的角度看它与Sensor表的关系其实是一个一 对多的关系,即可以在对象SensorType中采用集合 (vector<DOPTR>m sensor vec)的方法来保存Sensor对象的 单向引用。 (3)多对多。为了表达TableA和YableB之间的多对多关 联,通常要引入第3张表TableC来记录这种关系 J。而对应 的领域对象仍然是2个,两者的关联采用双向的集合引用来 表达,即在DobjA类中加入DobjB的对象集合 (std::vector<DOPTR>mobjb—vec),同时在DobjB类中加入 指向DobjA的集合(std::vector<DOWPTR>mobja—vec)。其 中,DOWPTR定义为 typedel、boost::weak ptr<DomainObject>DOWPTR 这里采用weakptr而不用sharedptr,是为了打破循环 依赖关系 保证DObjB和DObjA均可以正常析构并释放 内存。 (下转第75页)

相关文档
最新文档