Skip to content

MySQL C/C++ API 接口

环境配置

  1. 下载 MySQL C 连接器
  2. 编译程序
    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")。

作业

  1. 练习 API 使用
    • 实现数据库连接、执行 SQL 查询、处理结果集。
    • 尝试执行 CREATE TABLE, INSERT, SELECT 等操作。
  2. 错误处理增强
    • 对所有 API 调用添加错误检查(使用 mysql_error())。
  3. 封装为类
    • 将 MySQL 操作封装成 C++ 类(如 MySQLConnector),提供连接、查询、事务等方法。

知识如风,常伴吾身