【笔记】C++操作mysql及相关配置

发布于:2025-05-14 ⋅ 阅读:(14) ⋅ 点赞:(0)

目录

使用软件版本信息:

1. C++配置mysql相关依赖

1.1 下载

1.2 文件配置

 1.3 C++编译器配置

2、测试程序


使用软件版本信息:

  • Visual Studio 2022
  • Mysql  8.0
  • C++ Connector库 8.3.0 

可直接在https://download.csdn.net/download/Word_And_Me_/90826524下载库文件

1. C++配置mysql相关依赖

1.1 下载

到MYSQL官网下载C++ Connector库MySQL :: Download Connector/C++

注:我使用mysql为8.0版本,下载C++ Connector为9.3,运行代码会出现问题:mysql_native_password not loaded errors,解决方案

原因:mysql9.0之后,mysql_native_password已经被移除了,不再使用了

解决办法:降低C++ Connector库版本为8.3  或  修改用户plugin,具体见上述引用

黄色框中为release版本,红色为debug版本,下载ZIP Archive即可

【引用:https://blog.csdn.net/weixin_74027669/article/details/137203874】

Release 版本

  • 优化编译,去除了调试信息。
  • 编译时开启了各种优化选项,以获得更好的性能。
  • 适用于生产环境部署,不包含额外的调试信息,体积较小。

Debug 版本

  • 包含调试信息,可用于在开发过程中进行调试。
  • 可能启用了更多的断言和检查,以帮助捕获潜在的问题。
  • 可能会牺牲一些性能以换取更多的调试信息和运行时检查。

1.2 文件配置

项目目录布置如下:【linux可参考博客:【模板】Linux中cmake使用编译c++程序_linux cmake编译-CSDN博客

mysql_test/
 |—— bin/
 |—— includes/
 |—— libs/
 |—— src
    |—— main.cpp
  • bin 目录:存放编译后生成的可执行文件,如在 Windows 系统下的.exe文件,Linux 系统下的.out文件等。此外,还可以放置一些用于辅助项目运行的脚本文件,像 Windows 下的.bat文件、Linux 下的.sh文件,这些脚本可以用于启动程序、设置环境变量等操作 。
  • includes 目录:主要放置项目所依赖的头文件。其中有 MySQL 相关的头文件,像mysql_connection.hmysql_driver.h等,这些头文件是使用 MySQL Connector/C++ 进行数据库操作所必需的。同时,还可以包含项目自定义的头文件,例如config.h用于配置项目的一些参数,utils.h声明一些通用的工具函数。
  • libs 目录:存放项目依赖的库文件。对于 MySQL 相关的项目,会有 MySQL 库文件,如libmysqlcppconn.a(Linux 下的静态库)、libmysqlcppconn.dll(Windows 下的动态库)。如果项目还依赖其他库,比如使用了 SSL 进行安全连接,就会有libssl.alibcrypto.a等库文件。
  • src 目录:是项目源代码的主要存放地。main.cpp作为主程序源文件,负责项目的整体流程控制,例如初始化数据库连接、调用相关功能模块等。db_operations.cpp专门用于实现数据库的增删改查等操作,将数据库操作相关的代码集中在这个文件中,便于维护和管理。utils.cpp则实现一些通用的工具函数,如字符串处理函数、日志记录函数等,这些函数可以被其他源文件调用。

include 中的文件全部复制解压到项目中 includes 文件夹下

lib64/vs14 下文件复制到项目中libs文件夹下 

 对应lib64下dll文件,放到生成exe的目录下,供其调用;

注:release版本与debug版本,对应目录不同,需要进行区分

 1.3 C++编译器配置

linux 中的布置可以使用cmake,可参考博客:【模板】Linux中cmake使用编译c++程序_linux cmake编译-CSDN博客

 增加附加包含目录,将mysql中需要的头文件目录添加在里面

../includes/jdbc

../includes/mysql

../includes

添加附加库目录:../libs

添加附加依赖项:

libcrypto.lib
libssl.lib
mysqlcppconn.lib
mysqlcppconn8.lib
mysqlcppconn8-static.lib
mysqlcppconn-static.lib

将需要调用的dll文件复制到对应的release或debug文件夹

2、测试程序

// -*- coding: utf-8 -*-
#include <iostream>
#include <mysql_driver.h>
#include <mysql_connection.h>
#include <cppconn/statement.h>
#include <cppconn/resultset.h>
#include <cppconn/prepared_statement.h>
#ifdef _WIN32
#include <windows.h>
#endif

