C++搭建集群聊天室(九):數(shù)據(jù)庫代碼及用戶模型代碼封裝

      網(wǎng)友投稿 678 2022-05-30

      數(shù)據(jù)庫模塊

      db.hpp

      首先,在 include/server 目錄下新增文件夾 db,用于存放數(shù)據(jù)庫相關(guān)文件。

      在 db 文件夾下新增文件:db.hpp

      #ifndef DB_H_ #define DB_H_ #include #include #include using namespace std; // 數(shù)據(jù)庫配置信息 static string server = "127.0.0.1"; static string user = "root"; static string password = "123456"; static string dbname = "chat"; // 數(shù)據(jù)庫操作類 class MySQL { public: // 初始化數(shù)據(jù)庫連接 MySQL(); // 釋放數(shù)據(jù)庫連接資源 ~MySQL(); // 連接數(shù)據(jù)庫 bool connect(); // 更新操作 bool update(string sql); // 查詢操作 MYSQL_RES* query(string sql); //獲取連接 MYSQL* getconnection(); private: MYSQL *_conn; }; #endif

      接下來,實(shí)現(xiàn)這些函數(shù)

      db.cpp

      同樣,在 src/server 目錄下新建 db 文件夾,用于存放數(shù)據(jù)庫文件。

      C++搭建集群聊天室(九):數(shù)據(jù)庫代碼及用戶模型代碼封裝

      新建 db.cpp

      #include "db.hpp" MySQL::MySQL() { _conn = mysql_init(nullptr); } // 釋放數(shù)據(jù)庫連接資源 MySQL::~MySQL() { if (_conn != nullptr) mysql_close(_conn); } // 連接數(shù)據(jù)庫 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

      封裝數(shù)據(jù)。并提供數(shù)據(jù)的訪問。

      #ifndef USER_H_ #define USER_H_ #include 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

      如果說,上面那個(gè)文件是 ==從數(shù)據(jù)庫到用戶層的映射==,那么這組文件就是 ==業(yè)務(wù)層對(duì)用戶業(yè)務(wù)的操作==

      #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 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; } // 根據(jù)用戶號(hào)碼查詢用戶信息 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 文件需要適當(dāng)?shù)淖龀稣{(diào)整。

      加上下面這條

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

      server 里面的 cmake 也要適當(dāng)?shù)淖稣{(diào)整:

      # 定義一個(gè)SRC_LIST變量,存放該目錄下所有的源文件 aux_source_directory(. SRC_LIST) aux_source_directory(./db SRC_LIST) # 指定生成可執(zhí)行文件 add_executable(ChatServer ${SRC_LIST}) # 指定可執(zhí)行文件生成時(shí)需要鏈接的外部庫 target_link_libraries(ChatServer muduo_net muduo_base pthread mysqlclient)

      加一個(gè)源文件的路徑,加一個(gè)外庫。

      編譯遇到問題請(qǐng)直接轉(zhuǎn)文檔 問題解決 專欄,這次的問題很難找到適配的資料,需要靠經(jīng)驗(yàn)嘿嘿。

      C++ 數(shù)據(jù)庫

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:ThinkPHP 視頻學(xué)習(xí)教程
      下一篇:Java基礎(chǔ) 第三節(jié) 第一課
      相關(guān)文章
      在线亚洲高清揄拍自拍一品区| 亚洲午夜精品第一区二区8050| 国产gv天堂亚洲国产gv刚刚碰| 亚洲欧美综合精品成人导航| 亚洲黄色免费电影| 国产亚洲综合久久系列| 亚洲美女在线国产| 美国毛片亚洲社区在线观看| 中文字幕在线观看亚洲视频| 亚洲午夜精品一区二区公牛电影院| 久久久久亚洲AV片无码| 亚洲开心婷婷中文字幕| 亚洲色大成网站www永久一区 | 亚洲国产精品久久久天堂| 久久精品国产精品亚洲| 国产成人精品久久亚洲| 亚洲国产精品日韩| 亚洲?v无码国产在丝袜线观看 | 亚洲国产视频久久| 亚洲国产精品成人精品软件| 亚洲精品国产成人99久久| 久久亚洲国产中v天仙www| 国产国拍精品亚洲AV片| 久久精品国产精品亚洲艾草网美妙| 爱情岛论坛网亚洲品质自拍| 亚洲国产精品一区二区第一页免| 国产成人亚洲综合在线| 午夜在线亚洲男人午在线| 最新亚洲人成网站在线观看| 亚洲av日韩aⅴ无码色老头| 精品国产日韩亚洲一区在线| 精品无码专区亚洲| 国产精品国产亚洲区艳妇糸列短篇| 久久精品亚洲日本波多野结衣| 亚洲日韩在线中文字幕综合| 亚洲精品无码成人片久久不卡| 亚洲国产天堂久久久久久| 亚洲欧洲日产国码无码网站| 亚洲视频欧洲视频| 亚洲kkk4444在线观看| 亚洲国产精品成人久久蜜臀 |