接着上文[集群聊天服务器]----(四)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)){//获取插入成功的用户数据生成的主键iduser.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;
- 连接数据库进行更新