数据库模块

db.hpp

首先,在 include/server 目录下新增文件夹 db,用于存放数据库相关文件。
在 db 文件夹下新增文件:db.hpp

#ifndef DB_H_
#define DB_H_#include<string>
#include<mysql/mysql.h>
#include<muduo/base/Logging.h>using namespace std;// 数据库配置信息
static string server = "127.0.0.1";
static string user = "root";
static string password = "123456";
static string dbname = "chat"; // 数据库操作类
class MySQL {public: // 初始化数据库连接 MySQL();// 释放数据库连接资源~MySQL();// 连接数据库 bool connect();// 更新操作 bool update(string sql);// 查询操作 MYSQL_RES* query(string sql);//获取连接MYSQL* getconnection();private: MYSQL *_conn;
};#endif

接下来,实现这些函数

db.cpp

同样,在 src/server 目录下新建 db 文件夹,用于存放数据库文件。

新建 db.cpp

#include "db.hpp"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){mysql_query(_conn, "set names gbk");}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;
}

用户通用模块

user.hpp

封装数据。并提供数据的访问。

#ifndef USER_H_
#define USER_H_#include<string>
using namespace std;//User表的映射类
class User{private:int id;string name;string password;string state;public:User(int id = -1,string name = "",string pwd = "",string state = "offline"){this->id = id;this->name = name;this->password = pwd;this->state = state;}void setID(int id){this->id = id;}void setname(string name){this->name = name;}void setpassword(string password){this->password = password;}void setstate(string state){this->state = state;}int getID(){return this->id;}string getname(){return this->name;}string getpassword(){return this->password;}string getstate(){return this->state;}
};#endif

东西不多,直接写这里。


usermodel.hpp

如果说,上面那个文件是 从数据库到用户层的映射,那么这组文件就是 业务层对用户业务的操作

#ifndef USERMODEL_H_
#define USERMODEL_H_#include "user.hpp"//User表的操作类
class UserModel{public:bool insert(User &user);User query(int id);bool updateState(User user);
private:};#endif

usermodel.cpp

#include "usermodel.hpp"
#include "db.hpp"
#include<iostream>using namespace std;bool UserModel::insert(User &user){char sql[128] = {0};sprintf("insert into User(name,password,state) values('%s','%s','%s')",user.getname().c_str(),user.getpassword().c_str(),user.getstate().c_str());MySQL mysql;if(mysql.connect()){if(mysql.update(sql)){user.setID(mysql_insert_id(mysql.getconnection()));return true;}}return false;
}// 根据用户号码查询用户信息
User UserModel::query(int id)
{// 1.组装sql语句char sql[1024] = {0};sprintf(sql, "select * from User where id = %d", id);MySQL mysql;if (mysql.connect()){MYSQL_RES *res = mysql.query(sql);if (res != nullptr){MYSQL_ROW row = mysql_fetch_row(res);if (row != nullptr){User user;user.setID(atoi(row[0]));user.setname(row[1]);user.setpassword(row[2]);user.setstate(row[3]);mysql_free_result(res);return user;}}}return User();
}bool UserModel::updateState(User user){char sql[128] = {0};sprintf("updata User set state = '%s' where id = '%d'",user.getstate().c_str(),user.getID());MySQL mysql;if(mysql.connect()){if(mysql.update(sql)){return true;}}return false;
}

cmake 文件修改

最外层的 cmake 文件需要适当的做出调整。

加上下面这条

include_directories(${PROJECT_SOURCE_DIR}/include/server/db)

server 里面的 cmake 也要适当的做调整:

# 定义一个SRC_LIST变量,存放该目录下所有的源文件
aux_source_directory(. SRC_LIST)
aux_source_directory(./db SRC_LIST)# 指定生成可执行文件
add_executable(ChatServer ${SRC_LIST})# 指定可执行文件生成时需要链接的外部库
target_link_libraries(ChatServer muduo_net muduo_base pthread mysqlclient)

加一个源文件的路径,加一个外库。


编译遇到问题请直接转文档 问题解决 专栏,这次的问题很难找到适配的资料,需要靠经验嘿嘿。

