【笔记】C++操作mysql及相关配置
目录
使用软件版本信息:
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.h
、mysql_driver.h
等,这些头文件是使用 MySQL Connector/C++ 进行数据库操作所必需的。同时,还可以包含项目自定义的头文件,例如config.h
用于配置项目的一些参数,utils.h
声明一些通用的工具函数。- libs 目录:存放项目依赖的库文件。对于 MySQL 相关的项目,会有 MySQL 库文件,如
libmysqlcppconn.a
(Linux 下的静态库)、libmysqlcppconn.dll
(Windows 下的动态库)。如果项目还依赖其他库,比如使用了 SSL 进行安全连接,就会有libssl.a
、libcrypto.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>
#endifint main() {try {// 设置控制台输出位utf-8,适用于windows#ifdef _WIN32SetConsoleOutputCP(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;
}