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…...
android studio开发文档
android基本样式 1.文本 2.设置文本大小 3.字体颜色 背景 资源文件 xml’引用资源文件 4.视图宽高 5.间距 6.对齐方式 常用布局 1.linearLayout线性布局 2.相对布局 RelativeLayout 3.网格布局GridLayout 4.scrollview滚动视图 Button 点击事件与长按事件 长按 按钮禁用与…...
Java 对象与类——从 C++ 到 Java
文章目录 面向对象程序设计概述使用预定义类用户自定义类静态字段与静态方法方法参数对象构造包JAR 文件文档注释类设计技巧 面向对象程序设计概述 面向对象程序设计(OOP)在 20 世纪 70 年代出现,是当今主流编程范型,Java 是面向…...
java2025年常见设计模式面试题
1. 请解释建造者模式(Builder Pattern)及其应用场景。 答案: 建造者模式用于创建一个复杂的对象,同时允许用户只通过指定复杂对象的类型和内容就能构建它们,隐藏了复杂的构建逻辑。 示例: public class C…...
一篇文章讲解清楚ARM9芯片启动流程
SAM9X60 ARM9 boot启动流程关键词介绍: 第一级bootloader - 也叫boot ROM,是集成在MPU内部的ROM里面 它的主要功能是执行对MPU的基本初始化和配置,查找并将第二级bootloader从外部NVM中读取出来并放到MPU内部的SRAM. 可以让MPU强制停留在第一…...
setlocale()的参数,“zh_CN.UTF-8“, “chs“, “chinese-simplified“的差异。
在 C/C 中,setlocale() 函数的参数 zh_CN.UTF-8、chs 和 chinese-simplified 均用于设置中文简体环境,但它们的语义、平台支持和编码行为存在显著差异: 1. zh_CN.UTF-8(推荐) 含义: zh_CN: 中文&…...
Python项目-基于Django的在线教育平台开发
1. 项目概述 在线教育平台已成为现代教育的重要组成部分,特别是在后疫情时代,远程学习的需求显著增加。本文将详细介绍如何使用Python的Django框架开发一个功能完善的在线教育平台,包括系统设计、核心功能实现以及部署上线等关键环节。 本项…...
【2025】Electron + React 架构筑基——从零到一的跨平台开发
引言 源代码仓库: Github仓库【electron_git】 你是否厌倦了在命令行中反复输入git status,却依然无法直观看到文件变化? 是否羡慕VS Code的丝滑Git集成,却苦恼于无法定制自己的专属工具? 本专栏将为你打开一扇新的…...
Vue3实战学习(IDEA中打开、启动与搭建Vue3工程极简脚手架教程(2025超详细教程)、Windows系统命令行启动Vue3工程)(2)
目录 一、命令行中重新启动已搭建好的Vue3工程。(快速上手) (0)Windows环境下使用命令行从零到一手动搭建Vue3工程教程。 (1)首先找到已建Vue3工程的目录。 (2)无需再下载依赖包,直接执行npm ru…...
【ArcGIS】地理坐标系
文章目录 一、坐标系理论体系深度解析1.1 地球形态的数学表达演进史1.1.1 地球曲率的认知变化1.1.2 参考椭球体参数对比表 1.2 地理坐标系的三维密码1.2.1 经纬度的本质1.2.2 大地基准面(Datum)的奥秘 1.3 投影坐标系:平面世界的诞生1.3.1 投…...
Redis- 切片集群
切片集群 切片集群什么是Redis Cluster吗?为什么需要切片集群?Redis Cluster的数据分片机制是怎样的?哈希槽的算法是什么基本算法流程 待填坑 切片集群 什么是Redis Cluster吗?为什么需要切片集群? Redis Cluster是R…...
Oxidized收集H3C交换机网络配置报错,not matching configured prompt (?-mix:^(<CD>)$)
背景:问题如上标题,H3C所有交换机配置的model都是comware 解决方案: 1、找到compare.rb [rootoxidized model]# pwd /usr/local/lib/ruby/gems/3.1.0/gems/oxidized-0.29.1/lib/oxidized/model [rootoxidized model]# ll comware.rb -rw-r--…...
力扣146 - LRU缓存
视频讲解 哈希 双向链表 为什么要用双向链表? 快速删除节点(O(1)) 如果是单链表的话,删除一个节点时,需要从头遍历,找到前驱节点,才能修改 prev->next,导致 O(n)…...
单例模式:确保一个类只有一个实例
目录 引言 1. 单例模式的核心思想 2. 单例模式的实现方式 2.1 饿汉式单例 2.2 懒汉式单例 2.3 线程安全的懒汉式单例 2.4 双重检查锁定(Double-Checked Locking) 2.5 静态内部类实现单例 2.6 枚举实现单例 3. 单例模式的使用场景 4. 单例模式…...
doris: SQL Server
Doris JDBC Catalog 支持通过标准 JDBC 接口连接 SQL Server 数据库。本文档介绍如何配置 SQL Server 数据库连接。 使用须知 要连接到 SQL Server 数据库,您需要 SQL Server 2012 或更高版本,或 Azure SQL 数据库。 SQL Server 数据库的 JDBC 驱动…...
【ubuntu20】--- 搭建 gerrit 最新最详细
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【ubuntu20】--- 搭建 gerrit 最新最详细…...
RtlLookupAtomInAtomTable函数分析之RtlpAtomMapAtomToHandleEntry函数的作用是验证其正确性
第一部分: NTSTATUS RtlLookupAtomInAtomTable( IN PVOID AtomTableHandle, IN PWSTR AtomName, OUT PRTL_ATOM Atom OPTIONAL ) { NTSTATUS Status; PRTL_ATOM_TABLE p (PRTL_ATOM_TABLE)AtomTableHandle; PRTL_ATOM_TABLE_ENTRY a; …...
Python----数据分析(Matplotlib五:pyplot的其他函数,Figure的其他函数, GridSpec)
一、pyplot的其他函数 1.1、xlabel 在matplotlib中, plt.xlabel() 函数用于为当前活动的坐标轴(Axes)设置x轴的 标签。当你想要标识x轴代表的数据或单位时,这个函数非常有用。 plt.xlabel(xlabel text) 1.2、ylabel 在matplotl…...
C语言——链表
大神文献:https://blog.csdn.net/weixin_73588765/article/details/128356985 目录 一、链表概念 1. 什么是链表? 1.1 链表的构成 2. 链表和数组的区别 数组的特点: 链表的特点: 二者对比: 二…...
使用免费IP数据库离线查询IP归属地
一、准备工作 1.下载免费IP数据库 首先,访问 MaxMind官网(https://www.maxmind.com/en/home)如果你还没有MaxMind账号,可以通过此链接地址(https://www.maxmind.com/en/geolite2/signup)进行账号注册&…...
MySQL(单表)知识点
文章目录 1.数据库的概念2.下载并配置MySQL2.1初始化MySQL的数据2.2注册MYSQL服务2.3启动MYSQL服务2.4修改账户默认密码2.5登录MYSQL2.6卸载MYSQL 3.MYSQL数据模型3.1连接数据库 4.SQL简介4.1SQL的通用语法4.2SQL语句的分类4.3DDL语句4.3.1数据库4.3.2表(创建,查询,修改,删除)4…...
1.15-16-17-18迭代器与生成器,函数,数据结构,模块
目录 15,Python3 迭代器与生成器15-1 迭代器15-1-1 基础知识15-1-2 迭代器与for循环工作原理 15-2 生成器(本质就是迭代器)15-2-1 yield 表达式15-2-2 三元表达式15-2-3 列表生成式15-2-4 其他生成器(——没有元祖生成式——&…...
window下的docker内使用gpu
Windows 上使用 Docker GPU需要进行一系列的配置和步骤。这是因为 Docker 在 Windows 上的运行环境与 Linux 有所不同,需要借助 WSL 2(Windows Subsystem for Linux 2)和 NVIDIA Container Toolkit 来实现 GPU 的支持。以下是详细的流程: 一、环境准备 1.系统要求 Window…...
CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现
文章目录 CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.构造POC2.复现CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现 0x01 前言 免责声明:请勿利用文章内的相…...
DR和BDR的选举规则
在 OSPF(开放最短路径优先)协议中,DR(Designated Router,指定路由器) 和 BDR(Backup Designated Router,备份指定路由器) 的选举是为了在广播型网络(如以太网…...
Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的应用(120)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
第七课:Python反爬攻防战:Headers/IP代理与验证码
在爬虫开发过程中,反爬虫机制成为了我们必须面对的挑战。本文将深入探讨Python爬虫中常见的反爬机制,并详细解析如何通过随机User-Agent生成、代理IP池搭建以及验证码识别来应对这些反爬策略。文章将包含完整的示例代码,帮助读者更好地理解和…...
MySql的安装及数据库的基本操作命令
1.MySQL的安装 1.1进入MySQL官方网站 1.2点击下载 1.3下拉选择MySQL社区版 1.4选择你需要下载的版本及其安装的系统和下载方式 直接安装以及压缩包 建议选择8.4.4LST LST表明此版本为长期支持版 新手建议选择红框勾选的安装方式 1.5 安装包下载完毕之后点击安装 2.数据库…...
VsCode导入时选择相对路径
自动导入时总是以db://开头了,而我们通常需要的是相对路径,对VsCode进行如下设置: 打开 VSCode 设置: 使用快捷键 Ctrl ,(Windows/Linux)或 Cmd ,(Mac)。 或者在菜单栏中选择 …...
计算机视觉|3D卷积网络VoxelNet:点云检测的革新力量
一、引言 在科技快速发展的背景下,3D 目标检测技术在自动驾驶和机器人领域中具有重要作用。 在自动驾驶领域,车辆需实时、准确感知周围环境中的目标物体,如行人、车辆、交通标志和障碍物等。只有精确检测这些目标的位置、姿态和类别&#x…...
