使用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