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

C++ 使用最新 MySQL Connector/C++(X DevAPI)+ CMake 完整教程

一、安装环境

1. 安装 Homebrew(如未安装)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

2. 安装 MySQL

brew install mysql
brew services start mysql
  • 默认 root 用户无密码。可用 mysql -uroot 登录:
mysql -uroot
  • X Protocol 默认端口 33060

3. 安装最新 MySQL Connector/C++

brew install mysql-connector-c++
  • Intel Mac 路径:/usr/local/opt/mysql-connector-c++
  • M1/M2 Mac 路径:/opt/homebrew/opt/mysql-connector-c++
  • 包含 X DevAPI,头文件在 include/mysqlx,库文件为 libmysqlcppconnx.dylib

二、创建项目目录

mkdir mysql_demo
cd mysql_demo

目录结构:

mysql_demo/
├── CMakeLists.txt
└── main.cpp

三、main.cpp 示例(X DevAPI + MySQL 操作)

#include <iostream>
#include <mysqlx/xdevapi.h>int main() {try {// 1. 连接 MySQL X Protocol(默认端口 33060)mysqlx::Session sess("localhost", 33060, "root", "");// 2. 创建数据库(如果不存在)sess.sql("CREATE DATABASE IF NOT EXISTS test_db").execute();sess.sql("USE test_db").execute();// 3. 创建表sess.sql("CREATE TABLE IF NOT EXISTS users (""id INT PRIMARY KEY AUTO_INCREMENT, ""name VARCHAR(50), ""age INT)").execute();// 4. 插入数据sess.sql("INSERT INTO users(name, age) VALUES ('Alice', 25)").execute();sess.sql("INSERT INTO users(name, age) VALUES ('Bob', 30)").execute();sess.sql("INSERT INTO users(name, age) VALUES ('Charlie', 22)").execute();// 5. 查询数据std::cout << "查询 users 表数据:" << std::endl;mysqlx::RowResult res = sess.sql("SELECT * FROM users").execute();for (mysqlx::Row row : res) {std::cout << "ID: " << row[0].get<int>()<< ", Name: " << row[1].get<std::string>()<< ", Age: " << row[2].get<int>() << "\n";}// 6. 更新数据sess.sql("UPDATE users SET age=28 WHERE name='Alice'").execute();std::cout << "更新 Alice 的年龄完成." << std::endl;// 7. 删除数据sess.sql("DELETE FROM users WHERE name='Bob'").execute();std::cout << "删除 Bob 完成." << std::endl;// 8. 查询剩余数据std::cout << "查询更新后的 users 表数据:" << std::endl;res = sess.sql("SELECT * FROM users").execute();for (mysqlx::Row row : res) {std::cout << "ID: " << row[0].get<int>()<< ", Name: " << row[1].get<std::string>()<< ", Age: " << row[2].get<int>() << "\n";}std::cout << "所有操作完成!" << std::endl;} catch (const mysqlx::Error &err) {std::cerr << "X DevAPI 错误: " << err.what() << std::endl;} catch (const std::exception &ex) {std::cerr << "标准错误: " << ex.what() << std::endl;} catch (...) {std::cerr << "未知错误" << std::endl;}return 0;
}

四、智能 Homebrew CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(mysql_demo)set(CMAKE_CXX_STANDARD 17)# 自动检测 Homebrew 安装路径
if(EXISTS "/opt/homebrew/opt/mysql-connector-c++")set(MYSQLCPP_HOME "/opt/homebrew/opt/mysql-connector-c++")
elseif(EXISTS "/usr/local/opt/mysql-connector-c++")set(MYSQLCPP_HOME "/usr/local/opt/mysql-connector-c++")
else()message(FATAL_ERROR "找不到 mysql-connector-c++,请先通过 Homebrew 安装。")
endif()message(STATUS "使用 mysql-connector-c++ 路径: ${MYSQLCPP_HOME}")# 包含头文件和库
include_directories(${MYSQLCPP_HOME}/include)
link_directories(${MYSQLCPP_HOME}/lib)# 可执行文件
add_executable(mysql_demo main.cpp)# 链接 X DevAPI 库
target_link_libraries(mysql_demo PRIVATE mysqlcppconnx)

