c++使用mysqlclient库开发mysql

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

安装

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

封装客户端

一般都是封装一个客户端类进行开发,如下的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_;
}

使用示例

可参考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);
}

编译:

g++ 1.cpp -lmysqlclient
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值