01-连接池项目背景:C++的数据库操作

从0开始学习C++与数据库的联动

1.原始方式-使用MySQL Connector/C 提供的API查询

1.1 数据库预操作

我的本地电脑上有mysql数据库,里面预先创建了一个database名叫chat,用户名root,密码password。

1.2 Visual Studio预操作

在Windows上使用VS需要加一些路径之类的,这样才可以使用MySQL C API。否则,无法找到mysql.h,无法正常链接dll、lib,无法编译。
1.下载MySQL Connector/C;
2.配置包含目录和库目录:
“C/C++” -> “常规” -> “附加包含目录”,添加MySQL Connector/C的include目录。
“链接器” -> “常规” -> “附加库目录”,添加MySQL Connector/C的lib目录。
3.配置链接库:
在“链接器” -> “输入” -> “附加依赖项”,添加以下库文件:
libmysql.lib:MySQL C API的静态库。
mysqlclient.lib:MySQL C API的动态链接库。
4.拷贝运行时依赖项: 将MySQL Connector/C的bin目录添加到系统的PATH环境变量中,并将libmysql.dll文件复制到vcxproj文件所在的目录。

1.3 简单查询程序

1.下面是一个单线程的程序,所有的数据库连接和查询都是在主线程中执行的。(里面可能有一些不安全的操作,方便理解没有管,比如close函数里传nullptr是不安全的,NULL最好改成nullptr便于与0值区分等。)
2.mysql.h声明了MYSQL、MYSQL_ROW、MYSQL_RES等结构体和一些mysql_init这样的函数,必须包含这个头文件,编译才不会出错。
从https://dev.mysql.com/doc/c-api/8.0/en/c-api-basic-function-reference.html摘了一些出来,可跳转链接看具体的接口参数
结构体:
在这里插入图片描述
函数接口:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <mysql.h> // 假设使用MySQL数据库int main() {// 步骤1:建立数据库连接MYSQL* conn = mysql_init(NULL);if (conn == NULL) {std::cerr << "Failed to initialize MySQL connection." << std::endl;return -1;}if (mysql_real_connect(conn, "localhost", "root", "password", "chat", 0, NULL, 0) == NULL) {std::cerr << "Failed to connect to MySQL database." << std::endl;mysql_close(conn);return -1;}// 步骤2:执行SQL查询const char* query = "SELECT * FROM user";if (mysql_query(conn, query) != 0) {std::cerr << "Failed to execute SQL query." << std::endl;mysql_close(conn);return -1;}MYSQL_RES* result = mysql_store_result(conn);if (result == NULL) {std::cerr << "Failed to store MySQL result." << std::endl;mysql_close(conn);return -1;}// 处理查询结果MYSQL_ROW row;while ((row = mysql_fetch_row(result)) != NULL) {// 处理每一行的数据std::cout << "Column 1: " << row[0] << ", Column 2: " << row[1] << std::endl;}// 释放查询结果mysql_free_result(result);// 步骤3:断开数据库连接mysql_close(conn);return 0;
}

2.将上述API查询封装到类里,调用自己的函数查询

上面的代码主要是用到了mysql_init,mysql_real_connect,mysql_query,mysql_store_result,mysql_free_result,mysql_close这些mysql.h里声明的一些函数。如果我们想用这些函数进行对MYSQL数据库内数据的操作,用的是MYSQL*类型的指针conn进行操作。

  1. 首先,MYSQL* conn = mysql_init(NULL);也即真正malloc了一个空间,分配和初始化了一个 MYSQL 结构体实例,并返回指向该实例的指针conn。这个实例用于存储数据库连接所需的所有信息。
  2. mysql_real_connect 函数建立实际的数据库连接,并使用 MYSQL 结构体来保存连接的详细信息。
  3. 之后,无论是查询(mysql_query)、获取结果(mysql_store_result)还是关闭连接(mysql_close),都需要使用这个 MYSQL* 类型的指针。这是因为所有这些操作都是在特定的数据库连接会话上执行的,而 conn 指针正是指向这个会话的。

