C++ MySQL 常用接口(基于 MySQL Connector/C++)
C++ MySQL 常用接口(基于 MySQL Connector/C++)
1. 数据库连接
接口:
sql::mysql::MySQL_Driver *driver;
sql::Connection *con;
作用:
用于创建 MySQL 连接对象。
示例:
driver = sql::mysql::get_mysql_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "user", "password");
释放资源:
delete con;
2. 选择数据库
接口:
con->setSchema("database_name");
作用:
指定要操作的数据库。
示例:
con->setSchema("test_db");
3. 创建 SQL 语句对象
接口:
sql::Statement *stmt;
stmt = con->createStatement();
作用:
创建一个 SQL 语句执行对象。
示例:
stmt = con->createStatement();
stmt->execute("CREATE TABLE IF NOT EXISTS users (id INT, name VARCHAR(50))");
delete stmt;
4. 执行 SQL 语句
接口:
stmt->execute("SQL语句");
stmt->executeQuery("SQL查询语句");
stmt->executeUpdate("SQL更新语句");
作用:
execute()用于执行不返回结果集的 SQL 语句(如CREATE TABLE)。executeQuery()用于执行SELECT查询,返回ResultSet结果集。executeUpdate()用于INSERT、UPDATE、DELETE,返回影响的行数。
示例:
stmt = con->createStatement();
stmt->execute("INSERT INTO users (id, name) VALUES (1, 'Tom')");
sql::ResultSet *res = stmt->executeQuery("SELECT * FROM users");
int rows = stmt->executeUpdate("UPDATE users SET name='Jerry' WHERE id=1");delete res;
delete stmt;
5. 获取查询结果
接口:
sql::ResultSet *res;
res->next();
res->getInt("column_name");
res->getString("column_name");
作用:
获取查询结果,并读取列值。
示例:
sql::ResultSet *res = stmt->executeQuery("SELECT * FROM users");
while (res->next()) {std::cout << "ID: " << res->getInt("id") << ", Name: " << res->getString("name") << std::endl;
}
delete res;
6. 使用预处理语句
接口:
sql::PreparedStatement *pstmt;
pstmt = con->prepareStatement("SQL语句");
pstmt->setInt(参数索引, 整数值);
pstmt->setString(参数索引, 字符串值);
pstmt->execute();
pstmt->executeQuery();
pstmt->executeUpdate();
作用:
prepareStatement()预编译 SQL,提高执行效率并防止 SQL 注入。setInt()/setString()设置 SQL 语句中的参数值。
示例:
sql::PreparedStatement *pstmt = con->prepareStatement("INSERT INTO users (id, name) VALUES (?, ?)");
pstmt->setInt(1, 2);
pstmt->setString(2, "Alice");
pstmt->executeUpdate();
delete pstmt;
7. 事务处理
自动提交(Auto Commit)
MySQL 默认启用 Auto Commit,每条 INSERT、UPDATE、DELETE 语句都会 立即生效,即使程序崩溃,数据也已经修改了。
示例(默认自动提交)
sql::Statement *stmt = con->createStatement();
stmt->execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
delete stmt; // 即使程序崩溃,数据库的修改依然有效
手动事务(关闭自动提交)
如果希望多个 SQL 语句 全部成功或全部失败,需要 关闭自动提交 并手动 COMMIT 或 ROLLBACK。
接口:
con->setAutoCommit(false);
con->commit();
con->rollback();
作用:
setAutoCommit(false):关闭自动提交,进入事务模式。commit():提交事务,所有 SQL 语句的更改生效。rollback():回滚事务,撤销所有未提交的更改。
示例(手动控制事务)
try {con->setAutoCommit(false); // 关闭自动提交,开启事务模式sql::PreparedStatement *pstmt = con->prepareStatement("UPDATE accounts SET balance = balance - ? WHERE id = ?");pstmt->setDouble(1, 100.0);pstmt->setInt(2, 1);pstmt->executeUpdate();delete pstmt;pstmt = con->prepareStatement("UPDATE accounts SET balance = balance + ? WHERE id = ?");pstmt->setDouble(1, 100.0);pstmt->setInt(2, 2);pstmt->executeUpdate();delete pstmt;con->commit(); // **手动提交事务,所有修改一起生效**
} catch (sql::SQLException &e) {con->rollback(); // **出错时回滚,保证数据一致性**std::cerr << "Transaction failed: " << e.what() << std::endl;
}
事务的使用场景
适用于需要保证 数据一致性 的情况:
- 银行转账(A 账户扣钱,B 账户加钱,必须同时成功)
- 库存管理(购买商品时,需要同时更新库存和订单信息)
- 订单处理(下单时,必须同时修改多个表的数据)
总结
- MySQL 默认
Auto Commit = true,每条 SQL 语句都会立即提交。 - 关闭
Auto Commit后,可以 手动提交或回滚,确保数据一致性。 - 使用
commit()确保更改生效,使用rollback()处理失败情况。
8. 关闭连接
接口:
delete res;
delete stmt;
delete pstmt;
delete con;
作用:
释放资源,避免内存泄漏。
示例:
delete res;
delete stmt;
delete pstmt;
delete con;
总结
| 类别 | 接口 | 作用 |
|---|---|---|
| 数据库连接 | sql::mysql::MySQL_Driver *driver;sql::Connection *con;driver = sql::mysql::get_mysql_driver_instance();con = driver->connect(...); | 连接 MySQL 数据库 |
| 选择数据库 | con->setSchema("database_name"); | 选择数据库 |
| 执行 SQL | stmt->execute("SQL语句");stmt->executeQuery("SQL查询语句");stmt->executeUpdate("SQL更新语句"); | 执行 SQL 语句 |
| 获取查询结果 | res->next();res->getInt("column_name");res->getString("column_name"); | 获取查询结果 |
| 预处理语句 | pstmt = con->prepareStatement("SQL语句");pstmt->setInt(1, value);pstmt->setString(2, "value");pstmt->executeUpdate(); | 预编译 SQL,防止 SQL 注入 |
| 事务管理 | con->setAutoCommit(false);con->commit();con->rollback(); | 控制事务提交和回滚 |
| 释放资源 | delete res;delete stmt;delete pstmt;delete con; | 释放内存,避免泄漏 |
代码示例
/* Copyright 2008, 2010, Oracle and/or its affiliates.This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.There are special exceptions to the terms and conditions of the GPL
as it is applied to this software. View the full text of the
exception in file EXCEPTIONS-CONNECTOR-C++ in the directory of this
software distribution.This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*//* Standard C++ includes */
#include <stdlib.h>
#include <iostream>/*Include directly the differentheaders from cppconn/ and mysql_driver.h + mysql_util.h(and mysql_connection.h). This will reduce your build time!
*/
#include "mysql_connection.h"#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>using namespace std;int main(void)
{
cout << endl;
cout << "Let's have MySQL count from 10 to 1..." << endl;try {sql::Driver *driver;sql::Connection *con;sql::Statement *stmt;sql::ResultSet *res;sql::PreparedStatement *pstmt;/* Create a connection */driver = get_driver_instance();con = driver->connect("tcp://127.0.0.1:3306", "root", "root");/* Connect to the MySQL test database */con->setSchema("test");stmt = con->createStatement();stmt->execute("DROP TABLE IF EXISTS test");stmt->execute("CREATE TABLE test(id INT)");delete stmt;/* '?' is the supported placeholder syntax */pstmt = con->prepareStatement("INSERT INTO test(id) VALUES (?)");for (int i = 1; i <= 10; i++) {pstmt->setInt(1, i);pstmt->executeUpdate();}delete pstmt;/* Select in ascending order */pstmt = con->prepareStatement("SELECT id FROM test ORDER BY id ASC");res = pstmt->executeQuery();/* Fetch in reverse = descending order! */res->afterLast();while (res->previous())cout << "\t... MySQL counts: " << res->getInt("id") << endl;delete res;delete pstmt;delete con;} catch (sql::SQLException &e) {cout << "# ERR: SQLException in " << __FILE__;cout << "(" << __FUNCTION__ << ") on line " »<< __LINE__ << endl;cout << "# ERR: " << e.what();cout << " (MySQL error code: " << e.getErrorCode();cout << ", SQLState: " << e.getSQLState() << »" )" << endl;
}cout << endl;return EXIT_SUCCESS;
}
相关文章:
C++ MySQL 常用接口(基于 MySQL Connector/C++)
C MySQL 常用接口(基于 MySQL Connector/C) 1. 数据库连接 接口: sql::mysql::MySQL_Driver *driver; sql::Connection *con;作用: 用于创建 MySQL 连接对象。 示例: driver sql::mysql::get_mysql_driver_insta…...
本地部署 OpenManus 保姆级教程(Windows 版)
一、环境搭建 我的电脑是Windows 10版本,其他的没尝试,如果大家系统和我的不一致,请自行判断,基本上没什么大的出入啊。 openManus的Git地址:https://github.com/mannaandpoem/OpenManus 根据官网的两种安装推荐方式如…...
【Pandas】pandas Series compare
# Pandas2.2 Series ## Computations descriptive stats |方法|描述| |-|:-------| |Series.compare(other[, align_axis, ...])|用于比较两个 Series| ### pandas.Series.compare pandas.Series.compare 方法用于比较两个 Series,并返回一个包含差异的 DataFram…...
基于DeepSeek的智慧医药系统(源码+部署教程)
运行环境 智慧医药系统运行环境如下: 前端: HTMLCSS后端:Java AIGCDeepseekIDE工具:IDEA技术栈:Springboot HTMLCSS MySQL 主要角色 智慧医药系统主要分为两个角色。 游客 尚未进行注册和登录。具备登录注册、…...
如何为服务设置合理的线程数
1. 首先,要确定最大线程数的限制因素。通常,线程数量受限于内存、CPU和操作系统限制。比如,每个线程都需要一定的栈内存,默认情况下Java线程的栈大小是1MB(64位系统可能更大),所以如果内存不足&…...
Unity--Cubism Live2D模型使用
了解LIVE2D在unity的使用--前提记录 了解各个组件的作用 Live2D Manuals & Tutorials 这些文件都是重要的控制动画参数的 Cubism Editor是编辑Live2D的工具,而导出的数据的类型,需要满足以上的条件 SDK中包含的Cubism的Importer会自动生成一个Pref…...
Vue.js 3 的设计思路:从声明式UI到高效渲染机制
目录 一、声明式UI与虚拟DOM的灵活性 二、渲染器:虚拟DOM到真实DOM的桥梁 三、组件的本质与实现 四、编译与运行时的协同优化 五、性能与可维护性的权衡 总结 Vue.js 3 作为新一代前端框架,其设计理念在声明式UI描述、虚拟DOM优化、组件化架构…...
部署前后端项目
部署项目 liunx 软件安装 软件安装方式 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 建议nginx、MySQL、Redis等等使用docker安装,会很便捷,这里只演示JDK、ngxin手动的安装 安装JDK 上述我…...
Vue Diff算法原理深度解析:如何高效更新虚拟DOM?
文章目录 1. 为什么需要Diff算法?2. Diff算法核心原则3. 核心流程图解4. 核心代码实现(简化版)5. Key的重要性示例6. 算法优化策略7. 时间复杂度优化8. 与其他框架的对比9. 总结 1. 为什么需要Diff算法? 在Vue的响应式系统中&…...
Dify平台部署记录
安装dify项目 官网地址:http://difyai.com/ github地址:https://github.com/langgenius/dify 下载项目: git clone https://github.com/langgenius/dify.git下载过慢,直接访问网页下载zip压缩包: 解压,…...
ArcGIS Pro中字段的新建方法与应用
一、引言 在地理信息系统(GIS)的数据管理和分析过程中,字段操作起着至关重要的作用。 无论是进行地图制作、空间分析还是数据统计,字段都是承载属性信息的基本单元。 ArcGIS Pro作为一款功能强大的GIS软件,为用户提…...
Git 的基本概念和使用方式。
Git 是一种分布式版本控制系统,用于跟踪文件和目录的变化。Git 的基本概念和使用方式如下: 仓库(Repository):Git 仓库是用来存储项目文件和历史记录的地方。一个 Git 仓库包含项目的文件、版本记录和配置信息。 提交…...
贪心算法--
1.柠檬水找零 link:860. 柠檬水找零 - 力扣(LeetCode) code class Solution { public:bool lemonadeChange(vector<int>& bills) {// 贪心算法, 优先花出大面额bill, 尽可能保护小面额billint five 0, ten 0;// 不…...
mysql下载与安装、关系数据库和表的创建
一、mysql下载: MySQL获取: 官网:www.mysql.com 也可以从Oracle官方进入:https://www.oracle.com/ 下载地址:https://downloads.mysql.com/archives/community/ 选择对应的版本和对应的操作系统&a…...
万字技术指南STM32F103C8T6 + ESP8266-01 连接 OneNet 平台 MQTT/HTTP
此博客为一份详细的指南,涵盖 STM32F103C8T6 通过 ESP8266-01 连接 OneNet 平台,并使用 MQTT/HTTP 进行数据通信的完整流程。这份文档包括: OneNet 平台的介绍与功能概览在 OneNet 上创建和配置设备的方法STM32CubeIDE 的开发环境搭建ESP826…...
MWC 2025 | 紫光展锐联合移远通信推出全面支持R16特性的5G模组RG620UA-EU
2025年世界移动通信大会(MWC 2025)期间,紫光展锐联合移远通信,正式发布了全面支持5G R16特性的模组RG620UA-EU,以强大的灵活性和便捷性赋能产业。 展锐芯加持,关键性能优异 RG620UA-EU模组基于紫光展锐V62…...
PyCharm 接入 DeepSeek、OpenAI、Gemini、Mistral等大模型完整版教程(通用)!
PyCharm 接入 DeepSeek、OpenAI、Gemini、Mistral等大模型完整版教程(通用)! 当我们成功接入大模型时,可以选中任意代码区域进行解答,共分为三个区域,分别是选中区域、提问区域以及回答区域,我…...
小智智能体语言大模型硬件软件开发
硬件可以参考ESP32-AI语音助手 - 立创开源硬件平台 单片机使用esp32s3,可以直接替换,但是引脚IO有变化,而且esp32s3 io35 36 37不能用,所以得飞一条线,原先接在io35的飞到io4上。如果不飞线的话系统一直重启 软件使用…...
网络tcp协议设置,网络tcp协议设置不了
网络TCP协议的设置通常涉及到多个方面,包括IP地址、子网掩码、默认网关、DNS服务器等参数的配置,以及TCP/IP协议栈本身的配置。如果遇到网络TCP协议设置不了的问题,可能是由多种原因导致的。以下是一些可能的原因及解决方法: 一、…...
配置Hadoop集群
Hadoop的运行模式 本地运行:在一台单机上运行,没有分布式文件系统,直接读写本地操作系统的文件系统。特点:不对配置文件进行修改,Hadoop 不会启动 伪分布式:也是在一台单机上运行,但用不同的 …...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
