C++搭建集群聊天室(九):数据库代码及用户模型代码封装
数据库模块
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++搭建集群聊天室(九):数据库代码及用户模型代码封装相关推荐
- C++搭建集群聊天室(十四):群聊功能
文章目录 群聊功能思路 放码过来 groupuser.hpp group.hpp groupmodel.hpp groupmodel.cpp 群聊功能思路 1.创建群聊,提交群信息,返回群号 2.拉取 ...
- C++搭建集群聊天室(十二):用户单聊及离线消息处理功能实现
单聊 单聊功能其实很简单的,就是数据包的发送,接收. public.h 现状: #ifndef PUBLIC_H_ #define PUBLIC_H_enum EnMsgType{LOGIN_TYPE ...
- C++搭建集群聊天室(十三):添加好友功能实现
添加好友 又是一个新模块,好友功能. 所以,照旧,先在public中写上,然后写上一个model类,再绑定一下,并在service中调用即可. 最后重新编译,轻车熟路了. public.hpp #if ...
- C++搭建集群聊天室(四):工程统帅神器 Cmake,我爱死它了
"咳咳,讲了这么久,还是不讲点知识点,一直就配置环境配置环境的,烦不烦呐!!!" 快了快了,这个环境搭建完就进主题 文章目录 环境搭建 CMAkeLists.txt 文件编写示例 ...
- swarm部署mysql_「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)...
为了让学习的知识融汇贯通,目前是把所有的集群都放在了一个虚拟机上,如果这个虚拟机宕机了怎么办?俗话说鸡蛋不要都放在一个篮子里面,把各种集群的节点拆分部署,应该把各种节点分机器部署,多个宿主机,这样部署 ...
- chat集群聊天室项目 代码+讲解(二):业务模块
文章目录 项目简单架构图 1.0版本:单服务器 2.0版本,横向扩充,负载均衡 3.0版本,调优 代码 讲解 为什么要设置单例 MsgHandler 的设计 业务中为什么不直接对接数据库? 项目简单架 ...
- mysql数据库集群 主主复制 原理_MySql搭建集群 之 主主复制(双主代从)MYSQL数据库...
作者:VEPHP 时间 2017-09-27 <MySql搭建集群 之 主主复制(双主代从)MYSQL数据库>要点: 本文介绍了MySql搭建集群 之 主主复制(双主代从)MYSQL数 ...
- 金仓数据库KingbaseES Clusterware配置手册(搭建集群 )
目前支持两种方式搭建集群: 使用cluster_manager.sh或是手工搭建,推荐使用cluster_manager.sh搭建集群: 目录 4.1. 使用cluster_manager.sh搭建集 ...
- Redis数据库搭建集群(集群概念、redis集群、搭建集群(配置机器1、2、创建集群、数据操作验证)、Python与redis集群交互)
1. 集群的概念 集群是一组相互独立的.通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理.一个客户与集群相互作用时,集群像是一个独立的服务器.集群配置是用于提高可用性和可缩放性. ...
最新文章
- UIView翻译 (参考)
- SaaS平台只是传统管理软件的试衣间
- 如何杀掉本地和远程NT系统进程
- 关于Mysql的错误:No query specified
- [转]详解Flex布局(语法+教程)
- Flex 布局学习笔记
- ai俄罗斯方块java,C#实现俄罗斯方块AI
- java mschart_关于vb中MSCHART控件画二维线图 - conkeyn - JavaEye技术网站
- Oracle多条重复id,查询时间最早的那条
- IAR for ARM介绍、下载、安装与注册
- leetcode **773. 滑动谜题(拼图)(2021.6.26)
- 使用trickle限制网络上传和下载速度
- n个单词输入次数 c语言,C语言问题,从键盘输入n个英语单词.输入格式为n,w1,w2,w3…wn,其中n表示随后输入的英语...
- 怎样清理苹果手机内存空间_你还不知道?苹果手机这样清理垃圾,轻松腾出10G内存!...
- js 实现筋斗云效果(点击tab栏里面的某个地方,会有图片移动到此地方)
- 关于parcel的介绍
- 常用网络图片url地址
- phobos勒索病毒的处理,警惕phobos卷土从来
- AE基础教程第一阶段——05时间,快照命令
- 仓促的为ic配置了一下编辑器cke和ckf
热门文章
- 据说,不懂编程的人未来将寸步难行!
- Autofac在.net mvc下的配置和使用
- np.nditer函数
- Hive的伴奏_AudioJungle超大音乐素材资源包配乐音效库AE模板音乐合集影视片头背景音乐...
- 从游戏乐趣的角度看四种玩家分类
- arm rtx教程_【RTX操作系统教程】第5篇 RTX操作系统库方式移植(超级简单).pdf
- 嵌入式面试知识点总结 -- C语言篇
- 《转》MIMO技术杂谈(三):知己知彼,百战不殆--信道信息的获取和应用
- 全球与中国先进的玻璃材料市场现状及未来发展趋势
- C#-WPF基础入门和进阶系列课程1 运算符封装和案例