int main() {
    try {
        // 设置控制台输出位utf-8,适用于windows
        #ifdef _WIN32
        SetConsoleOutputCP(65001);
        SetConsoleCP(65001);
        #endif 

        // 创建数据库驱动实例
        sql::mysql::MySQL_Driver* driver;
        driver = sql::mysql::get_mysql_driver_instance();

        // 建立数据库连接
        sql::Connection* con;
        con = driver->connect("tcp://127.0.0.1:3306", "root", "123456");
        con->setSchema("test_db");

        // 设置字符集为 utf8mb4 以支持中文
        // con->setClientOption("characterSetResults", "utf8mb4");
        sql::Statement* stmt = con->createStatement();
        // stmt->execute("SET NAMES utf8mb4");

        // ================
        // 1. 创建表(如果不存在)
        // ================
        std::cout << "创建表 users..." << std::endl;
        stmt->execute("CREATE TABLE IF NOT EXISTS users ("
            "id INT PRIMARY KEY AUTO_INCREMENT,"
            "name VARCHAR(100) NOT NULL,"
            "age INT,"
            "email VARCHAR(100) UNIQUE"
            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

        // ================
        // 2. 插入数据(增)
        // ================
        std::cout << "\n插入数据..." << std::endl;
        sql::PreparedStatement* pstmt;

        // 插入第一条记录
        pstmt = con->prepareStatement("INSERT INTO users (name, age, email) VALUES (?, ?, ?)");
        pstmt->setString(1, "张三");
        pstmt->setInt(2, 25);
        pstmt->setString(3, "zhangsan@example.com");
        pstmt->execute();
        delete pstmt;

        // 插入第二条记录
        pstmt = con->prepareStatement("INSERT INTO users (name, age, email) VALUES (?, ?, ?)");
        pstmt->setString(1, "李四");
        pstmt->setInt(2, 30);
        pstmt->setString(3, "lisi@example.com");
        pstmt->execute();
        delete pstmt;

        // ================
        // 3. 查询数据(查)
        // ================
        std::cout << "\n查询所有用户..." << std::endl;
        sql::ResultSet* res = stmt->executeQuery("SELECT * FROM users");
        while (res->next()) {
            std::cout << "ID: " << res->getInt("id")
                << ", 姓名: " << res->getString("name")
                << ", 年龄: " << res->getInt("age")
                << ", Email: " << res->getString("email") << std::endl;
        }
        delete res;

        // ================
        // 4. 更新数据(改)
        // ================
        std::cout << "\n更新数据..." << std::endl;
        pstmt = con->prepareStatement("UPDATE users SET age = ? WHERE name = ?");
        pstmt->setInt(1, 26);
        pstmt->setString(2, "张三");
        pstmt->execute();
        delete pstmt;

        // 查询更新后的数据
        std::cout << "\n更新后的用户数据:" << std::endl;
        res = stmt->executeQuery("SELECT * FROM users");
        while (res->next()) {
            std::cout << "ID: " << res->getInt("id")
                << ", 姓名: " << res->getString("name")
                << ", 年龄: " << res->getInt("age")
                << ", Email: " << res->getString("email") << std::endl;
        }
        delete res;

        // ================
        // 5. 删除数据(删)
        // ================
        std::cout << "\n删除数据..." << std::endl;
        pstmt = con->prepareStatement("DELETE FROM users WHERE name = ?");
        pstmt->setString(1, "李四");
        pstmt->execute();
        delete pstmt;

        // 查询删除后的数据
        std::cout << "\n删除后的用户数据:" << std::endl;
        res = stmt->executeQuery("SELECT * FROM users");
        while (res->next()) {
            std::cout << "ID: " << res->getInt("id")
                << ", 姓名: " << res->getString("name")
                << ", 年龄: " << res->getInt("age")
                << ", Email: " << res->getString("email") << std::endl;
        }
        delete res;

        // 清理资源
         delete stmt;
         delete con;
    }
    catch (sql::SQLException& e) {
        std::cout << "# ERR: SQLException in " << __FILE__;
        std::cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << std::endl;
        std::cout << "# ERR: " << e.what();
        std::cout << " (MySQL error code: " << e.getErrorCode();
        std::cout << ", SQLState: " << e.getSQLState() << " )" << std::endl;
    }

    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到