C++ + Boost + MySQL 项目完整教程

一、项目背景和目标

在现代 C++ 开发中,我们经常需要处理如下场景:

  1. 依赖管理:如 Boost、MySQL SDK 等库复杂,手动下载和管理很麻烦。
  2. 构建系统:跨平台需要 CMake 来统一编译和链接流程。
  3. 数据库操作:需要操作 MySQL 数据库,包括插入、查询、表格化展示。
  4. 字符串处理和数据处理:Boost 提供强大的算法库来简化这些工作。

本项目目标:

  • 使用 Conan 2 管理依赖
  • 使用 CMake 构建项目
  • 使用 Boost 处理字符串和数据
  • 使用 MySQL X DevAPI 正确访问 MySQL 数据库
  • 查询结果以表格形式输出

二、环境准备

  1. 安装 Conan 2

    bash 复制代码
    pip install conan --upgrade
    conan --version   # 确认是 2.x
  2. 安装 CMake

    bash 复制代码
    brew install cmake
    cmake --version
  3. 安装 MySQL Server

    bash 复制代码
    brew install mysql
    brew services start mysql
  4. 确保 C++ 编译器可用

    bash 复制代码
    clang++ --version  # MacOS 默认自带

三、项目结构

复制代码
conan_demo/
├── CMakeLists.txt
├── conanfile.txt
└── main.cpp

1. conanfile.txt(依赖管理)

text 复制代码
[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 复制代码
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 示例)

这个示例体现了:

  1. Boost 字符串处理:trim、大小写转换、删除字符、拆分、拼接
  2. Boost 格式化输出
  3. MySQL 数据插入、查询
  4. 表格化输出查询结果
cpp 复制代码
#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: 连接 MySQL
        mysqlx::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 中运行:

sql 复制代码
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
);

四、构建和运行

  1. 创建 build 目录:
bash 复制代码
mkdir build && cd build
  1. 使用 Conan 安装依赖:
bash 复制代码
conan install .. --build=missing
  1. CMake 构建:
bash 复制代码
cmake -S .. -B . -DCMAKE_BUILD_TYPE=Release
cmake --build .
  1. 运行:
bash 复制代码
./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  |
+----------------+-----+

六、说明与扩展

  1. Boost 功能

    • 字符串处理(trim、大小写转换、替换、删除)
    • 拆分和拼接
    • 格式化输出
  2. MySQL X DevAPI

    • 使用 mysqlx::Session 连接数据库
    • 插入数据使用 insert().values().execute()
    • 查询数据使用 select().execute()
    • 支持类型安全转换 get<std::string>()get<int>()
  3. Conan 管理依赖

    • 自动下载和编译 Boost、MySQL SDK
    • 生成 CMake Toolchain 简化编译链接