当前位置:   article > 正文

c++使用mysqlclient库开发mysql_c++ mysqlx::client

c++ mysqlx::client

使用libmysqlclient库对mysql进行c++开发

安装

sudo apt update && sudo apt install libmysqlclient-dev -y
  • 1

封装客户端

一般都是封装一个客户端类进行开发,如下的mysql.hpp:

#pragma once
#include <mysql/mysql.h>
#include <string>


// mysql的客户端操作类
#pragma once
#include <mysql/mysql.h>
#include <string>
#include <ctime>

// mysql的客户端操作类
class MySql {
public:
    MySql();                            // 初始化数据库连接资源
    ~MySql();                           // 释放连接接资源
    bool connect(const std::string& ip, const uint16_t port, const std::string& user, const std::string& password, const std::string& dbname);                     // 连接数据库
    bool update(std::string sql);       // 更新(insert, delete, update都是这个接口)
    MYSQL_RES* query(std::string sql);  // 查询操作
    MYSQL* GetConnection();             // 获取连接

    void refreshAliveTime() { aliveTime_ = std::clock(); }            //每次进队列刷新时间
    std::clock_t GetAliveTime() { return std::clock() - aliveTime_; } //获取存活时间 ms
private:
    MYSQL* conn_;                       //一条连接
    std::clock_t aliveTime_;            //记录在队列后的存活时间(配合数据库连接池使用的)
};


MySql::MySql() {
    conn_ = mysql_init(nullptr);
}

MySql::~MySql() {
    if (conn_) {
        mysql_close(conn_);
    }
}

bool MySql::connect(const std::string& ip, const uint16_t port, const std::string& user, const std::string& password, const std::string& dbname) {
    MYSQL* p = mysql_real_connect(conn_, ip.c_str(), user.c_str(), password.c_str(), dbname.c_str(), port, nullptr, 0);
    if (p) {
        // C和C++代码默认的编码字符是ASCII,如果不设置,从MySQL上拉下来的中文会乱码
        mysql_query(conn_, "set names gbk");
    } 
    return p; //p若为空不就是false吗
}  

bool MySql::update(std::string sql) {
    return !mysql_query(conn_, sql.c_str());
}

MYSQL_RES* MySql::query(std::string sql) {
    if (mysql_query(conn_, sql.c_str())) {
        return nullptr;
    }
    return mysql_use_result(conn_);
    
    /* 查询后一般这样操作
        auto res = conn_ptr->query(sql);
        if (!res) {
            std::cout << "query failed" << std::endl;
            return {-1, {}};
        }
		//query sucess,把数据存放到2维数组中
        std::vector<std::vector<std::string>> msg;
        uint32_t num_fields = mysql_num_fields(res); //列数
        while (auto row = mysql_fetch_row(res)) { //取一行
            std::vector<std::string> tmp;
            for (int i = 0; i < num_fields; i++) { //遍历该行的每一列
                tmp.push_back(row[i] ? row[i] : ""); //字段为NULL则填""
            }
            msg.push_back(tmp);
        }
        mysql_free_result(res);
    */
}
MYSQL* MySql::GetConnection() {
    return conn_;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

使用示例

可参考https://github.com/1412771048/chatserver/tree/main

#include <iostream>
#include "mysql.hpp"


int main() {
    MySQL mysql;
    if (!mysql.connect()) {
    	std::cerr << "connect failed!" << std::endl;
        return -1;
    }
    
    char sql[512] = {0};
    std::stirng name = "li si", password = "123456";
    snpritf(sql, sizeof(sql), "insert into user(name, password, state) values('li si', '%s', '%s')", name.c_str(), password.c_str());
    if (mysql.update(sql)) {
        std::cout << "update success" << std::endl;
    }
    else {
        std::cout << "update failed" << std::endl;
    }
	
    auto res = mysql.query("select * from user");
    if (!res) {
          std::cout << "query failed" << std::endl;
          return {-1, {}};
      }
//query sucess,把数据存放到2维数组中
      std::vector<std::vector<std::string>> msg;
      uint32_t num_fields = mysql_num_fields(res); //列数
      while (auto row = mysql_fetch_row(res)) { //取一行
          std::vector<std::string> tmp;
          for (int i = 0; i < num_fields; i++) { //遍历该行的每一列
              tmp.push_back(row[i] ? row[i] : ""); //字段为NULL则填""
          }
          msg.push_back(tmp);
      }
      mysql_free_result(res);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

编译:

g++ 1.cpp -lmysqlclient
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/663307
推荐阅读
相关标签
  

闽ICP备14008679号