很多缺少实际工作经验的同学会认为,操作MySQL还需要封装?!直接写sql语句操作就可以了。其实封装Mysql有以下的好处:

1、更加安全。即使你是相当谨慎的一个程序员,就算在几百处甚至几千处地方写sql操作Mysql也避免不了会出现写错表名,字段名写错了或者写少写多了,符号写错等等。封装可以解决这些问题。

2、更好的移植性。封装其实就是一些共性的集合,这样当然具有更好的移植性了(这样能方便像我一样的搬运工搬代码了)。

3、更好的可读性。封装一般具有更好的可读性,当然在我接触过的一些代码中,封装了之后,可读性更差了;其可读性主要是封装得难以理解,在看不到源代码的时候,根本不知道这些代码有什么作用。

4、能提高程序效率。我们都知道,IO操作的效率是比较低下,读写数据库也属于IO操作的范畴。一般提高读写Mysql的效率在于在一次IO操作中尽量操作更多的数据。例如批量插入数据(INSERT)。当然不用封装也可以批量操作,只是比较困难。

5、更加容易维护。可以想像一下,当你数据库表结构发生变化的时候,如果你用浅白的sql操作Mysql,你要在每一个使用过的地方都要修改,不但增加了工作量,而且更容易出错。

6、更有效率。这里的效率是开发效率,统合以上几点,不难知道封装能具有更好的开发效率。

(PS:上述的封装是指好的封装,差的封装有可能适得其反)

下面先看一下用例,以查找为例:

数据库表new_table的所有数据

代码的调用

#include

#include

#include "globalvariable.h"

#include "luaengine.h"

#include "gamesocket.h"

#include "log.h"

#include "dll.h"

#include "MyDll.h"

#include "gametime.h"

#include "frame.h"

#include "datatable.h"

#include "showcrash.h"

#include "globalfunction.h"

int main()

{

GameMysql::ALLROWS rows;

int fieldlen = Table::new_table.Find(rows);

for (int i = 0; i < rows.length; ++i)

{

for(int j =0; j< fieldlen; ++j)

{

printf("%s\t",rows.row[i][j]);

}

printf("\n");

}

GameMysql::ClearAllRows(rows);

printf("\nadd a condition.....\n");

Table::new_table.SetSelectCondition(Table::NEW_TABLE::Fields[Table::NEW_TABLE::Age],99,GameMysql::EQ);

fieldlen = Table::new_table.Find(rows);

for (int i = 0; i < rows.length; ++i)

{

for(int j =0; j< fieldlen; ++j)

{

printf("%s\t",rows.row[i][j]);

}

printf("\n");

}

GameMysql::ClearAllRows(rows);

printf("\nadd more a condition.....\n");

Table::new_table.SetSelectCondition(Table::NEW_TABLE::Fields[Table::NEW_TABLE::Age],99,GameMysql::EQ,false);

Table::new_table.SetSelectCondition(Table::NEW_TABLE::Fields[Table::NEW_TABLE::School],"XX大学",GameMysql::EQ);

fieldlen = Table::new_table.Find(rows);

for (int i = 0; i < rows.length; ++i)

{

for(int j =0; j< fieldlen; ++j)

{

printf("%s\t",rows.row[i][j]);

}

printf("\n");

}

return 0;

}

下这里定义了表的结构

#ifndef DATATABLE_H

#define DATATABLE_H

#include "gamemysql.h"

namespace Table

{

GameMysql new_table("new_table");

namespace NEW_TABLE

{

enum Field

{

Name,

Age,

School

};

const char * Fields[] = {"name","age","school"};

}

GameMysql gametime("gametime");

namespace GAMETIME

{

enum Field

{

OpenServerTime,

ActiveDate,

PetLiveTime,

Time

};

const char * Fields[] = {"openservertime","activedate","petlivetime","time"};

}

}

#endif // DATATABLE_H

在这里设置查询条件,一般在游戏当中,只保存整型和字符串。

void GameMysql::SetSelectCondition( string field, int val, unsigned int r, bool isend /*= true*/ ,unsigned int c)

{

CHECKRELATION(r);

CHECKCONNECT(c);

SETTEMP(connect[c]);

static char str_val[32];

sprintf(str_val,"%d",val);

m_condition[GameMysql::SELECT] = m_condition[GameMysql::SELECT] + field + relation[r] +str_val + temp;

}

void GameMysql::SetSelectCondition( string field, string val, unsigned int r, bool isend /*= true*/ ,unsigned int c)

{

CHECKRELATION(r);

CHECKCONNECT(c);

SETTEMP(connect[c]);

m_condition[GameMysql::SELECT] = m_condition[GameMysql::SELECT] + field + relation[r] + "'" + val + "'" + temp;

}

最后就是执行查询了

unsigned int GameMysql::Find(ALLROWS &rows)

{

HANDLEERROR(0);

if (m_findval == "") m_findval = "*";

if (m_condition[GameMysql::SELECT] == "" )

{

m_sql[GameMysql::SELECT] = "SELECT " + m_findval + " FROM " + m_tablename;

}

else

{

m_sql[GameMysql::SELECT] = "SELECT " + m_findval + " FROM " + m_tablename + " WHERE " + m_condition[GameMysql::SELECT];

m_condition[GameMysql::SELECT] = "";

}

static unsigned int field_len = 0;

if (0 != mysql_query(g_db_handle,m_sql[GameMysql::SELECT] .c_str()))

{

printf("Mysql Find Rows Error...\n");

field_len = 0;

rows.length = 0;

}

else

{

m_data_res = mysql_store_result(g_db_handle);

static MYSQL_ROW row;

while((row = mysql_fetch_row(m_data_res)) != NULL)

{

rows.row.push_back(row);

}

field_len = mysql_num_fields(m_data_res);

rows.length = mysql_num_rows(m_data_res);

mysql_free_result(m_data_res);

}

m_findval = "";

return field_len;

}

