目录一览
本文主要讲解了c++连接mysql的配置,展示了一个简单c++实例。
对于实例中所涉及到的MySQL API将在另一篇文章中详细展开,包含MySQL的整个操作流程、API中的主要数据结构、常用库函数以及增删改查的简单实现。
一、新建项目并且添加依赖
1、新建c++空项目,将版本修改为debug+x64
2、添加环境变量
右键项目选择 属性->调试 -> 环境 ,添加PATH = PATH=E:\software\mysql-8.0.25-winx64\bin(根据自己的安装目录选择)
注意:若没有设置,会报缺少libmysql.dll的错误
3、添加c++头文件依赖
右键项目选择 属性 -> c/c++ -> 常规 -> 附加包含目录 ,添加E:\software\mysql-8.0.25-winx64\include(根据自己的安装目录选择)
4、添加链接器依赖库目录
右键项目选择 属性 -> 链接器 -> 常规 -> 附加库目录 ,添加E:\software\mysql-8.0.25-winx64\lib(根据自己的安装目录选择)
5、添加链接器输入依赖
右键项目选择 属性 -> 链接器 -> 输入 -> 附加依赖项,添加E:\software\mysql-8.0.25-winx64\lib\libmysql.lib(根据自己的安装目录选择)
注意:用分号;隔开。
二、一个简单测试数据库
1、测试数据库demo
数据库名称:db
表名:user
三、数据库链接和查询demo
1、demo的结构
|__ main.cpp //demo调用函数
|__ mysqlhelper.cpp //类函数实现
|__ mysqlhelper.h //mysql操作相关类
2、demo代码
|__ mysqlhelper.h:
#ifndef MYSQL_HELPER_H
#define MYSQL_HELPER_H
#include <stdlib.h>
#include <map>
#include <vector>
#include <string>
using namespace std;
#include <mysql.h>
namespace mysqlhelper
{
// 连接数据库的一些必要信息
struct ConnectionInfo
{
const char* host; // 主机地址
const char* user; // 用户名
const char* password; // 密码
const char* database; // 数据库名
unsigned int port; // 端口号
const char* unix_socket; // unix连接标识
unsigned long clientflag; // 客户端连接标志
// 构造函数,设置一些默认值
ConnectionInfo()
{
host = "localhost";
port = 3306;
user = "root";
password = "123456";
database = "db";
unix_socket = NULL;
clientflag = 0;
}
};
class MySQLManager
{
public:
//构造与析构函数
MySQLManager();
~MySQLManager();
//数据库链接与释放
// 连接数据库
bool Init(ConnectionInfo& info);
// 释放连接
bool FreeConnect();
//数据库增删改查操作
// 增加数据
bool InsertData(const char* sql);
// 删除数据
bool DeleteData(const char* sql);
// 更新数据
bool UpdateData(const char* sql);
// 执行sql语句, 包括增加、删除、更新数据
bool ExecuteSql(const char* sql);
// 查询数据
MYSQL_RES* QueryData(const char* sql);
// 打印结果集
void PrintQueryRes();
private:
MYSQL m_mysql; // mysql连接
MYSQL_RES* m_res; // 查询结果集
};
}
#endif //MYSQL_HELPER_H
|__ mysqlhelper.cpp:
#include <iostream>
#include <string>
#include "mysqlhelper.h"
using namespace std;
namespace mysqlhelper
{
//构造与析构函数
MySQLManager::MySQLManager(){
m_res = NULL;
}
MySQLManager::~MySQLManager(){}
// 初始化
bool MySQLManager::Init(ConnectionInfo& info)
{
// 初始化mysql,连接mysql数据库
mysql_init(&m_mysql);
// 连接失败
if (!(mysql_real_connect(&m_mysql, info.host, info.user, info.password, info.database, info.port, info.unix_socket, info.clientflag)))
{
std::cout << "mysql connect fail." << mysql_error(&m_mysql) << std::endl;
return false;
}
std::cout << "mysql connect success."<< std::endl;
return true;
}
// 释放连接
bool MySQLManager::FreeConnect()
{
//释放资源
mysql_free_result(m_res);
mysql_close(&m_mysql);
return false;
}
// 执行sql语句, 包括增加、删除、更新数据
bool MySQLManager::ExecuteSql(const char * sql)
{
if (mysql_query(&m_mysql, sql))
{
std::cout << "执行sql语句失败,错误信息为: " << mysql_error(&m_mysql) << endl;
return false;
}
else
{
std::cout << "执行sql语句成功!" << endl;
}
return true;
}
// 查询数据
MYSQL_RES* MySQLManager::QueryData(const char* sql)
{
if (mysql_query(&m_mysql, sql))
{
// 打错误log,这里直接显示到控制台
std::cout << "查询语句执行失败,错误信息为: " << mysql_error(&m_mysql) << endl;
return nullptr;
}
else
{
std::cout << "查询语句执行成功!" << endl;
}
// 存储查询结果
m_res = mysql_store_result(&m_mysql);
return m_res;
}
// 遍历结果集
void MySQLManager::PrintQueryRes()
{
if (nullptr == m_res || NULL == m_res)
{
return;
}
// 获取行数
// unsigned int rows = mysql_affected_rows(m_mysql);
// 字段列数组
MYSQL_FIELD* field = nullptr;
//存字段名二维数组
char fieldName[64][32];
// 获取字段名
for (int i = 0; field = mysql_fetch_field(m_res); ++i)
{
strcpy_s(fieldName[i], field->name);
}
// 获取列数
int columns = mysql_num_fields(m_res);
for (int i = 0; i < columns; ++i)
{
// 使用C语言的printf格式化更方便一点
printf("%10s\t", fieldName[i]);
}
cout << endl;
MYSQL_ROW row;
while (row = mysql_fetch_row(m_res))
{
for (int i = 0; i < columns; ++i)
{
printf("%10s\t", row[i]);
}
cout << endl;
}
}
}
|__ main.cpp:
#include <iostream>
#include "mysqlhelper.h"
using namespace std;
int main()
{
mysqlhelper::MySQLManager mysql;
// 定义ConnectionInfo这个结构体,使用默认值,项目中一般从配置文件这读取
mysqlhelper::ConnectionInfo info;
// mysql连接
if (!mysql.Init(info))
{
return -1;
}
// 增加数据测试
const char* sql1 = "insert into user values (NULL, 'song', '99')";
mysql.ExecuteSql(sql1);
// 删除数据测试
const char* sql2 = "delete from user where name = 'sun'";
mysql.ExecuteSql(sql2);
// 修改数据测试
const char* sql3 = "update user set grade='22' where name = 'wu'";
mysql.ExecuteSql(sql3);
// 查询数据测试
const char* sql4 = "select * from user";
mysql.QueryData(sql4);
mysql.PrintQueryRes();
// 释放mysql资源
mysql.FreeConnect();
system("pause");
return 0;
}
3、demo测试结果
-----------------------------------------------------------------------------------------------------------------------------------------------------
如果本文对你有所帮助,请不要忘了点赞、收藏哦!!!
-----------------------------------------------------------------------------------------------------------------------------------------------------