赞
踩
使用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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。