数据表操作层代码Model


我们将数据库的操作和业务代码分离开,因此业务模块应该包含一个个可以操作数据表的对象,通过这些对象的方法来实现对数据库的增删改查操作。

user的ORM类

//与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 = pwd;
        this->state = state;
    }

    //设置id
    void setId(int id)
    {
        this->id = id;
    }
    //设置name
    void setName(string name)
    {
        this->name = name;
    }
    //设置password
    void setPwd(string pwd)
    {
        this->password = pwd;
    }
    //设置state
    void setState(string state)
    {
        this->state = state;
    }

    //获取id
    int getId()
    {
        return this->id;
    }
    //获取name
    string getName()
    {
        return this->name;
    }
    //获取password
    string getPwd()
    {
        return this->password;
    }
    //获取state
    string getState()
    {
        return this->state;
    }

protected:
    int id;          //ID号
    string name;     //姓名
    string password; //密码
    string state;    //状态
};

#endif

group的ORM类

#ifndef GROUP_H
#define GROUP_H

#include "groupuser.hpp"
#include <string>
#include <vector>

using namespace std;

//group的ORM类
class Group
{
public:
    Group(int id = -1, string name = "", string desc = "")
    {
        this->id = id;
        this->name = name;
        this->desc = desc;
    }

    void setId(int id) { this->id = id; };            //设置组id
    void setName(string name) { this->name = name; }; //设置组名
    void setDesc(string desc) { this->desc = desc; }; //设置组功能描述

    int getId() { return this->id; };                     //获取组id
    string getName() { return this->name; };              //获取组名
    string getDesc() { return this->desc; };              //获取组功能描述
    vector<GroupUser> &getUsers() { return this->users; } //获取组成员

private:
    int id;                  //组id
    string name;             //组名
    string desc;             //组功能描述
    vector<GroupUser> users; //组成员
};

#endif

群组用户的ORM类

#ifndef GROUPUSER_H
#define GROUPUSER_H

#include "user.hpp"

//群组用户的ORM类,多了一个role角色信息(创建者还是成员),从User类直接继承,复用User的其它信息
class GroupUser : public User
{
public:
    void setRole(string role) { this->role = role; } //设置角色信息
    string getRole() { return this->role; }          //获取角色信息

private:
    string role; //角色信息
};

#endif

user表的操作类

usermodel.hpp

#ifndef USERMODEL_H
#define USERMODEL_H

#include "user.hpp"

//user表的操作类
class UserModel
{
public:
    //user表的增加方法
    bool insert(User &user);
    //根据用户号码查询用户信息
    User query(int id);
    //更新用户的状态信息
    bool updateState(User user);

    //重置用户的状态信息
    void resetState();
};

#endif

usermodel.cpp

#include "usermodel.hpp"
#include "db.hpp"
#include <iostream>

using namespace std;

//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;         //定义一个mysql对象
    if (mysql.connect()) //连接chat数据库
    {
        if (mysql.update(sql)) //调用数据库更新方法,把这个sql语句传进去
        {
            user.setId(mysql_insert_id(mysql.getConnection())); //拿到数据库生成的id作为用户的id号
            return true;
        }
    }

    return false;
}

//根据用户号码查询用户信息
User UserModel::query(int id)
{
    //组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "select * from user where id=%d", id);

    MySQL mysql;         //创建mysql对象
    if (mysql.connect()) //连接成功
    {
        MYSQL_RES *res = mysql.query(sql); //调用mysql数据库的查询
        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(); //连接失败
}

//更新用户的状态信息
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;
}

void UserModel::resetState()
{
    //组装sql语句
    char sql[1024] = "update user set state='offline' where state='online'";

    //更新用户状态
    MySQL mysql;         //定义mysql对象
    if (mysql.connect()) //连接成功
    {
        mysql.update(sql); //更新
    }
}

friend表的操作类

friendmodel.hpp

#ifndef FRIENDMODEL_H
#define FRIENDMODEL_H

#include "user.hpp"
#include <vector>

using namespace std;

//friend表的操作类
class FriendModel
{
public:
    //添加好友关系
    void insert(int userid, int friendid);

    //返回用户好友列表
    vector<User> query(int userid);
};

#endif

friendmodel.cpp

#include "friendmodel.hpp"
#include "db.hpp"

//添加好友关系
void FriendModel::insert(int userid, int friendid)
{
    //组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "insert into friend values(%d,%d)", userid, friendid);

    //更新friend表
    MySQL mysql;
    if (mysql.connect())
    {
        mysql.update(sql);
    }
}

//返回用户好友列表
vector<User> FriendModel::query(int userid)
{
    //组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "select a.id,a.name,a.state from user a inner join friend b on b.friendid=a.id where b.userid=%d", userid);

    //通过联合查询,查询用户的好友列表
    vector<User> vec;
    MySQL mysql;
    if (mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        if (res != nullptr)
        {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                User user;
                user.setId(atoi(row[0]));
                user.setName(row[1]);
                user.setState(row[2]);
                vec.push_back(user);
            }
            mysql_free_result(res);
            return vec;
        }
    }
    return vec;
}

offlinemessage表的操作类

offlinemessagemodel.hpp

#ifndef OFFLINEMESSAGEMODEL_H
#define OFFLINEMESSAGEMODEL_H

