MySQL C/C++ API 接口
环境配置
- 下载 MySQL C 连接器:
- 官网地址:https://dev.mysql.com/downloads/
- 选择 "MySQL Connector/C" 下载。
- 编译程序:bash
g++ test.cpp -I mysql头文件目录 -L mysql库目录 -lmysql库名- 示例:bash
g++ main.cpp -I ./include -L ./lib -lmysqlclient
- 示例:
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++ 类(如
