集群聊天服务器项目【C++】(六)MySql数据库

server/2024/9/22 19:15:45/

前面已经介绍了网络模块和业务模块,本章介绍数据模块,同样保持模块解耦的特性,即业务模块不能出现数据模块内容,如出现SQL语句,接下来看看怎么实现的。

1.环境安装

第一章已经介绍了MySql安装,但注意需要安装MySql开发包,如果没安装则不能调用MySqlAPI,可以使用以下命令检查:

sudo find /usr -name libmysqlclient*

查询结果如下:
在这里插入图片描述

2.数据模块代码

在include/server创建db文件夹,再在改文件下创建db.h头文件,用来链接、操作(增删改查)数据库

#ifndef DB_H
#define DB_H#include <mysql/mysql.h>//mysql的头文件 
#include <string>
using namespace std;//数据库操作类
class MySQL
{
public://初始化数据库连接MySQL();//释放数据库连接资源~MySQL();//连接数据库bool connect();//更新操作bool update(string sql);//查询操作MYSQL_RES *query(string sql);//获取连接MYSQL* getConnection();
private:MYSQL *_conn;//和mysql的一条连接 
};#endif

在src/server/创建db文件夹,在改文件夹下创建db.cpp,代码作用卸载注释了。

#include "db.h"
#include <muduo/base/Logging.h>  //使用了muduo的日志打印代码// 数据库配置信息
static string server = "127.0.0.1";
static string user = "root";
static string password = "123456";
static string dbname = "chat";// 初始化数据库连接
MySQL::MySQL()
{_conn = mysql_init(nullptr); //开辟一段内存空间
}// 释放数据库连接资源
MySQL::~MySQL()
{if (_conn != nullptr)mysql_close(_conn);  //释放内存空间
}// 连接数据库
bool MySQL::connect()
{MYSQL *p = mysql_real_connect(_conn, server.c_str(), user.c_str(),  //链接password.c_str(), dbname.c_str(), 3306, nullptr, 0);if (p != nullptr){// C和C++代码默认的编码字符是ASCII,如果不设置,从MySQL上拉下来的中文显示?mysql_query(_conn, "set names gbk");LOG_INFO << "connect mysql success!";  //muduo日志打印}else{LOG_INFO << "connect mysql fail!";}return p;
}// 更新操作
bool MySQL::update(string sql)
{if (mysql_query(_conn, sql.c_str())){LOG_INFO << __FILE__ << ":" << __LINE__ << ":"<< sql << "更新失败!";return false;}return true;
}// 查询操作
MYSQL_RES *MySQL::query(string sql)
{if (mysql_query(_conn, sql.c_str())){LOG_INFO << __FILE__ << ":" << __LINE__ << ":"<< sql << "查询失败!";return nullptr;}return mysql_use_result(_conn);
}// 获取连接
MYSQL* MySQL::getConnection()
{return _conn;
}

其中更新和查询都使用mysql_query()函数,区别在于返回值。

3.更新各目录下CMakeLists.txt内容

项目目录下的CMakeLists.txt更新为:

cmake_minimum_required(VERSION 3.0)
project(chat)# 配置编译选项
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)# 配置最终的可执行文件输出的路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)# 配置头文件的搜索路径
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/include/server)
include_directories(${PROJECT_SOURCE_DIR}/include/server/db) //新添db加头文件路径
include_directories(${PROJECT_SOURCE_DIR}/thirdparty)# 加载子目录
add_subdirectory(src)

src/server/CMakeLists.txt更新为:

# 定义了一个SRC_LIST变量,包含了该目录下所有的源文件
aux_source_directory(. SRC_LIST)
aux_source_directory(./db DB_LIST)  //添加db的源文件# 指定生成可执行文件
add_executable(ChatServer ${SRC_LIST} ${DB_LIST}) //添加db的源文件
# 指定可执行文件链接时需要依赖的库文件
target_link_libraries(ChatServer muduo_net muduo_base mysqlclient hiredis pthread) //添加mysqlclient库文件

总结

本章比较简单,编写了数据模块代码,并更新了相关的CMakeLists.txt文件。


http://www.ppmy.cn/server/120415.html

相关文章

【protobuf】ProtoBuf的学习与使用⸺C++

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;之前我们学习了Linux与windows的protobuf安装&#xff0c;知道protobuf是做序列化操作的应用&#xff0c;今天我们来学习一下protobuf。 目录 ⼀、初识ProtoBuf 步骤1&#xff1a;创建.proto文件 步…

1. ZYNQ 2. MPSOC 3. FPGA 4. Vitis 5. 项目

### 1. 建立Vitis SDK自带的Hello World工程 首先&#xff0c;我们需要在Vitis SDK中创建一个基本的Hello World工程。这是学习FPGA开发和ZYNQ MPSOC平台的重要第一步。Hello World工程的主要目的是验证开发环境的正确性以及熟悉基本的编程流程。 #### 步骤&#xff1a; - 打开…

linux-软件包管理-包管理工具(RedHat/CentOS 系)

Linux 软件包管理&#xff1a;包管理工具&#xff08;RedHat/CentOS 系&#xff09; 一、概述 在 Linux 操作系统中&#xff0c;软件包管理是系统维护的重要部分&#xff0c;它允许用户安装、升级、卸载和查询软件包。不同的 Linux 发行版使用不同的包管理工具。对于 RedHat …

deadlock detected

目录标题 说明&#xff1a;解决方法&#xff1a;预防措施&#xff1a;如何在PostgreSQL中使用pg_locks视图详细查询死锁涉及的事务信息&#xff1f;PostgreSQL中deadlock_timeout参数的具体配置方法和最佳实践是什么&#xff1f; 配置方法最佳实践在PostgreSQL中&#xff0c;如…

Redis存储原理

前言 我们从redis服务谈起&#xff0c;redis是单reactor&#xff0c;命令在redis-server线程处理。还有若干读写IO线程负责IO操作&#xff08;redis6.0之后&#xff0c;Redis之pipeline与事务&#xff09;。此外还有一个内存池线程负责内存管理、一个后台文件线程负责大文件的关…

【Lua坑】Lua协程coroutine无法正常完整执行问题

问题&#xff1a;发现Lua协程执行到一半&#xff0c;突然被掐断了一样等到了设定的时间没有正常执行协程后续代码&#xff01;非必现bug&#xff0c;若发生大概率在高频率使用协程时易触发。 LuaFramework或xLua uLua都自带有协程coroutine&#xff0c;而且基本都使用对象池缓…

9.19工作笔记

怎么做多空对冲 脚本2怎么实现多空对冲的 首先读取factors和periods中的文件&#xff0c;然后read_coin得到结果strategy里面的cal_factor的作用是将所有的因子排名加权得到一个新的因子&#xff0c;这个就是多因子的做法。其中因子权重为factor_list里面的因子的最后一个元素…

2024年自学手册 网络安全(黑客技术)

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、…