用命令模式实现对象存储——对象与关系数据库

豆豆网   技术应用频道   2007年12月30日    社区交流

内容摘要:本文是笔者根据数据库编程经验,利用C++语言的模板、继承、授权、多态等面向对象特性,借鉴命令模式,实现了对象在关系数据中的存储,降低应用系统与数据库之间的耦合,提高开发效率。

  三、编程实现

  现以图书管理系统的存储部分为例,选择ACCESS数据库,ADO数据访问模型,C++语言根据上述理论来实现对象存储。

  对象存储由三个核心类来协同完成,分别为CEntitySet(实体集)、CEntity(实体对象)和CStorage(存储管理)。CEntity类是所有实体对象的抽象基类。CStorage类调用数据访问模块(ADO),管理与数据库连接,并向应用系统提供对象存储服务。CEntitySet类是参数模板类,它根据查询条件和对象类型,调用ADO访问数据库并生成需要的实体对象集合,并向应用系统提供对象集合访问服务。

  图书管理系统中的对象存储结构如图2所示。

用命令模式实现对象存储——对象与关系数据库

  图2:对象存储结构图

  CEntitySet类部分实现代码。

  CEntitySet类是模板类,其类型参数必须是CEntity类的派生类。类声明如下:

template <class T>
class CEntitySet
{
public:
  CEntitySet(const CString& strName);
  virtual ~CEntitySet(void);
private:
  CString      m_strEntityName;
  CAdoConnection*   m_pConn;
  vector<T*>     m_vecEnt;
  CString      m_strSQL;
public:
……
  BOOL Execute(void); //根据m_strSQL的查询条件,生成符合条件的实体集
  T* operator[](int index) const;
  int GetSize(void) const;
……
};
CEntitySet类声明中Execute()成员函数的实现代码如下:
template <class T>
BOOL CEntitySet<T>::Execute(void)
{
……
  CAdoRecordSet rs(m_pConn);
  if(rs.Open(m_strSQL) == -1)
    return FALSE;
  while(!rs.IsEOF())
  {
    CEntity* pEntity = new T(m_strEntityName);
    ASSERT(pEntity );
    if(pEntity == NULL)
    {
      rs.Close();
      return FALSE;
    }
    if(!pEntity ->Read(&rs))
      break;
    m_vecEnt.push_back(static_cast<T*>(pEntity));
    rs.MoveNext();
  }
  rs.Close();
  return TRUE;
}
四、对象存储模块的使用

  CStorage类在应用程序启动时建立并初始化,在应用程序退出前清理。

来源:vckbase    作者:吴磊    责编:豆豆技术应用

正在加载评论...