那么,在此基础之上,我们可以将这些函数进一步的封装,用一个类中的成员函数去分别调用它们。具体而言,我们自己定义一个Connection类,里面放一个私有成员对象MYSQL* _conn指针,以及构造、析构、连接、更新、查询函数,而这些函数又分别调用了初始的mysql_init,mysql_real_connect,mysql_query,mysql_store_result,mysql_free_result,mysql_close这些mysql.h里声明的一些函数,调用的参数是初始函数所需的参数加上conn指针。在我们自己实现的函数里,还可以额外加一些LOG语句。当我们对这个类进行实例化的时候,用类实例.成员函数()就可以真正对数据库进行增删改查。

代码分为4个文件,Connection.h、Connection.cpp、main.cpp,以及最简单的日志打印(仅仅使用了一个宏,而未用到任何日志库。)里面把之前的store换成了use,这样可以减轻内存的使用,直接按行输出而不用保存。

Connection.cpp:

// 实现对数据库的增删改查
#pragma once
#include <iostream>
#include "Connection.h"
#include "public.h"//构造函数    mysql_init 函数用于初始化一个新的 MYSQL 结构体实例。这是建立数据库连接之前的准备步骤。
//分配并初始化一个新的 MYSQL 结构体,返回一个指向这个新结构体的指针;如果分配失败,返回 NULL。
Connection::Connection() {_conn = mysql_init(nullptr);
}//真正的连接
bool Connection::connect(string ip, string user, string password, string dbname, unsigned short port) {MYSQL* p = mysql_real_connect(_conn,ip.c_str(), user.c_str(), password.c_str(), dbname.c_str(), port, nullptr, 0);//.c_str() :将string转换为 const char* 类型return p != nullptr;
}//增删改,只要返回bool的一些操作
bool Connection::update(string sql) {if (mysql_query(_conn, sql.c_str())) {//当 mysql_query() 返回 0 时,表示查询语句成功执行LOG("更新失败:" + sql);return false;}return true;
}//查并返回结果,实际上就是存
MYSQL_RES* Connection::query(string sql) {if (mysql_query(_conn, sql.c_str())) {LOG("查询失败:" + sql);return nullptr;}return mysql_use_result(_conn);
}//析构函数(关闭连接)
Connection::~Connection() {if (_conn != nullptr)mysql_close(_conn);
}

Connection.h:

// 实现对数据库的增删改查
#pragma once
#include <mysql.h>
#include <string>
using namespace std;class Connection {
public:Connection();~Connection();	//析构函数(关闭连接)bool connect(string ip, string user, string password, string dbname, unsigned short port);	//真正的连接bool update(string sql);	//增删改,只要返回bool的一些操作MYSQL_RES* query(string sql);	//查并返回结果,实际上就是存private:MYSQL* _conn;
};

public.h:

#pragma once
#define LOG(str)\cout<<__FILE__<<":"<<__LINE__<<" "<<__TIMESTAMP__<<":"<<str<<endl;

main:

#include "Connection.h"int main() {Connection conn;conn.connect("localhost", "root", "password", "chat", 3306);string sql = "insert into user (name, age, sex) values ('zhang san' ,18, 'male');";conn.update(sql);
//这里没有测试queryreturn 0;
}

在这里插入图片描述
可以发现原本chat database里面user表里没有数据的,执行了该程序之后成功插入了一行数据。并且,id一开始设置成了自增字段,就没有手动指定,只插入了(name, age, sex),它会自动从1开始填。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/608693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openGauss学习笔记-189 openGauss 数据库运维-常见故障定位案例-TPCC-WAL-内存