当然以上只是提供对Mysql封装的一个思路,也许你有更好的思路!也许之后我不再认为这是一种好设计!

游戏服务器mysql封装_游戏服务端之C++封装Mysql相关推荐

  1. python游戏服务器搭建教程_游戏服务端pomelo安装配置

    游戏服务端pomelo安装配置 一.安装环境 debian 7.0 amd64 二.安装需要的组件 1.安装nodejs 注:debian下nodejs没有相应的apt包,所以无法用apt-get安装 ...

  2. 网狐 游戏服务器 没有反应_游戏行业该怎么选择服务器?

    游戏服务器其实和一般的服务器一样,但是因为行业的特殊性原因,游戏服务器对服务器的性能要求更高,对带宽资源的要求也更高.但是也不是所有的游戏供公司都一定要选择高配置的服务器,游戏公司应该按照自己的游戏类 ...

  3. 流放者柯南自建服务器 linux,流放者柯南服务器搭建教程 流放者柯南虚拟机建服务器方法(4)_下载服务端_游侠网...

    下载服务端 ConanExiles搭建个人服务器教程(Windows) 1. 下载STEAMCMD https://steamcdn-a.akamaihd.net/client/installer/s ...

  4. 热血江湖数据库MYSQL修改_热血江湖门派端数据库详细解释(mysql)

    数据库:          表:                列: rxjhaccount┬tbl_account┬fld_id  帐号 │                  ├fld_passwo ...

  5. 游戏虚拟盘服务器,网维大师虚拟盘服务端

    请先安装好游戏虚拟盘,并启动游戏虚拟盘服务后,再添加游戏虚拟盘,否则无法完成游戏虚拟盘的添加配置操作. 网维大师游戏虚拟盘5.6.0.0及更高的版本已将游戏虚拟盘服务端与同步节点整合,因此只要您配置好 ...

  6. 游戏开发--开源软件11--Firefly(python 服务端分布式框架)||pygame

    2019独角兽企业重金招聘Python工程师标准>>> Firefly是免费.开源.稳定.快速扩展.能 "热更新"的分布式游戏服务器端框架,采用Python编写, ...

  7. 学习 ET(1)- 开源的游戏客户端(基于 unity3d)服务端双端框架

    我: 客户端程序员,15+ 以上 C++ 编码经历, 还算扎实.Unity 编码经历 1年,C# 没有单独学过.真不想离开C++的世界,大形势驱使进入了Unity+C#世界. ET - 开源的游戏客户 ...

  8. 在以TCP为连接方式的服务器中,为什么在服务端设计当中需要考虑心跳?

    https://www.zhihu.com/question/35013918 在以TCP为连接方式的服务器中,为什么在服务端设计当中需要考虑心跳? 这个心跳包除了告知服务端我在线,还有其他作用吗?比 ...

  9. 计算机毕业设计JavaVue.js网上书城管理系统设计与实现服务端(源码+系统+mysql数据库+lw文档)

    计算机毕业设计JavaVue.js网上书城管理系统设计与实现服务端(源码+系统+mysql数据库+lw文档) 计算机毕业设计JavaVue.js网上书城管理系统设计与实现服务端(源码+系统+mysql ...

  10. 封装网络通信 socket 服务端和客户端

    文章目录 1.C++封装的socket 服务端 1.1 代码示例 1.2 代码解析 1.2.1 成员变量 1.2.2 成员函数 1.2.3 构造函数和析构函数 1.2.4 服务端类解析 2.C++封装 ...

最新文章

  1. Tensorflow csv文件读写与分批训练
  2. MSN都出8.1啦!
  3. C和指针之字符串之实现strcpy函数
  4. html控制按钮里面的文字,有谁可以告诉我web网页制作中通过三个按钮控制页面上的一段文字放? 爱问知识人...
  5. 常用的JDBC的驱动
  6. 第三章CDMA的原理和应用(1)
  7. 方舟生存进化mysql_基于MySQL 的 SQL 优化总结_卡盟,辅助
  8. web版微信自动发消息(实现微信个人号机器人)
  9. python外国网站爬虫_10分钟教你用python爬取网站信息:这可能是全网最好用的爬虫代码...
  10. python拆分PDF
  11. TI | TM4C123Gx单片机之---ADC笔记
  12. panabit连接控制
  13. 敏捷组织︱如何打造VUCA时代的敏捷型组织?
  14. 电脑发出很大的嗡嗡声_跟踪嗡嗡声的十大方法
  15. 对比“码绘”与“手绘”的区别
  16. 职工信息管理系统(链表版)
  17. ACM暑假集训总结(2014年夏)
  18. 基于RGB颜色空间的算法
  19. 用python设计一个简易的英汉互译界面_使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具...
  20. 视觉SLAM十四讲CH8代码解析及课后习题详解

热门文章

  1. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_05-新增页面-服务端-接口测试...
  2. 阶段3 2.Spring_06.Spring的新注解_5 spring的新注解-PropertySource
  3. C语言编程-9_4 字符统计
  4. 爬kuku漫画网站的小爬虫
  5. 怎么将表中的空格都转变为0???
  6. BFS Codeforces Beta Round #94 (Div. 2 Only) C. Statues
  7. 五个最佳编程文本编辑器
  8. hibernate could not resolve property
  9. Windows上 IE10 最快,Mac上Chrome 19最快
  10. RabbitMQ八:交换机类型Exchange Types--Topic介绍