当前位置: 首页 > news >正文

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

    pip install conan --upgrade
    conan --version   # 确认是 2.x
    
  2. 安装 CMake

    brew install cmake
    cmake --version
    
  3. 安装 MySQL Server

    brew install mysql
    brew services start mysql
    
  4. 确保 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 示例)

这个示例体现了:

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

四、构建和运行

  1. 创建 build 目录:
mkdir build && cd build
  1. 使用 Conan 安装依赖:
conan install .. --build=missing
  1. CMake 构建:
cmake -S .. -B . -DCMAKE_BUILD_TYPE=Release
cmake --build .
  1. 运行:
./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 简化编译链接
http://www.dtcms.com/a/347314.html

相关文章:

  • Python reduce / map / filter 函数区别
  • Spring Boot Redis 入门
  • 注意力机制中除以Dk的方差归一化
  • 博客系统接口自动化练习
  • (nice!!!)(LeetCode 面试经典 150 题) 173. 二叉搜索树迭代器 (栈)
  • portswigger labs XXE漏洞利用实战
  • 一次转向:从 当前讨论到 拼PIN语言的拼块语言理论体系
  • 嵌入式软件/硬件工程师面试题集
  • 从观众席到股东席,何猷君成NBA凯尔特人新Co-owner
  • 网址账号正确,密码错误返回的状态码是多少
  • Java基础面试题(04)—Java(Java中String StringBuffer 和 StringBuilder的区别)
  • 山西某焦化厂炼焦区电气维护系统无线传输解决方案实施案例
  • Mangio RVC Fork 本地部署(Cuda12.9)
  • 蓝牙aoa仓库管理系统功能介绍
  • 有哪些Spring Boot微服务架构成功落地的案例?
  • GitHub发布革命性工具:GitHub Spark,用自然语言打造全栈智能应用
  • yolo命令行-训练篇(三)
  • Android安卓学习日志1 聊一聊安卓的历史和笔者的想法
  • 微服务统一入口——Gateway
  • 航空复杂壳体零件深孔检测方法 - 激光频率梳 3D 轮廓检测
  • 把 AI 塞进「自行车码表」——基于 MEMS 的 3D 地形预测码表
  • 基础IO
  • electron进程间通信-IPC通信注册机制
  • SAP FI 应收应付账龄分析
  • MySQL 锁的详解:从 InnoDB 到死锁诊断实战
  • Hive Metastore和Hiveserver2启停脚本
  • 爱普生打印机的使用
  • day40-tomcat
  • UE C++ 堆化
  • 【卫星通信】超低码率语音编码ULBC:EnCodec神经音频编解码器架构深度解析