#include <string>
#include <vector>

using namespace std;

//offlinemessage表的操作类
class OfflineMsgModel
{
public:
    //插入用户的离线消息
    void insert(int userid, string msg);
    //删除用户的离线消息
    void remove(int userid);
    //查询用户的离线消息
    vector<string> query(int userid);
};

#endif

offlinemessagemodel.cpp

#include "offlinemessagemodel.hpp"
#include "db.hpp"

//插入用户的离线消息
void OfflineMsgModel::insert(int userid, string msg)
{
    //组装mysql语句
    char sql[1024] = {0};
    sprintf(sql, "insert into offlinemessage values(%d,'%s')", userid, msg.c_str());

    //向offlinemessage表插入msg
    MySQL mysql;         //定义mysql对象
    if (mysql.connect()) //连接成功
    {
        mysql.update(sql); //更新
    }
}

//删除用户的离线消息
void OfflineMsgModel::remove(int userid)
{
    //组装mysql语句
    char sql[1024] = {0};
    sprintf(sql, "delete from offlinemessage where userid=%d", userid);

    //删除offlinemessage表删中id==userid的行
    MySQL mysql;         //定义mysql对象
    if (mysql.connect()) //连接成功
    {
        mysql.update(sql); //更新
    }
}
//查询用户的离线消息
vector<string> OfflineMsgModel::query(int userid)
{
    //组装mysql语句
    char sql[1024] = {0};
    sprintf(sql, "select message from offlinemessage where userid=%d", userid);

    //查询用户的离线消息
    vector<string> vec;  //存储用户的离线消息
    MySQL mysql;         //定义mysql对象
    if (mysql.connect()) //连接成功
    {
        MYSQL_RES *res = mysql.query(sql);
        if (res != nullptr)
        {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                vec.push_back(row[0]);
            }
            mysql_free_result(res);
            return vec;
        }
    }
}

allgroup表和groupuser表的操作类

groupmodel.hpp

#ifndef GROUPMODEL_H
#define GROUPMODEL_H

#include "group.hpp"
#include <string>
#include <vector>

using namespace std;

//allgroup表和groupuser表的操作类
//allgroup表记录所有的群组
//groupuser记录用户和群组的关系
class GroupModel
{
public:
    //创建群组
    bool createGroup(Group &group);
    //加入群组
    void addGroup(int userid, int groupid, string role);
    //查询用户所在群组信息  在客户端呈现
    vector<Group> queryGroups(int userid);
    //根据指定的groupid查询群组用户id列表,除userid自己,主要用户给群组其它成员群发消息
    vector<int> queryGroupUsers(int userid, int groupid);
};

#endif

groupmodel.cpp

#include "groupmodel.hpp"
#include "db.hpp"

//创建群组
bool GroupModel::createGroup(Group &group)
{
    //组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "insert into allgroup(groupname,groupdesc) values('%s','%s')", group.getName().c_str(), group.getDesc().c_str());

    //向allgroup表中插入群组信息
    MySQL mysql;
    if (mysql.connect())
    {
        if (mysql.update(sql))
        {
            group.setId(mysql_insert_id(mysql.getConnection()));
            return true;
        }
    }

    return false;
}

//加入群组
void GroupModel::addGroup(int userid, int groupid, string role)
{
    //组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "insert into groupuser values(%d,%d,'%s')", groupid, userid, role.c_str());

    //在groupuser表中插入信息
    MySQL mysql;
    if (mysql.connect())
    {
        mysql.update(sql);
    }
}

//查询用户所在群组信息 ,在客户端呈现
vector<Group> GroupModel::queryGroups(int userid)
{
    //组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "select a.id,a.groupname,a.groupdesc from allgroup a inner join groupuser b on a.id=b.groupid where b.userid=%d", userid);

    //存储用户所在的群组信息
    vector<Group> groupVec;

    //存储联合查询之后的群组信息
    MySQL mysql;
    if (mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        if (res != nullptr)
        {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                Group group;
                group.setId(atoi(row[0]));
                group.setName(row[1]);
                group.setDesc(row[2]);
                groupVec.push_back(group);
            }
            mysql_free_result(res);
        }
    }
    for (Group &group : groupVec)
    {
        sprintf(sql, "select a.id ,a.name,a.state,b.grouprole from user a inner join groupuser b on b.userid=a.id where b.groupid=%d", group.getId());

        MYSQL_RES *res = mysql.query(sql);
        if (res != nullptr)
        {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                GroupUser user;
                user.setId(atoi(row[0]));
                user.setName(row[1]);
                user.setState(row[2]);
                user.setRole(row[3]);
                group.getUsers().push_back(user);
            }
            mysql_free_result(res);
        }
    }
    return groupVec; //这个东西存着用户的所有群组和所有群组里的用户信息
}

//根据指定的groupid查询群组用户id列表,除userid自己,主要用户给群组其它成员群发消息
vector<int> GroupModel::queryGroupUsers(int userid, int groupid)
{
    //组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "select userid from groupuser where groupid=%d and userid !=%d", groupid, userid);

    vector<int> idVec;
    MySQL mysql;
    if (mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        if (res != nullptr)
        {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                idVec.push_back(atoi(row[0]));
            }
            mysql_free_result(res);
        }
    }
    return idVec;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值