接着上文[集群聊天服务器]----(四)MySQL数据库模块,接下来我们对User类、UserModel类进行剖析,User表和UserModel类是项目最基本也是最重要的部分,通过它我们对用户的id,用户名,密码,状态相关信息进行存储,也决定了登录成功与否以及后续的聊天等内容。
User表设计
创建 User 类:
#ifndef USER_H
#define USER_H
#include <string>
using namespace std;
//匹配user表的ORM类
class User {
public:
User(int id=-1,string name="", string pwd="",string state="offline")
{
this->id=id;
this->name=name;
this->password=password;
this->state=state;
}
void setId(int id) {this->id=id;}
void setName(string name) {this->name=name;}
void setPwd(string password) {this->password=password;}
void setState(string state) {this->state=state;}
int getId() {return this->id;}
string getName() {return this->name;}
string getPwd() {return this->password;}
string getState() {return this->state;}
private:
int id;
string name;
string password;
string state;
};
#endif
- 由于user的id是填入表格以后,数据库自动创建的,所以初始时赋予-1,并提供了设置/获取id,用户名,用户密码,用户状态的相关函数。
创造UserModel类对User表进行数据操作
成员函数
//user表的增加方法
bool insert(User &user);
//根据用户号码查询用户信息
User query(int id);
//更新用户的状态信息
bool updateState(User &user);
//重置用户的状态信息
void resetState();
user表的增加方法
bool UserModel::insert(User &user)
{
//组装sql语句
char sql[1024] = {0};
sprintf(sql,"insert into user(name,password,state) values('%s','%s','%s')",
user.getName().c_str(),user.getPwd().c_str(),user.getState().c_str());
MySQL mysql;
//连接数据库
if(mysql.connect()){
//更新数据库语句
if(mysql.update(sql)){
//获取插入成功的用户数据生成的主键id
user.setId(mysql_insert_id(mysql.getConnection()));
return true;
}
}
return false;
}
- 首先组装sql语句;
- 创建数据库对象,并连接数据库,根据sql语句进行更新user表,其中user为表格名字,user()括号中的为要插入的内容标题,values为对应的值,注意,表格名字以及对应的内容标题一定要和表格对应,否则插入失败 ;
- 更新成功会生成用户id,调用
mysql_insert_id()
函数在user中进行设置,(mysql.getConnection()
作用是获取mysql的连接
根据用户号码查询用户信息
User UserModel::query(int id)
{
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.setPwd(row[2]);
user.setState(row[3]);
mysql_free_result(res);
return user;
}
}
}
return User();
}
- 组装sql语句,
select * from user where id =%d
是对user进行查找id; - 连接数据库,并根据sql语句调用
mysql_use_result()
函数(属于MYSQL_RES类型)逐行进行查询,在调用mysql_fetch_row()
读取结果; - 创建一个User对象,并根据查找结果设置其相应值,返回User对象
- 注意res为内部动态内存开辟,需要释放资源
更新用户的状态信息
bool UserModel::updateState(User &user)
{
char sql[1024] = {0};
sprintf(sql,"update 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;
}
- 组装sql语句,根据id,更新 user表中的状态;
- 连接数据库进行更新
重置用户的状态信息
void UserModel::resetState()
{
char sql[1024] = "update user set state = 'offline' where state = 'online'";
MySQL mysql;
//连接数据库
if(mysql.connect()){
//更新数据库语句
mysql.update(sql);
}
}
- 组装sql语句,这个函数主要是针对捕捉到服务器ctrl+c异常结束后,重置user的状态信息,将表格中online用户的状态都改为offline;
- 连接数据库进行更新