游戏服务端之C++封装Mysql

C++连接MySQL全攻略:从环境搭建到高性能封装实践 数据库作为数据持久化的核心技术,其核心原理在于通过结构化查询语言(SQL)对数据进行组织、存储和高效访问。在众多数据库系统中,MySQL凭借其开源、成熟和广泛的应用生态,成为C++后端开发中处理数据存储的常见选择。其技术价值在于为应用程序提供了可靠、可扩展的数据管理能力,广泛应用于Web服务、游戏服务器和企业级软件等场景。本文聚焦于C++开发者如何高效、安全地与MySQL进行交互,深入探讨了**预处理语句**如何从根本上防止SQL注入并提升重复查询性能,以及**连接池**设计如何管理数据库连接以应对高并发场 阅读详情

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

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

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

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

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

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

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

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

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

数据库表new_table的所有数据


代码的调用

    #include <stdio.h>  
    #include <time.h>  
      
    #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封装的一个思路,也许你有更好的思路!也许之后我不再认为这是一种好设计!

原文地址:http://blog.youkuaiyun.com/yitouhan/article/details/17187569

Windows免虚拟机部署Linux服务端:原理、实践与问题排查 在软件部署领域,跨平台兼容性是一个常见挑战,尤其当需要在Windows系统上运行原本为Linux环境设计的服务端程序时。其核心原理在于通过依赖库封装、运行时环境内置和脚本适配等技术手段,构建一个兼容层,使POSIX程序能在Windows上直接调用。这项技术的工程价值在于大幅降低了环境搭建的复杂度和资源开销,使开发者或爱好者能够快速在本地Windows环境进行服务端的测试、学习和开发。典型的应用场景包括部署旧版网络游戏服务端、特定中间件或遗留系统进行功能验证。本文将以一个具体的“免Linux”服务端部署为例, 阅读详情

相关推荐

工作多年C/C++该具备哪些专业技能(进阶C++职业规划)

一、C++服务器程序员(流媒体后台,游戏后台,高性能服务器后台) 1. 精通C++,STL,Linux等,熟悉设计模式; 2. 熟练掌握一门脚本语言(Lua, Python, Perl等); 3. 对多线程环境编程有一定的理解,能独立完成服务器端模块的开发、维护和优化; 4. 熟练掌握MySQL数据库的开发维护、性能优化; 1.精通C++编程,3年以上服务器开发经验; 2.有手机游戏或者PC网游开发经验,有过完整手游开发经验者优先; 3.精通Socket协议,了解分布式负载和集群类型的服务器框

Linuxhus的博客 3775

C++封装MySQL操作

MySQL是一个比较好用并且免费的数据库,实际开发中可能会用到。如果想用C++调用MySQL,需要调用MySQL提供的一系列API。但是,这些API是基于C语言编写的,没有面向对象的特征,特别是查询获取结果集,用起来可能不太方便。而在Java中访问数据库,无论是查询还是其他操作,都被高度封装,非常方便。为了弥补这一缺陷,我最近利用课余时间封装了一下MySQL常用的API,下面就来介绍一下。 程序框架 程序主要分为DataBase,QueryResult,QueryRow,QueryFields和一些异常类,

[PE]经典八炮的博客 2826

C++狼人杀服务端:TCP+MySQL+VSCode实战骨架

狼人杀服务端是理解高并发实时游戏后端架构的经典入口,其本质是状态机驱动的网络应用系统。核心原理在于通过TCP长连接维持玩家会话、用MySQL保障强一致性事务与在线状态管理、以C++17原生特性实现低延迟与内存可控性。技术价值体现在对epoll事件循环、RAII资源管理、无锁计票、连接池与SQL执行计划等硬核能力的综合训练。典型应用场景包括校园实训、校招实习项目、C++工程化入门及服务端性能调优实践。本方案聚焦真实可运行的C++程序设计与vscode配置c++环境落地细节,拒绝黑盒封装。

weixin_28049429的博客 296

我的服务端之C++封装Mysql

