当前位置: 首页 > article >正文

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

前面已经介绍了网络模块和业务模块,本章介绍数据模块,同样保持模块解耦的特性,即业务模块不能出现数据模块内容,如出现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.kler.cn/a/308814.html

相关文章:

  • 为什么海外服务器IP会被封
  • HarmonyOS NEXT应用开发实战 ( 应用的签名、打包上架,各种证书详解)
  • 基于Python 和 pyecharts 制作招聘数据可视化分析大屏
  • 探索MoviePy:Python视频编辑的瑞士军刀
  • 神仙级网络安全入门教程(非常详细),从零基础入门到精通,从看这篇开始!
  • 前端系统设计面试题(二)Javascript\Vue
  • 【观察】戴尔AI算力加速服务器“焕新上市”,打通AI落地行业“最后一公里”...
  • 2024年上半年软考【中级】网络工程师 综合知识真题回顾
  • Bio-Linux-shell详解-2-基本Shell命令快速掌握
  • 夕阳红老年大学视频教学网站管理系统设计与实现,按用户最近浏览分类字段推荐视频课程-留言和评论分词过滤
  • Davinci 大数据可视化分析
  • 网站被爬,数据泄露,如何应对不断强化的安全危机?
  • Python3网络爬虫开发实战(15)Scrapy 框架的使用(第一版)
  • 《黑神话:悟空》:中国游戏界的新篇章
  • 计算机毕业设计选题推荐-共享图书管理系统-小程序/App
  • MySQL 中常用函数使用
  • 自动化任务的错误处理:编写健壮的自动化脚本,处理Office应用中的错误和异常情况
  • 成型的程序
  • Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)
  • 望繁信科技携流程智能解决方案亮相CNDS 2024新能源产业数智峰会
  • TI DSP TMS320F280025 Note11:F280025时钟系统
  • React项目中使用发布订阅模式
  • 10_Python流程控制_循环
  • Python中的策略模式:解锁编程的灵活之钥
  • 4. Python之运算符
  • 创新的真相:重新定义旧问题,而不是追逐新的问题