MySQL C/C++ API 接口
环境配置
- 下载 MySQL C 连接器:
- 官网地址:https://dev.mysql.com/downloads/
- 选择 "C API (libmysqlclient" 下载
- 编译器 vs code(我只要这一个编译器,还有2022其他无)
安装
选择C API (libmysqlclient然后选择 Linux: The Client Utilities Package is available from the MySQL Community Server download page. 之后在里面选择
下载压缩包下载压缩包下载压缩包
- 解压
- 找到lib和include文件夹拷贝到你的工程目录下面去
- include包含了需要的头文件
- lib包含了扩展库 静态库
- 建议把lib里的libmysql.dll放在你exe文件同级目录,要不然出现程序运行过程重打断的情况
- 编译程序vs code的命令终端:
bash
g++ test.cpp -I mysql头文件目录(路径要改成你MySQL的实际安装路径) -L mysql库目录(路径要改成你MySQL的实际安装路径) -lmysql库名示例:
bash
g++ main.cpp -I ./include -L ./lib -lmysqlclient后面有示例代码 运行成功后: 在Workbench中查看
- 刷新Workbench
- 在左侧的
SCHEMAS面板 - 右键点击
keshe数据库 - 选择 "Refresh All" 或者点击刷新按钮 🔄
- 在左侧的
- 查看表
- 看表就行了
MySQL的接口流程
初始化 MySQL 库:
- 初始化 ysql 数据库 MySQL 库会完成一些必要的内部设置和资源分配,为后续与数据库的交互操作做好准 备。同时可以确保库处于一个已知的、正确的初始状态,避免一些潜在的未定义行为和错误。
- 连接Mysql
- 执行 SQL 语句
- 获取结果
- 处理结果
- 释放资源
- 释放结果的资源
- 关闭数据库连接
- 解除mysql 库初始化
API 基本接口流程
1. 初始化 MySQL 库
c
int mysql_library_init(int argc, char **argv, char **groups);- 描述:初始化 MySQL 客户端库(内部资源分配)。
- 参数:
argc,argv,groups:MySQL 8.0 后未使用,固定为(0, NULL, NULL)。
- 返回值:成功返回
0,失败返回非零。
注意:多线程环境中需显式调用此函数。
2. 初始化连接句柄
c
MYSQL *mysql_init(MYSQL *mysql);- 描述:分配并初始化
MYSQL连接对象。 - 参数:
mysql:若为NULL则分配新对象;否则初始化现有对象。
- 返回值:成功返回
MYSQL*句柄,失败返回NULL。
3. 连接数据库
c
MYSQL *mysql_real_connect(
MYSQL *mysql, // mysql_init 返回的句柄
const char *host, // 服务器地址(如 "localhost")
const char *user, // 用户名(如 "root")
const char *password, // 密码(如 "123456")
const char *db, // 默认数据库名(可 NULL)
unsigned int port, // 端口号(默认 3306)
const char *unix_socket, // Unix 域套接字路径(通常 NULL)
unsigned long clientflag // 客户端标志(通常 0)
);- 返回值:成功返回连接句柄,失败返回
NULL(用mysql_error()获取错误信息)。
4. 执行 SQL 语句
c
int mysql_query(MYSQL *mysql, const char *query);- 描述:执行 SQL 命令(如
SELECT,INSERT)。 - 参数:
query:SQL 语句字符串。
- 返回值:成功返回
0,失败返回非零。
5. 获取查询结果
c
MYSQL_RES *mysql_store_result(MYSQL *mysql);- 描述:检索并存储整个结果集(适用于
SELECT查询)。 - 返回值:成功返回
MYSQL_RES结果集指针,失败返回NULL。
6. 处理结果集
c
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);- 描述:逐行获取结果数据。
- 返回值:
- 成功返回当前行数据(
MYSQL_ROW类型,字符串数组)。 - 无更多行时返回
NULL。
- 成功返回当前行数据(
7. 释放资源
c
void mysql_free_result(MYSQL_RES *result); // 释放结果集
void mysql_close(MYSQL *connection); // 关闭数据库连接
void mysql_library_end(); // 终止 MySQL 库8. 错误处理
c
const char *mysql_error(MYSQL *mysql); // 获取错误信息字符串关键数据结构
| 类型 | 描述 |
|---|---|
MYSQL | 数据库连接句柄,用于所有 MySQL 操作。 |
MYSQL_RES | 查询结果集(如 SELECT 返回的数据)。 |
MYSQL_ROW | 单行数据(字符串数组,每列为一个字符串)。 |
完整示例代码
c
#include <iostream>
#include <mysql.h>
int main() {
// 1. 初始化 MySQL 库
mysql_library_init(0, NULL, NULL);
// 2. 初始化连接句柄
MYSQL *mysql = mysql_init(NULL);
if (!mysql) {
std::cerr << "Init failed!" << std::endl;
return -1;
}
// 3. 连接数据库
if (!mysql_real_connect(mysql, "localhost", "root", "123456", NULL, 0, NULL, 0)) {
std::cerr << "Connect failed: " << mysql_error(mysql) << std::endl;
mysql_close(mysql);
return -1;
}
std::cout << "Connected to MySQL!" << std::endl;
// 4. 执行 SQL 查询
const char *sql = "SHOW DATABASES";
if (mysql_query(mysql, sql) {
std::cerr << "Query failed: " << mysql_error(mysql) << std::endl;
mysql_close(mysql);
return -1;
}
// 5. 获取结果集
MYSQL_RES *result = mysql_store_result(mysql);
if (!result) {
std::cerr << "Store result failed: " << mysql_error(mysql) << std::endl;
mysql_close(mysql);
return -1;
}
// 6. 遍历结果集
MYSQL_ROW row;
while ((row = mysql_fetch_row(result))) {
std::cout << "Database: " << row[0] << std::endl; // 输出第一列(数据库名)
}
// 7. 释放资源
mysql_free_result(result);
mysql_close(mysql);
mysql_library_end();
return 0;
}关键函数参考
| 函数 | 描述 |
|---|---|
mysql_affected_rows() | 获取上次操作影响的行数(UPDATE/DELETE/INSERT)。 |
mysql_commit() | 提交事务。 |
mysql_rollback() | 回滚事务。 |
mysql_num_fields() | 获取结果集的列数。 |
mysql_num_rows() | 获取结果集的行数。 |
mysql_set_character_set() | 设置连接字符集(如 "utf8mb4")。 |
作业
- 练习 API 使用:
- 实现数据库连接、执行 SQL 查询、处理结果集。
- 尝试执行
CREATE TABLE,INSERT,SELECT等操作。
- 错误处理增强:
- 对所有 API 调用添加错误检查(使用
mysql_error())。
- 对所有 API 调用添加错误检查(使用
- 封装为类:
- 将 MySQL 操作封装成 C++ 类(如
MySQLConnector),提供连接、查询、事务等方法。
- 将 MySQL 操作封装成 C++ 类(如
