Skip to content

CC ORM实现

jijinlong edited this page Nov 14, 2016 · 6 revisions

C++ 实现对mysql 的面向对象的操作

我们需要指定实现的目标 就是定义基本对数据库的操作方式,并提供一个实现的方式,

 // 可与数据表对应的类
 class Object{
 public:
    int a;
 };

// 指定映射到的表
MAPPING_TABLE(Object,"TABLE_OBJECT")
{
    BIND("a",a); // 表中的列
}

// 通过mytable 真正构建对Object 的数据访问
mytable<Object> tobject; 

// 创建或者更新
if (tobject.createOrUpdate())
{
    tobject->a = 100;
    // 保存或者更新
    tobject.saveOrUpdate(); 
}
else
{
    tobject.printErrors();
}

// 指定条件读取一个数据
if (tobject.readOne("where a=100"))
{
    // 使用where 语句获取数据
     // 将数据库中表的数据赋值给tobject
}
else {
   tobject.printErrors();
}

// 批量读取数据
std::list<Object> objects;
if (!tobject::readBatch("where a=100",objects))
{
     tobject.printErrors();
}
// 指定条件更新数据
if (tobject.updateOrInsert("where a=100"))
{
    // 使用where语句更新表
    // 将tobject 数据库中表数据更新到数据库中
}
else {
    tobject.printErrors();
}

这样操作是不是方便很多了? 不用编写sql 只要绑定表 和 字段 就能完成 创建 更新 删除 读取 等操作 数据库的操作没有简单的,封装也不容易,我们提供这样的接口,必然要尽力思虑周全,保证数据库操作的健壮性,我们也设定要拥有数据库连接池,故障提示。

数据库连接封装

class IDBConnection :public Interface<IDBConnection>{
public:
   virtual bool connect(){return false;}
   virtual void close(){}
   enum STATE{
       IDEL = 0, // 连接空闲
       USING = 1, // 连接使用
   };
   STATE state; // 连接状态
   
   // 检查mysql 是否能ping通
   virtual int ping(){return 0;}
};

数据库连接缓存池

class DBConnections{
public:
    // 获取空闲连接
    IDBConnection & getConnection();
    // 回收连接
    void putConnection(IDBConnection &conn);  
    virutal void closeAll();

    virtual bool init(const char *host,const char *dbname,const char *username,const char *pwd);
private:
    // 当前的连接对象集合
    std::list<IDBConnection> _conns;
};

数据库封装

class IDB:public Interface<IDB> {
public:
     // 初始化数据连接信息 
     virtual bool init(const char *host,const char *dbname,const char *username,const char *pwd){ 
         return false;
     }
     
     // 执行sql 语句
     virtual bool execSql(const char *sql) {
          return false;
     }
     
     // 删除数据库
     virtual bool destroy() {
          return false;
     }
};
  1. 类型的对应关系
  2. 数据库表的内存消息
  3. 测试

Clone this wiki locally