当前位置: 首页 > 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.xdnf.cn/news/1350109.html

相关文章:

  • mysql的mvcc
  • 如何用Redis作为消息队列
  • Science Robotics 通过人机交互强化学习进行精确而灵巧的机器人操作
  • Flink框架:算子链的介绍
  • iview admin 使用mock.js模拟数据
  • 01_Python的in运算符判断列表等是否包含特定元素
  • C语言初学者笔记【动态内存管理】
  • 深入探讨集成学习:Bagging与Boosting的核心原理与实践
  • 自然语言处理——05 Transformer架构和手写实现
  • 复杂街景误检率↓79%!陌讯动态融合算法在街道垃圾识别的边缘计算优化​​
  • Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
  • 链表漫游指南:C++ 指针操作的艺术与实践
  • 蓝牙链路层状态机精解:从待机到连接的状态跃迁与功耗控制
  • 【大语言模型 15】因果掩码与注意力掩码实现:深度学习中的信息流控制艺术
  • Python本源诗话(我DeepSeek)
  • 企业视频库管理高效策略
  • 大数据接口 - 企业风险报告(专业版)API接口文档
  • 使用springboot开发-AI智能体平台管理系统,统一管理各个平台的智能体并让智能体和AI语音设备通信,做一个属于自己的小艾同学~
  • 百度深度学习面试:batch_size的选择问题
  • 36_基于深度学习的智能零售柜物品检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • 【深度学习新浪潮】有哪些工具可以帮助我们对视频进行内容分析和关键信息提取?
  • LeetCode56合并区间
  • Idea中 lombok 在“测试类中-单元测试”运行失败及解决方法
  • 商超高峰客流统计误差↓75%!陌讯多模态融合算法在智慧零售的实战解析
  • Elasticsearch:什么是神经网络?
  • Elasticsearch Persistence(elasticsearch-persistence)仓储模式实战
  • 批量归一化:不将参数上传到中心服务器,那服务器怎么进行聚合?
  • 浏览器解析网址的过程
  • 倍福下的EC-A10020-P2-24电机调试说明
  • 【JVM】JVM的内存结构是怎样的?