C++ MySQL数据库访问工具类设计与操作流程详解

工具类设计背景

在C++项目中直接使用MySQL C API存在三个核心痛点:连接流程复杂错误处理冗余资源管理易遗漏。本文将通过一个封装好的mysql_util类,结合流程图和代码解析,详解如何实现安全高效的MySQL操作。

核心代码实现
class mysql_util {
public:
    // 创建数据库连接(带默认参数)
    static inline MYSQL* mysql_create(const std::string &host,
                                      const std::string &username,
                                      const std::string &password,
                                      const std::string &dbname,
                                      uint16_t port = 3306) {
        /* 初始化 -> 连接 -> 设置字符集 */
        MYSQL* mysql = mysql_init(NULL);
        if (!mysql || !mysql_real_connect(mysql, host.c_str(), username.c_str(), 
                     password.c_str(), dbname.c_str(), port, NULL, 0)) {
            ELOG("Connection failed: %s", mysql_error(mysql));
            mysql_close(mysql);
            return nullptr;
        }
        mysql_set_character_set(mysql, "utf8");
        return mysql;
    }
 
    // 执行SQL语句 
    static bool mysql_exec(MYSQL* mysql, const std::string &sql) {
        if (mysql_query(mysql, sql.c_str()) != 0) {
            ELOG("Query failed: %s -> %s", sql.c_str(), mysql_error(mysql));
            mysql_close(mysql);
            return false;
        }
        return true;
    }
 
    // 释放资源 
    static void mysql_destroy(MYSQL* mysql) {
        if (mysql) mysql_close(mysql);
    }
};
操作流程图解

关键步骤解析
  1. 连接初始化阶段
    • mysql_init():创建内存对象(⚠️ 返回NULL需立即终止)
    • mysql_real_connect():包含5个核心参数(主机、账号、密码、数据库、端口)
    • 字符集设置:必须使用utf8避免中文乱码(❌ 不要用utf8mb4
  2. 执行SQL阶段
    • 错误处理双保险:通过mysql_query()返回值  mysql_error()获取详细信息
    • 连接自动关闭:执行失败时立即释放资源
  3. 资源释放阶段
    • 显式调用mysql_close():即使现代系统会自动回收,仍需手动释放避免内存泄漏
    • 空指针检查:防御性编程避免段错误
总结

通过封装MySQL C API的三个核心操作(连接、执行、释放),我们实现了:

  1. 代码复用率提升:相同逻辑无需重复编写
  2. 错误处理集中化:统一日志记录和资源释放
  3. 安全性增强:通过RAII机制防止资源泄漏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值