MySQL数据库在游戏服务器领域应用很广泛。众所周知,MySQL是一种关系型数据库。一个MySQL数据库会由很多张表组成,而一张表又包括了最基本的表名,字段类型,字段名称等信息;非空表又是由很多条数据组成的,而每条数据又包含很多列,每一列又是包括字段名和字段值。那么怎么对上述信息进行管理,抽象出一组类来表示呢?

一、定义一个最基本的类来管理数据库表的最基本单元:字段,一个字段包括了字段类型和字段名称。

class Cell
{
public:
    Cell(int cell_type, const string& cell_name): _cell_type(cell_type), _cell_name(cell_name)
    {}
    ~Cell(){}
    int _cell_type; //字段类型
    string _cell_name; //字段名称
};

二、定义一个数据库表类,包含了多个上述字段

class Cells
{
public:
    vector<Cell*> _cells; //表中的字段
    string _cells_name; //表名
   
    Cells(){}
    explicit Cells(const string& cell_name) : _cells_name(cell_name){}
     virtual ~Cells();
     int size(); //表字段个数
     Cell* operator[](const string &name);//根据字段名获取一个表字段
     Cell* operator[](int pos); //根据位置获取一个表字段
     Cell* get_cell(int pos); //根据位置获取一个表字段
     bool add_cell(int cell_type, const string& cell_name); //往表里面加入一个字段
     bool add_cell(Cell *cell); //往表里面加入一个字段
     const char* get_cells_name() const //获取表名
     {
          return _cells_name.c_str();
     }
     void set_cells_name(const string& cells_name); //设置表名
};

 

三、定义管理数据库表类,用于管理所有的表。纯虚类,如果想使用这个类,需要继承它。

class CellsMgr
{
public:
    map<string, Cells*> _cellsmgr;
    static CellsMgr* get_instance();
    virtual bool init_all_cells(const string& url) = 0;//建立数据库连接等操作
    Cells* get_cells(const string& cell_name); //通过表名获取表结构
};

 

四、定义表记录类,包括字段名及值

class CellsRow
{
public:
    map<string, vector<uinsigned char> > _cells_row;
    template<typename T>
    void add_col_value(const char* cell_name, const T value);//给这条记录的某个字段添加一个值
};

 

五、定义管理表记录类,包括多个CellsRow

class CellsRows
{
public:
    vector<CellsRow*> _cells_rows;
    CellsRow* get_cells_row(int row); //获取某行记录
};

当初始化所有的数据库表后,通过这几个类提供的接口,就可以方便获取某张表的结构,获取表的字段,获取表的某一行记录等操作,从而实现了管理数据库表功能的需求。