很多缺少实际工作经验的同学会认为,操作Mysql还需要封装?!直接写sql语句操作就可以了。其实封装Mysql有以下的好处: 1、更加安全。即使你是相当谨慎的一个程序员,就算在几百处甚至几千处地方写sql操作Mysql也避免不了会出现写错表名,字段名写错了或者写少写多了,符号写错等等。封装可以解决这些问题。 2、更好的移植性。封装其实就是一些共性的集合,这样当然具有更好的移植性了(这样能方便像...

20386053 469

C++狼人杀服务端源码:高并发网络游戏开发实战

网络游戏服务器是典型的高并发、低延迟、状态敏感型系统,其核心在于网络通信、状态同步与数据持久化三者的协同设计。基于C++实现的狼人杀服务端,天然具备内存可控、零拷贝序列化、精确线程调度等工程优势,契合实时交互类游戏对性能与确定性的严苛要求。该方案融合Reactor异步IO模型、有限状态机驱动的游戏逻辑、MySQL连接池与事务快照等工业级实践,不仅支撑20人局域网实时对战(<80ms延迟),更提供可复用的网络层、逻辑层与数据层解耦架构。对于C++学习者与中级开发者,它既是课程设计/毕设的即用骨架,也是补足网络

weixin_33095355的博客 335

千年3服务端C/C++源码实战:搭建、调试与优化指南

在MMORPG服务端架构中,C/C++凭借高效的内存管理与多线程控制能力,一直是底层实现的核心语言。理解socket通信、数据同步、地图线程协同等基础原理,是掌握游戏服务器运行机制的关键。对于想要深入研究千年3服务端、在千年3服务端论坛中获取资源的开发者来说,阅读并修改C/C++源码是绕不开的路径。本文以实战经验为基础,覆盖环境搭建、数据库连接、编译常见错误、性能优化及功能扩展方法,帮助初学者从源码层面理解老牌游戏服务端的完整设计,并将这些技术经验迁移到更广泛的网络编程与后端开发场景中。

weixin_28736145的博客 350

mysql数据库 C++封装

前言 为什么要使用mysql数据库? 设想一下有一个很大的(如10G)数据,我们不能将之存放在内存中,只能够放在磁盘上,每一次CPU读取数据都需要进行慢到吐血的磁盘IO操作,那这时使用mysql这种关系型数据库就显得尤为重要的。 记住mysql的数据也是存放在磁盘上面的,不过读取速度更快! 一.关于关系型数据库mysql的介绍,网上已经有很多资料,不用我再多做介绍 二.不同的环境添加mysql的链接包方式不同,在这里介绍Linux环境下的添加方法 首先将mysql文件包放到 /usr/include 目

Worthy_Wang的博客 801

c++ mysqlhelper 数据库访问层功能封装

c++访问mysql数据库的类封装,支持linux和windows两种操作系统,简单实用

Mysql API之C++封装(二)

前一篇文章是简单的连接数据库,查询数据库里面的记录,如果需要对记录的数据进行类型转换就比较麻烦了,下面的类可以帮助你利用struct很快的得到你想要的数据,参考如下。 DBClient_Struct.h: [code="java"] #ifndef __DB_CLIENT_STRUCT_H__ #define __DB_CLIENT_STRUCT_H__ #include #...

lppchina的专栏 294

黑群晖断电后存储池‘已损毁’?别慌,SSH里这几条命令能救急

本文详细解析黑群晖断电后存储池显示‘已损毁’的紧急修复方法。通过SSH命令行工具,提供从诊断到修复的完整流程,包括RAID阵列重新组装、设备重建等关键步骤,帮助用户恢复数据访问。适用于因意外断电导致的存储池异常情况。

weixin_42651748的博客 375

86 arduino 电机yl_(八)arduino入门:直流电机控制

一、本节介绍在本实验中,您将学习如何使用驱动芯片L293D和SunFounder Uno板控制小型直流(DC)电机的方向和速度。为了使初学者更容易,我们将让直流电机左右旋转,自动加速和减速。二、材料准备1 *小型直流电机1 * L293D1 * Arduino Uno板1 *面包板1 * USB数据线杜邦线三、原理讲解L293D这是一个非常实用的芯片,可以独立控制两台直流电机。在这个实验中,只有一...

weixin_29163857的博客 3567

游戏服务器mysql封装_游戏服务端之C++封装Mysql

很多缺少实际工作经验的同学会认为,操作MySQL还需要封装?!直接写sql语句操作就可以了。其实封装Mysql有以下的好处:1、更加安全。即使你是相当谨慎的一个程序员,就算在几百处甚至几千处地方写sql操作Mysql也避免不了会出现写错表名,字段名写错了或者写少写多了,符号写错等等。封装可以解决这些问题。2、更好的移植性。封装其实就是一些共性的集合,这样当然具有更好的移植性了(这样能方便像我一样的...

weixin_39762838的博客 177

别只聊天了!手把手教你为Ollama+Open WebUI搭建本地知识库(基于BGE-M3和Qwen)

本文详细介绍了如何利用Ollama、Open WebUI和BGE-M3构建本地知识库,实现智能问答和文档检索。通过环境准备、文档处理、向量化实战和应用案例,帮助用户突破基础聊天场景,打造高效的个人知识管理体系。特别适合技术文档管理和学术研究场景。

weixin_42523720的博客 478

C++服务端春招面试问题总汇

记录了本人求职时期遇到的一些面试问题

m0_59347684的博客 1534

芯片级IO (Pad) Ring &IP Checklist

芯片级IO Ring,PAD Ring 和IP Checklist检查项目

weixin_37584728的博客 3568

实战指南:利用 LangGraph 的状态管理实现多轮对话的上下文隔离与持久化

本文详细介绍了如何利用LangGraph的状态管理机制,高效实现多轮对话中的上下文隔离与持久化。通过实战代码演示,从基础的消息历史管理到自定义状态扩展,再到使用SQLite进行生产级持久化,系统讲解了如何借助LangGraph的State和Checkpointer自动化处理对话记忆、用户隔离及数据存储,显著提升开发效率。

weixin_28396629的博客 488

游戏服务端开发要点

前言ps:一直希望有个游戏服务端的技能树,此文算是指明方向,故记录于此。 知道该去哪打怪、打什么怪,升级才快。 本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结。第一部分专业基础,用于指导招聘和实习考核, 第二部分游戏入门,讲述游戏服务器端开发的基本要点,第三部分服务端架构,介绍架构设计中的一些基本原则。希望能帮到大家。 一、专业基础1.1 网络1.1.1 理解TCP/IP协议

YiShi's Blog 3456

华为OD机试真题2025双机位C卷 Java&Go 实现【统计员工影响力分数】

华为OD机试真题2025双机位C卷 C语言 实现【统计员工影响力分数】假设你是大型科技公司的数据分析师,负责分析公司内部员工的社交网络。你需要编写一个函数来计算每个员工的影响力分数。影响力分数定义为该员工直接和间接影响的员工数量。 输入描述

MISAYAONE的博客 278

为学弟学妹熬夜的一份零基础 C++ 开发学习路线

大家好,我是帅地。 之前写过几篇学习路线的文章 前端开发学习路线 Java 后端开发学习路线 一般开发岗主流的就是 Java 后台开发,前端开发以及 C++ 后台开发,现在 Go 开发也是越来越多了,今天把 C++ 后台开发学习路线补上。 写之前先来回答几个问题 1、C++ 后台开发有哪些岗位? C++ 后台开发的岗位还是很多的,例如游戏引擎开发,游戏服务端开发,音视频服务端/客户端开发,数据库内核开发等等,而且 C++ 也能用来写深度学习,做硬件底层这些。 总之,C++ 后台开发的岗位,还是很丰富的,大家

帅地 1万+

10、贝叶斯曲线拟合与预测分布详解

本文详细介绍了贝叶斯曲线拟合与预测分布的核心概念与计算方法。从最大似然估计出发,引入参数的先验分布,推导出后验分布与最大后验估计,并进一步展示如何通过积分获得完整的预测分布。文章解析了预测分布中均值与方差的构成,强调贝叶斯方法在量化不确定性方面的优势,涵盖金融、医疗、气象等实际应用场景。最后总结了操作步骤与未来研究方向,帮助读者系统掌握贝叶斯方法在回归问题中的应用。

android的专栏 104

HighTec安装使用

HighTec安装使用

qq_43552564的博客 3835

【C++项目】实时聊天的在线匹配五子棋对战游戏

用户管理:实现用户注册、用户登录、获取用户信息、用户游戏分数记录、用户比赛场次记录等。匹配对战:实现玩家在浏览器网页端根据玩家的游戏分数进行匹配游戏对手,并进行五子棋游戏对战的功能。实时聊天:实现在游戏房间内对战的两个玩家可以进行实时的聊天功能。落子计时棋局房间内观战人机对战WebSocket是从HTML5开始支持的一种网页端和服务端保持长连接的消息推送机制。

nK的博客 1220

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

效果最接近《羊了个羊》(卡牌堆叠游戏)的开源代码

我写的程序是指 卡牌堆叠游戏 ,效果与羊了个羊一致。本文使用 ``C++`` + ``PHP`` + ``H5`` + ``CSS`` + ``JS`` + ``MySql`` 实现。其他语言实现方法类似。我都会耐心讲解,篇幅较长,请看官们做好心理准备。

一起加油 8613

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MySQL(十七):C/C++连接MySQL与API使用

综上所述,我们完成了 MySQL C API 的学习,掌握了如何在 C/C++ 程序中连接 MySQL 数据库,并熟悉了从初始化、建立连接、执行 SQL、获取结果集、遍历数据到释放资源的完整开发流程。同时,我们也通过实际案例,进一步理解了如何将数据库操作融入到应用程序中,实现真正意义上的数据持久化。

cui_ruicheng的博客 411

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Delphi服务端与Cocos2d-x客户端:经典游戏架构深度解析与实战

游戏服务器架构是支撑多人在线游戏的核心技术,其设计直接关系到游戏的稳定性、并发处理能力和实时交互体验。在技术选型中,开发者需要在性能、开发效率、生态成熟度与团队技术栈之间做出权衡。以经典的Delphi服务端与Cocos2d-x客户端组合为例,这种架构在特定历史时期解决了快速构建高并发网络服务与高性能、跨平台移动客户端的双重需求。Delphi凭借其高效的RAD开发能力和稳定的组件库,曾是快速搭建游戏服务端的利器,尤其适合处理早期的网络协议与数据持久化逻辑;而Cocos2d-x作为C++编写的开源引擎,则为移动

weixin_34268579的博客 297
上一篇: 我的服务端之有限制使用Thread
下一篇: 游戏服务端之xml类型转换
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值