文章目录 openGauss学习笔记-189 openGauss 数据库运维-常见故障定位案例-TPCC-WAL-内存189.1 TPCC运行时&#xff0c;注入磁盘满故障&#xff0c;TPCC卡住的问题189.1.1 问题现象189.1.2 原因分析189.1.3 处理分析 189.2 备机处于need repair(WAL)状态问题189.2.1问题现象189.…

1876_电感的特性小结

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_hardware_basic: You should learn some hardware design knowledge in case hardware engineer would ask you to prove your software is right when their hardware design is wrong! 1876_电感的特性小结 主要是…

何小鹏的「超级爆品」X9诞生背后

作者 |张祥威 编辑 |德新 小鹏汽车将X9的上市日期定在了2024年的第一天&#xff0c;也是元旦假期的最后一天。 内部选择这天上市发布&#xff0c;据HiEV了解&#xff0c;这既包含了X9要争夺纯电MPV品类销冠的寓意&#xff08;No.1&#xff09;&#xff0c;也是告诉内外部&…

加密钱包监控:守护企业资产与信誉的利器

作者&#xff1a;stellafootprint.network 随着加密资产的崛起&#xff0c;企业正在面临前所未有的监管和信誉风险。那么&#xff0c;如何才能有效掌握加密钱包的交互情况&#xff0c;以维护企业与监管机构的和谐关系呢&#xff1f; 借助强大的钱包画像分析工具&#xff0c;合…

软件测试|MySQL算术运算符使用详解

简介 MySQL是一种流行的开源关系型数据库管理系统&#xff0c;广泛用于各种应用程序和网站的数据存储和管理。在MySQL中&#xff0c;算术运算符是执行数学计算的特殊符号&#xff0c;用于处理数字类型的数据。本文将详细介绍MySQL中常用的算术运算符及其使用方法。 常用算术运…

qt初入门2:qt选择一个文件或者目录,获取当前目录,操作文件目录等整理

最近用qt操作文件或者目录的动作比较多&#xff0c;简单整理一下常用的接口&#xff0c;方便回顾。 总的来说&#xff0c;其实就是用文件选择对话框QFileDialog类&#xff0c;以及操作文件信息的QFileInfo类&#xff0c;以及相关QCoreApplication中静态成员函数获取一些信息&a…

docker部署kibana

1&#xff0c;简介 官网 kibana 2&#xff0c;安装docker 参考 linux安装docker 3&#xff0c;准备 Kibana 配置文件 # 进入主节点配置文件目录 cd /export/server/docker/kibana/config # 编辑单机版配置文件 vi kibana.ymlkibana.yml内容 # 主机地址&#xff0c;可以是…

Java后端返回的MySQL日期数据在前端格式错误的解决方法,区分jackson和fastjson

写在前面 在写web项目的时候经常会遇到后端返回的MySQL日期数据(date)类型在前端显示不正确的情况&#xff0c;有的时候会出现一串数字的时间戳&#xff0c;有的时候显示为日期晚了一天。 这是因Json给前端返回数据的时候格式问题造成的 解决方法 其实总结起来就是一句话在…

大模型笔记【2】 LLM in Flash

Apple最近发表了一篇文章&#xff0c;可以在iphone, MAC 上运行大模型&#xff1a;【LLM in a flash: Efficient Large Language Model Inference with Limited Memory】。 主要解决的问题是在DRAM中无法存放完整的模型和计算&#xff0c;但是Flash Memory可以存放完整的模型。…

代码训练营Day.28 | 93. 复原IP地址、78. 子集、90. 子集II

93. 复原IP地址 1. LeetCode链接 . - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 3. 解法 字符串切四刀&#xff0c;最后一刀必须是在末位。 麻烦的地方在于文本的各种限制条件、剪枝等等。 class Solution { public:vector<string> results;string result…

最优化理论复习--最优性条件(二)

文章目录 上一篇约束极值问题的最优性条件基本概念一般情况的约束类型最优化条件 上一篇 最优化理论分析复习–最优性条件&#xff08;一&#xff09; 约束极值问题的最优性条件 基本概念 凸规划 m i n f ( x ) min f(x) minf(x) s . t . { g i ( x ) ≥ 0 &#xff0c; …

