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() 用于 INSERTUPDATEDELETE,返回影響的行數。

示例:

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,每條 INSERTUPDATEDELETE 語句都會 立即生效,即使程序崩潰,數據也已經修改了。

示例(默認自動提交)

sql::Statement *stmt = con->createStatement();
stmt->execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
delete stmt;  // 即使程序崩潰,數據庫的修改依然有效
手動事務(關閉自動提交)

如果希望多個 SQL 語句 全部成功或全部失敗,需要 關閉自動提交 并手動 COMMITROLLBACK

接口:

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");選擇數據庫
執行 SQLstmt->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;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897551.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897551.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897551.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++藍橋杯基礎篇(十一)

片頭 嗨~小伙伴們&#xff0c;大家好&#xff01;今天我們來學習C藍橋杯基礎篇&#xff08;十一&#xff09;&#xff0c;學習類&#xff0c;結構體&#xff0c;指針相關知識&#xff0c;準備好了嗎&#xff1f;咱們開始咯~ 一、類與結構體 類的定義&#xff1a;在C中&#x…

css中實現border距離視圖左右兩側有距離

首先看效果圖 再看css是如何實現 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.main {background-color: aqua;display: block;width: 300px;padding: 0px 32px;box-sizing: border-box;}/…

Ubuntu 22.04 無法進入圖形界面的解決方法

Ubuntu 22.04 無法進入圖形界面&#xff0c;只能進入 tty&#xff0c;可能是由于圖形界面相關的配置或驅動程序出現了問題。以下是一些常見的解決方法&#xff1a; 1. 檢查圖形界面服務狀態 首先&#xff0c;檢查圖形界面服務&#xff08;通常是 gdm 或 lightdm&#xff09;的…

Tweak Power:全方位電腦系統優化的高效工具

在日常使用電腦時&#xff0c;系統性能的下降、垃圾文件的堆積以及硬盤的老化等問題常常困擾著用戶。為了提升電腦性能、優化系統運行&#xff0c;許多人會選擇系統優化工具。然而&#xff0c;國內一些系統優化軟件常常因為廣告過多或功能冗雜而讓人望而卻步。此時&#xff0c;…

深入淺出Bearer Token:解析工作原理及其在Vue、Uni-app與Java中的實現Demo

目錄 前言1. 基本知識2. Demo3. 實戰 前言 &#x1f91f; 找工作&#xff0c;來萬碼優才&#xff1a;&#x1f449; #小程序://萬碼優才/r6rqmzDaXpYkJZF 1. 基本知識 Bearer Token是一種基于Token的認證機制&#xff0c;用于在HTTP請求中傳遞用戶的身份信息 應用于RESTful A…

kubernetes——part3-5 核心概念 Service

一、 service作用 使用kubernetes集群運行工作負載時&#xff0c;由于Pod經常處于用后即焚狀態&#xff0c;Pod經常被重新生成&#xff0c;因此Pod對應的IP地址也會經常變化&#xff0c;導致無法直接訪問Pod提供的服務&#xff0c;Kubernetes中使用了Service來解決這一問題&am…

從零開始 | C語言基礎刷題DAY1

?個人主頁&#xff1a;折枝寄北的博客 DAY1[2025.3.11] 1. 求兩個數的較大值2.從鍵盤輸入的兩個數的大小關系3.一個整數的奇偶性&#xff0c;請判斷4. 考試分數是否通過5.考試成績是否完美&#xff0c;請判斷 1. 求兩個數的較大值 題目&#xff1a; 寫一個函數求兩個整數的較…

開源模型時代的 AI 開發革命:Dify 技術深度解析

開源模型時代的AI開發革命&#xff1a;Dify技術深度解析 引言&#xff1a;AI開發的開源新紀元 在生成式AI技術突飛猛進的2025年&#xff0c;開源模型正成為推動行業創新的核心力量。據統計&#xff0c;全球超過80%的AI開發者正在使用開源模型構建應用&#xff0c;這一趨勢不僅…

Dify Web 前端獨立部署指南(與后端分離,獨立部署)

背景:單獨拆分前端出來部署,二開前后端 本文檔專注于 Dify Web 前端的部署流程和配置,適用于需要將項目部署到各種環境的運維人員和開發者。 1. 環境準備 1.1 部署環境要求 Node.js >= 18.17.0Nginx 或其他Web服務器(生產環境推薦)Docker(可選,用于容器化部署)1.…