C++搭建集群聊天室(九):数据库代码及用户模型代码封装相关推荐

  1. C++搭建集群聊天室(十四):群聊功能

    文章目录 群聊功能思路 放码过来 groupuser.hpp group.hpp groupmodel.hpp groupmodel.cpp 群聊功能思路 1.创建群聊,提交群信息,返回群号 2.拉取 ...

  2. C++搭建集群聊天室(十二):用户单聊及离线消息处理功能实现

    单聊 单聊功能其实很简单的,就是数据包的发送,接收. public.h 现状: #ifndef PUBLIC_H_ #define PUBLIC_H_enum EnMsgType{LOGIN_TYPE ...

  3. C++搭建集群聊天室(十三):添加好友功能实现

    添加好友 又是一个新模块,好友功能. 所以,照旧,先在public中写上,然后写上一个model类,再绑定一下,并在service中调用即可. 最后重新编译,轻车熟路了. public.hpp #if ...

  4. C++搭建集群聊天室(四):工程统帅神器 Cmake,我爱死它了

    "咳咳,讲了这么久,还是不讲点知识点,一直就配置环境配置环境的,烦不烦呐!!!" 快了快了,这个环境搭建完就进主题 文章目录 环境搭建 CMAkeLists.txt 文件编写示例 ...

  5. swarm部署mysql_「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)...

    为了让学习的知识融汇贯通,目前是把所有的集群都放在了一个虚拟机上,如果这个虚拟机宕机了怎么办?俗话说鸡蛋不要都放在一个篮子里面,把各种集群的节点拆分部署,应该把各种节点分机器部署,多个宿主机,这样部署 ...

  6. chat集群聊天室项目 代码+讲解(二):业务模块

    文章目录 项目简单架构图 1.0版本:单服务器 2.0版本,横向扩充,负载均衡 3.0版本,调优 代码 讲解 为什么要设置单例 MsgHandler 的设计 业务中为什么不直接对接数据库? 项目简单架 ...

  7. mysql数据库集群 主主复制 原理_MySql搭建集群 之 主主复制(双主代从)MYSQL数据库...

    作者:VEPHP   时间 2017-09-27 <MySql搭建集群 之 主主复制(双主代从)MYSQL数据库>要点: 本文介绍了MySql搭建集群 之 主主复制(双主代从)MYSQL数 ...

  8. 金仓数据库KingbaseES Clusterware配置手册(搭建集群 )

    目前支持两种方式搭建集群: 使用cluster_manager.sh或是手工搭建,推荐使用cluster_manager.sh搭建集群: 目录 4.1. 使用cluster_manager.sh搭建集 ...

  9. Redis数据库搭建集群(集群概念、redis集群、搭建集群(配置机器1、2、创建集群、数据操作验证)、Python与redis集群交互)

    1. 集群的概念 集群是一组相互独立的.通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理.一个客户与集群相互作用时,集群像是一个独立的服务器.集群配置是用于提高可用性和可缩放性. ...

最新文章

  1. UIView翻译 (参考)
  2. SaaS平台只是传统管理软件的试衣间
  3. 如何杀掉本地和远程NT系统进程
  4. 关于Mysql的错误:No query specified
  5. [转]详解Flex布局(语法+教程)
  6. Flex 布局学习笔记
  7. ai俄罗斯方块java,C#实现俄罗斯方块AI
  8. java mschart_关于vb中MSCHART控件画二维线图 - conkeyn - JavaEye技术网站
  9. Oracle多条重复id,查询时间最早的那条
  10. IAR for ARM介绍、下载、安装与注册
  11. leetcode **773. 滑动谜题(拼图)(2021.6.26)
  12. 使用trickle限制网络上传和下载速度
  13. n个单词输入次数 c语言,C语言问题,从键盘输入n个英语单词.输入格式为n,w1,w2,w3…wn,其中n表示随后输入的英语...
  14. 怎样清理苹果手机内存空间_你还不知道?苹果手机这样清理垃圾,轻松腾出10G内存!...
  15. js 实现筋斗云效果(点击tab栏里面的某个地方,会有图片移动到此地方)
  16. 关于parcel的介绍
  17. 常用网络图片url地址
  18. phobos勒索病毒的处理,警惕phobos卷土从来
  19. AE基础教程第一阶段——05时间,快照命令
  20. 仓促的为ic配置了一下编辑器cke和ckf

热门文章

  1. 据说,不懂编程的人未来将寸步难行!
  2. Autofac在.net mvc下的配置和使用
  3. np.nditer函数
  4. Hive的伴奏_AudioJungle超大音乐素材资源包配乐音效库AE模板音乐合集影视片头背景音乐...
  5. 从游戏乐趣的角度看四种玩家分类
  6. arm rtx教程_【RTX操作系统教程】第5篇 RTX操作系统库方式移植(超级简单).pdf
  7. 嵌入式面试知识点总结 -- C语言篇
  8. 《转》MIMO技术杂谈(三):知己知彼,百战不殆--信道信息的获取和应用
  9. 全球与中国先进的玻璃材料市场现状及未来发展趋势
  10. C#-WPF基础入门和进阶系列课程1 运算符封装和案例