-
Notifications
You must be signed in to change notification settings - Fork 0
CC ORM实现
jijinlong edited this page Nov 14, 2016
·
6 revisions
我们需要指定实现的目标 就是定义基本对数据库的操作方式,并提供一个实现的方式,
// 可与数据表对应的类
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;
}
};- 类型的对应关系
- 数据库表的内存消息
- 测试