Android Matrix (二)具体图形变换参数的获取

Android Matrix &#xff08;二&#xff09;具体图形变换参数的获取 Matrix 类在 Android 中用于表示 3x3 的变换矩阵。这个矩阵可以应用于画布&#xff08;Canvas&#xff09;&#xff0c;视图&#xff08;View&#xff09;或者位图&#xff08;Bitmap&#xff09;&#xff0…

服务器日常维护要素,应该如何做好维护

维护服务器的目的是为了让服务器的性能保持最佳状态&#xff0c;发现问题及时解决&#xff0c;没有问题也可以对相关的应用和配置进行调优。但也有很多用户疑问&#xff0c;服务器具体会有哪些方面需要维护的&#xff0c;今天就一起来看看吧。 服务器日常维护&#xff0c;主要包…

Python基础入门第九课笔记(文件和文件夹)

1&#xff0c;新建文本并且写内容 a open(1.text,w) a.write("""aaa bbb ccc""") a.close() 2,seek( )移动文件指针 文件对象.seek(偏移量&#xff0c;起始位置) # 起始位置&#xff1a;0开头&#xff0c;1当前位置&#xff0c;2文件结尾…

7+坏死性凋亡+分型+预后模型+实验,筛坏死性凋亡相关基因并建模

今天给同学们分享一篇生信文章“MLKL and other necroptosis-related genes promote the tumor immune cell infiltration, guiding for the administration of immunotherapy in bladder urothelial carcinoma”&#xff0c;这篇文章发表在Apoptosis期刊上&#xff0c;影响因子…

【新华三】IPsec VPN 实验配置(地址固定)

【新华三】IPsec VPN 实验配置&#xff08;地址固定&#xff09; 注意实验需求配置思路配置命令拓扑R1基础配置配置第一阶段 IKE SA配置第二阶段 IPsec SA ISP_R2基础配置 R3基础配置配置第一阶段 IKE SA配置第二阶段 IPsec SA PCPC1PC2 检查建立成功查看命令清除IKE / IPsec S…

分享几个网盘资源搜索地址,总能找到你想要的

目录 [TOC](目录)一、前言二、地址分享三、结尾 一、前言 分享几个网盘搜索网站&#xff0c;总能找到你想要的。 二、地址分享 盘搜搜: https://pansoso.com/ 搜网盘: https://www.swangpan.com/ fastsoso: https://www.fastsoso.cc 猫狸盘搜: https://www.alipansou.com…

虚拟机安装intel架构的银河麒麟V10(SP1)

一 背景 银河麒麟是国产操作系统之一&#xff0c;是基于Linux内核的桌面操作系统&#xff0c;有自己的应用中心&#xff0c;具有一定的生态系统。今从官网下载了V10&#xff08;SP1&#xff09;镜像文件&#xff0c;在Windowns的VMware虚拟机上安装试用。 二 安装 1、 首先安装…

【漏洞复现】锐捷RG-UAC统一上网行为管理系统信息泄露漏洞

Nx01 产品简介 锐捷网络成立于2000年1月&#xff0c;原名实达网络&#xff0c;2003年更名&#xff0c;自成立以来&#xff0c;一直扎根行业&#xff0c;深入场景进行解决方案设计和创新&#xff0c;并利用云计算、SDN、移动互联、大数据、物联网、AI等新技术为各行业用户提供场…

桶装水在线订水送水系统平台搭建

在线订水系统&#xff0c;为您带来更快捷、更优质的服务。不仅是用户福音&#xff0c;更是商家营销利器。一体化管理&#xff0c;轻松搞定用户、水站、商品、订单及售后。多种营销活动&#xff0c;激发用户复购意愿。 功能亮点如下&#xff1a; 1. 注册登录&#xff1a;手机号…