五、编译与运行

# 生成构建文件
cmake -B build -S .# 编译
cmake --build build# 运行
./build/mysql_demo

示例输出:

查询 users 表数据:
ID: 1, Name: Alice, Age: 25
ID: 2, Name: Bob, Age: 30
ID: 3, Name: Charlie, Age: 22
更新 Alice 的年龄完成.
删除 Bob 完成.
查询更新后的 users 表数据:
ID: 1, Name: Alice, Age: 28
ID: 3, Name: Charlie, Age: 22
所有操作完成!

六、关键点总结

  1. X DevAPI 接口

    • 头文件在 mysqlx 目录
    • 库为 mysqlcppconnx
    • 默认连接端口 33060
  2. CMake 自动路径检测

    • 支持 Intel /usr/local/opt/...
    • 支持 M1/M2 /opt/homebrew/opt/...
  3. MySQL 操作流程

    • 创建数据库:CREATE DATABASE IF NOT EXISTS
    • 选择数据库:USE
    • 创建表:CREATE TABLE IF NOT EXISTS
    • 插入数据:INSERT INTO ... VALUES ...
    • 查询数据:SELECT * FROM ...
    • 更新数据:UPDATE ... SET ... WHERE ...
    • 删除数据:DELETE FROM ... WHERE ...
  4. 错误处理

    • 捕获 mysqlx::Errorstd::exception 和未知异常,保证程序不会异常退出
http://www.xdnf.cn/news/18590.html

相关文章:

  • 力扣 30 天 JavaScript 挑战 第38天 (第九题)学习了 语句表达式的区别 高级函数 promise async await 节流
  • 《P3623 [APIO2008] 免费道路》
  • Redis Set 类型详解:从基础命令到实战应用
  • git实战(8)git高阶命令分析【结合使用场景】
  • 本地Docker部署开源Web相册图库Piwigo与在线远程访问实战方案
  • 如何优雅解决 OpenCV 分段错误(Segfault):子进程隔离实战
  • pig框架导入总结
  • 动手学深度学习(pytorch版):第六章节—卷积神经网络(1)从全连接层到卷积
  • 新能源汽车热管理仿真:蒙特卡洛助力神经网络训练
  • Text2SQL、ChatBI简介
  • [Vid-LLM] 功能分类体系 | 视频如何被“观看“ | LLM的主要作用
  • Flink2.0学习笔记:使用HikariCP 自定义sink实现数据库连接池化
  • 一键部署开源 Coze Studio
  • 第三阶段数据库-9:循环,编号,游标,分页
  • 字节跳动开源Seed-OSS:36B参数模型以512K上下文与可控思考预算重新定义AI实用主义
  • [激光原理与应用-320]:结构设计 - Solidworks - 软件工具UI组织的核心概念
  • 解决散点图绘制算法单一导致的数据异常问题
  • STM32窗口看门狗(WWDG)深度解析:精准守护嵌入式系统的实时性
  • python学习DAY49打卡
  • SHAP分析+KOA-RIME开普勒结合霜冰算法双重优化BP神经网络+9种映射方法+新数据预测!机器学习可解释分析!
  • 【升级版】从零到一训练一个 0.6B 的 MoE 大语言模型
  • 云原生俱乐部-k8s知识点归纳(8)
  • day40-tomcat
  • k8s之 Pod 资源管理与 QoS
  • Angular初学者入门第三课——工厂函数(精品)
  • 日志搜索系统前端页面(暂无后端功能)
  • webrtc弱网-SendSideBandwidthEstimation类源码分析与算法原理
  • 手机横屏适配方案
  • 20250823给荣品RD-RK3588开发板刷Rockchip原厂的Buildroot【linux-5.10】时调通AP6275P的WIFI【源码部分】
  • ArkTS 语言全方位解析:鸿蒙生态开发新选择