C++ + Boost + MySQL 项目完整教程
一、项目背景和目标
在现代 C++ 开发中,我们经常需要处理如下场景:
- 依赖管理:如 Boost、MySQL SDK 等库复杂,手动下载和管理很麻烦。
- 构建系统:跨平台需要 CMake 来统一编译和链接流程。
- 数据库操作:需要操作 MySQL 数据库,包括插入、查询、表格化展示。
- 字符串处理和数据处理:Boost 提供强大的算法库来简化这些工作。
本项目目标:
- 使用 Conan 2 管理依赖
- 使用 CMake 构建项目
- 使用 Boost 处理字符串和数据
- 使用 MySQL X DevAPI 正确访问 MySQL 数据库
- 查询结果以表格形式输出
二、环境准备
-
安装 Conan 2:
pip install conan --upgrade conan --version # 确认是 2.x
-
安装 CMake:
brew install cmake cmake --version
-
安装 MySQL Server:
brew install mysql brew services start mysql
-
确保 C++ 编译器可用:
clang++ --version # MacOS 默认自带
三、项目结构
conan_demo/
├── CMakeLists.txt
├── conanfile.txt
└── main.cpp
1. conanfile.txt
(依赖管理)
[requires]
boost/1.83.0
mysql-connector-cpp/9.2.0[generators]
CMakeDeps
CMakeToolchain
说明:
boost/1.83.0
:最新稳定版本,用于字符串处理、格式化和算法。mysql-cpp/8.0.34
:官方 MySQL C++ X DevAPI 包,不使用mysql-connector-cpp
避免版本冲突。CMakeDeps
+CMakeToolchain
:生成 CMake 所需的配置文件,便于自动集成。
2. CMakeLists.txt
(构建配置)
cmake_minimum_required(VERSION 3.25)
project(conan_demo LANGUAGES CXX)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 包含 Conan 自动生成的 toolchain
include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake)# 查找依赖库
find_package(Boost REQUIRED)
find_package(mysql-cpp REQUIRED)add_executable(conan_demo main.cpp)# 链接库
target_link_libraries(conan_demo PRIVATE Boost::boost mysql-cpp::mysql-cpp)
说明:
conan_toolchain.cmake
自动定义编译器、编译选项和库路径- Boost 和 MySQL 库通过 Conan 自动下载、编译和集成
- C++17 用于现代语法、
std::optional
和 Lambda 支持
3. main.cpp
(完整 Boost + MySQL 示例)
这个示例体现了:
- Boost 字符串处理:trim、大小写转换、删除字符、拆分、拼接
- Boost 格式化输出
- MySQL 数据插入、查询
- 表格化输出查询结果
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/join.hpp>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/erase.hpp>
#include <boost/format.hpp>
#include <mysqlx/xdevapi.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>struct User {std::string name;int age;
};int main() {std::cout << "Boost + MySQL Demo\n";// Step 1: 原始用户数据std::vector<User> users = {{" Alice ", 25},{" Bob ", 30},{" Carol ", 28}};// Step 2: 使用 Boost 清理和转换数据for (auto &user : users) {boost::trim(user.name); // 去掉空格boost::to_upper(user.name); // 转大写boost::replace_all(user.name, "A", "@"); // 字符替换boost::erase_all(user.name, "O"); // 删除字符}// Step 3: 拼接输出std::vector<std::string> names;for (const auto &u : users) names.push_back(u.name);std::string joined = boost::join(names, ", ");std::cout << "Processed names: " << joined << "\n";try {// Step 4: 连接 MySQLmysqlx::Session session("localhost", 33060, "root", "HouJie@123", "test_db");mysqlx::Schema db = session.getSchema("test_db");mysqlx::Table tb = db.getTable("users");// Step 5: 插入用户数据for (const auto &user : users) {tb.insert("name", "age").values(user.name, user.age).execute();std::cout << boost::format("Inserted: %1%, %2%\n") % user.name % user.age;}// Step 6: 查询数据mysqlx::RowResult res = tb.select("name", "age").execute();// Step 7: 表格化输出std::cout << "\n+----------------+-----+\n";std::cout << "| Name | Age |\n";std::cout << "+----------------+-----+\n";for (mysqlx::Row row : res) {std::string name = row[0].get<std::string>();boost::trim(name);boost::to_lower(name);int age = row[1].get<int>();std::cout << "| " << std::setw(14) << std::left << name<< " | " << std::setw(3) << age << " |\n";}std::cout << "+----------------+-----+\n";session.close();} catch (const mysqlx::Error &err) {std::cerr << "MySQL Error: " << err.what() << "\n";return 1;}return 0;
}
4. 数据库表初始化
在 MySQL 中运行:
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),age INT
);
四、构建和运行
- 创建
build
目录:
mkdir build && cd build
- 使用 Conan 安装依赖:
conan install .. --build=missing
- CMake 构建:
cmake -S .. -B . -DCMAKE_BUILD_TYPE=Release
cmake --build .
- 运行:
./conan_demo
五、示例输出
Boost + MySQL Demo
Processed names: @LICE, B@B, C@ROL
Inserted: @LICE, 25
Inserted: B@B, 30
Inserted: C@ROL, 28+----------------+-----+
| Name | Age |
+----------------+-----+
| @lice | 25 |
| b@b | 30 |
| c@rol | 28 |
+----------------+-----+
六、说明与扩展
-
Boost 功能:
- 字符串处理(trim、大小写转换、替换、删除)
- 拆分和拼接
- 格式化输出
-
MySQL X DevAPI:
- 使用
mysqlx::Session
连接数据库 - 插入数据使用
insert().values().execute()
- 查询数据使用
select().execute()
- 支持类型安全转换
get<std::string>()
、get<int>()
- 使用
-
Conan 管理依赖:
- 自动下载和编译 Boost、MySQL SDK
- 生成 CMake Toolchain 简化编译链接