《蒼穹外賣》SpringBoot后端開發項目核心知識點整理(DAY1 to DAY3)

目錄 一、在本地部署并啟動Nginx服務1. 解壓Nginx壓縮包2. 啟動Nginx服務3. 驗證Nginx是否啟動成功&#xff1a; 二、導入接口文檔1. 黑馬程序員提供的YApi平臺2. YApi Pro平臺3. 推薦工具&#xff1a;Apifox 三、Swagger1. 常用注解1.1 Api與ApiModel1.2 ApiModelProperty與Ap…

大數據hadoop課程筆記

1.課程導入 柯潔 Alpha Go是人工智能領域的里程碑。 深度學習 大模型deepseek chatgpt 大模型 和 大數據 之間有著非常緊密的關系。可以說&#xff0c;大數據是大模型發展的基石&#xff0c;而大模型是大數據價值挖掘的重要工具。 https://youtu.be/nN-VacxHUH8?sifj7Ltk…

架構學習第八周--Kubernetes博客搭建

目錄 一、整體架構 二、部署MySQL主從 三、部署Redis哨兵 四、部署WordPress 五、注意事項 一、整體架構 本項目為在一主三從的Kubernetes集群上部署WordPress博客。因為WordPress部分容器版本自行集成Apache和PHP服務&#xff0c;因此在Kubernetes上部署WordPress只需提供…

Application.OnTime如何引用帶參數的過程

Application.OnTime方法本身并不直接支持傳遞參數給被調用的過程。不過&#xff0c;有幾種方法可以間接實現這個需求。 方法1&#xff1a;使用單引號表達式 使用單引號表達式來傳遞參數時&#xff0c;不能在表達式中使用變量&#xff0c;需要把參數值直接寫到表達中&am…

網絡安全之tcpdump工具

引言 wireshark是一款非常不錯的抓包軟件&#xff0c;在圖形化界面占絕對統治地位&#xff1b;盡管其在字符界面下有些許選項可供使用&#xff0c;但終究不太方便&#xff0c;下面我再介紹一款NB的終端抓包工具 tcpdump 1、混雜模式 linux的網卡有混雜模式一說&#xff0c;當開…

VC++ 獲取目的IP的路由

GetBestRoute 函數獲取到目的IP的最佳匹配路由。 第一個參數為&#xff1a;destination&#xff08;目的IP&#xff09; 第二個參數為&#xff1a;source&#xff08;源IP&#xff09; 通常不需要指定第二個source&#xff0c;這個一般用來匹配具體某一個網卡接口路由的&…

JavaScript 模塊 vs C# 類:封裝邏輯的兩種哲學

引言 在現代軟件開發中&#xff0c;模塊化和面向對象設計是代碼組織的核心課題。本文通過對比 JavaScript 模塊&#xff08;ES6 Module&#xff09;與 C# 類&#xff08;Class&#xff09;的實現方式&#xff0c;探討兩種語言在封裝邏輯時的不同哲學&#xff0c;并給出實際應用…

大模型在甲狀腺癌診療全流程預測及方案制定中的應用研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 1.3 國內外研究現狀 二、大模型預測甲狀腺癌的理論基礎 2.1 甲狀腺癌相關醫學知識 2.2 大模型技術原理與特點 2.3 大模型在醫療領域的應用潛力 三、術前預測方案 3.1 預測模型構建 3.1.1 數據收集與預處理 …

electron+vue+webview內嵌網頁并注入js

vue內嵌網頁可以使用iframe實現內嵌網頁&#xff0c;但是只能通過postMessage間接通信&#xff0c;在electron環境下&#xff0c;vue可以直接使用webview來內嵌網頁&#xff0c;支持 executeJavaScript、postMessage、send 等豐富的通信機制。 使用 webview的優勢 性能更佳&…

leetcode日記(95)將有序數組轉換為二叉搜索樹

很簡單&#xff0c;感覺自己越來越適應數據結構題目了…… /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : va…

【threejs實戰教程一】初識Three.js,場景Scene、相機Camera、渲染器Renderer

Three.js是一個基于WebGL的JavaScript 3D圖形庫&#xff0c;用于在瀏覽器中創建和顯示3D內容 Three.js中最基礎的三個關鍵要素就是場景Scene、相機Camera、渲染器Renderer 通俗一點理解&#xff0c;場景就是我們生活中一個具體的場景&#xff0c;比如自然環境中的一棟建筑&…