c++使用mysqlclient库开发mysql

发布于:2024-05-09 ⋅ 阅读:(26) ⋅ 点赞:(0)

使用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_);
    /* 
    查询返回后一般这样操作   
    if (res) {
        MYSQL_ROW row;
        while (row = mysql_fetch_row(res)) {//赋值给res,且res不空
            //根据自己的表字段来获取数据
            std::cout << row[0] << std::endl;
            std::cout << row[1] << std::endl;
            std::cout << row[2] << std::endl;
            std::cout << row[3] << std::endl;
        }
    }
    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()) {
        return -1;
    }
    if (mysql.update("insert into user(id,name,age,sex) values(%d,'%s', %d,'%s')", 0, "zhang san", 18, "male")) {
        std::cout << "update success" << std::endl;
    }
    else {
        std::cout << "update failed" << std::endl;
    }

    auto res = mysql.query("select * from user");
    if (res) {
        MYSQL_ROW row;
        while (row = mysql_fetch_row(res)) {//赋值给res,且res不空
            //根据自己的表字段来获取数据
            std::cout << row[0] << std::endl;
            std::cout << row[1] << std::endl;
            std::cout << row[2] << std::endl;
            std::cout << row[3] << std::endl;
        }
        mysql_free_result(res);
    }
    else {
        std::cout << "query failed" << std::endl;
    }
}

编译:

g++ 1.cpp -lmysqlclient