17370845950

C++如何连接MySQL数据库?(API使用示例)
C++连接MySQL主流方式是MySQL Connector/C++(推荐)或MySQL C API;前者面向对象、语法清晰,后者轻量但需手动管理资源;示例包含连接、查询、参数化防注入及事务控制。

用C++连接MySQL数据库,主流方式是使用官方提供的 MySQL Connector/C++(推荐)或较底层的 MySQL C API(libmysqlclient)。前者面向对象、语法清晰;后者更轻量但需手动管理资源。下面以 Connector/C++ 为主给出实用示例,附带关键配置和常见问题提示。

安装与环境准备

确保已安装 MySQL Server,并获取对应版本的 Connector/C++:

  • Linux:通过包管理器安装(如 Ubuntu:sudo apt install libmysqlcppconn-dev
  • Windows:从 MySQL 官网下载 ZIP 包,解压后配置 include 和 lib 路径
  • 编译时链接库:-lmysqlcppconn(Linux/macOS)或链接 mysqlcppconn.lib(Windows)

基础连接与查询示例

以下代码演示如何连接数据库、执行 SELECT 查询并遍历结果:

#include 
#include 
#include 
#include 
#include 

int main() { sql::mysql::MySQL_Driver driver; sql::Connection con; sql::Statement stmt; sql::ResultSet res;

try {
    driver = sql::mysql::get_mysql_driver_instance();
    // 连接格式:host:port, username, password, database(database 可选)
    con = driver->connect("tcp://127.0.0.1:3306", "root", "password");
    con->setSchema("testdb"); // 切换到目标数据库

    stmt = con->createStatement();
    res = stmt->executeQuery("SELECT id, name FROM users LIMIT 5");

    while (res->next()) {
        std::cout << "ID: " << res->getInt("id")
                  << ", Name: " << res->getString("name") << std::endl;
    }

} catch (sql::SQLException &e) {
    std::cerr << "SQL Error: " << e.what() << std::endl;
    return 1;
}

delete res;
delete stmt;
delete con;
return 0;

}

参数化查询(防 SQL 注入)

避免拼接字符串,改用 PreparedStatement

  • ? 占位,调用 setInt()setString() 等方法赋值
  • 支持事务控制:con->setAutoCommit(false) + con->commit()/rollback()
sql::PreparedStatement *pstmt = con->prepareStatement(
    "INSERT INTO users(name, age) VALUES (?, ?)");
pstmt->setString(1, "Alice");
pstmt->setInt(2, 28);
pstmt->executeUpdate(); // 执行 INSERT/UPDATE/DELETE
delete pstmt;

常见问题提醒

实际开发中容易踩坑的地方:

  • 运行时报 “undefined symbol” 或 “DLL load failed”:检查动态库路径(LD_LIBRARY_PATH 或 Windows 的 PATH)是否包含 connector 的 so/dll 文件
  • 连接被拒绝:确认 MySQL 允许远程连接(bind-address 配置)、用户权限(GRANT ALL ON testdb.* TO 'user'@'%')及防火墙设置
  • 中文乱码:连接 URL 加参数 ?useUnicode=true&characterEncoding=utf8,且确保表字段为 utf8mb4

基本上就这些。Connector/C++ 封装良好,适合大多数项目;若追求极致性能或嵌入式场景,可考虑 C API,但需自行处理内存、错误、字符集等细节。