MySQL--C_C++语言连接访问

news2024/11/14 21:58:27

Connector/C的使用

首先需要在mysql官网下载C接口库

解压指令

tar -zxvf 压缩包名

下载并解压好后

 但是还有比这更优的做法。

这样子手动安装不仅麻烦,还可能存在兼容性的问题。

其实在我们使用yum安装mysql时,大概率会自动帮我们把其他的环境都安装下来并配置好

sudo yum install -y mysql-community-server

如果没有安装好,那么我们也可以单独安装

yum install myslq-devel

安装好后,查看

ls /usr/include/mysql

可以看到头文件就都在默认的搜索目录下了

那么我们就可以开始写代码了,注意包含头文件的方式

简单使用 

#include <iostream>
#include <mysql/mysql.h>

int main()
{
    printf("mysql client Version: %s\n", mysql_get_client_info());
    return 0;
}

makefile

test:test.cc
	g++ -o $@ $^ -std=c++11 -L/lib64/mysql -lmysqlclient

.PHONY:clean

clean:
	rm -f test

编译指令记得指明库所在的位置以及指明需要链接哪个库 

-I(大写的i),在编译时可以告诉g++我们的头文件位置在哪里,这样的话我们包头文件可以直接包。

运行结果

ldd ./test

 可以查看这个程序链接了那些库

用C_C++进行增删改

首先我们需要创建一个MYSQL对象,并对它进行初始化,并在不用的时候记得释放。 

然后因为mysql是网络服务(基于TCP/IP的)。因此我们需要先链接

链接接口的使用:

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);

//后两个字段可以设置为nullptr和0

//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");

示例:

#include <iostream>
#include <string>
#include <mysql/mysql.h>
#include <unistd.h>

const std::string host = "127.0.0.1";
const std::string user = "chika";
const std::string password = "3412741074";
const std::string db = "test_db";
const int port = 3306;

int main()
{
    //printf("mysql client Version: %s\n", mysql_get_client_info());
    MYSQL* my = mysql_init(nullptr);
    if(nullptr == my)
    {
        std::cerr << "init MYSQL error" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0) == nullptr)
    {
        std::cerr << "mysql connect error" << std::endl;
        return 2;
    }

    std::cout<< "mysql connect success" << std::endl;
    sleep(5);

    mysql_close(my);
    return 0;
}

记得事先将自己的mysql服务启动。另外ip地址我们用的是本地环回地址,如果是本地链接,也可以改为 "localhost" 。

在mysql这边,我们可以用

show processlist;

来查看当前mysql的链接情况。

 首先我们先在本地mysql上创建一张测试表

create table test(
    id int primary key auto_increment,
    name varchar(25) not null,
    qq varchar(30)
    );

 mysql_query()可以向mysql使其执行增删改查操作。

int mysql_query(MYSQL *mysql, const char *query);

第一个参数就是我们创建的mysql对象,第二个参数就是我们将要执行的命令。并且,这个命名是可以不带 ; 的。

成功返回0,失败返回非0值。

比如我们插入一条数据

#include <iostream>
#include <string>
#include <mysql/mysql.h>
#include <unistd.h>

const std::string host = "127.0.0.1";
const std::string user = "chika";
const std::string password = "3412741074";
const std::string db = "test_db";
const int port = 3306;

int main()
{
    //printf("mysql client Version: %s\n", mysql_get_client_info());
    MYSQL* my = mysql_init(nullptr);
    if(nullptr == my)
    {
        std::cerr << "init MYSQL error" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0) == nullptr)
    {
        std::cerr << "mysql connect error" << std::endl;
        return 2;
    }
    //设置好utf8编码,防止中文乱码
    mysql_set_character_set(my, "utf8");
    
    std::string sql = "insert into test1 (name,qq) values('李三光','123456')";
    int n = mysql_query(my,sql.c_str());
    if(n == 0) std::cout << "success" << std::endl;
    else std::cout << "sql error" << std::endl;

    mysql_close(my);
    return 0;
}

makefile

test:test.cc
	g++ -o $@ $^ -std=c++11 -L/lib64/mysql -lmysqlclient

.PHONY:clean
clean:
	rm -f test

 编译并执行后

 此时看看表中的数据

 发现成功的插入进来了。

那么删除和修改也是同一个道理,就不重复演示了。

另外增删改是最简单的,因为我们只需要看到执行结果就可以了。但是查询是最复杂的,我们不仅要确保执行成功,还要将结果打印出来,处理比较麻烦。 

查询的细节 

前面说了,我们查询的话,还需要将结果打印出来,那么这个结果其实是保存在第一个参数,也就是那个结构体里面的。

此时还需要用到一个函数

mysql_store_result() 

如果 mysql_query 返回成功,那么我们就通过mysql_store_result这个函数来读取结果。原型如下:
MYSQL_RES *mysql_store_result(MYSQL *mysql);

该函数会调用 MYSQL 变量中的 st_mysql_methods 中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数 malloc 了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result), 不然是肯定会造成内存泄漏的。 执行完mysql_store_result 以后,其实数据都已经在 MYSQL_RES 变量中了,下面的 api 基本就是读取MYSQL_RES 中的数据。

获取结果行数mysql_num_rows

my_ulonglong mysql_num_rows(MYSQL_RES *res);

 获取结果列数mysql_num_fields

unsigned int mysql_num_fields(MYSQL_RES *res);

 获取列名mysql_fetch_fields

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

 示例:
 

int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
int i = 0;
for(; i < fields; i++){
cout<<field[i].name<<" ";
}
cout<<endl;

接着就是要获取表的内容信息,并打印出来

获取结果内容 mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

 它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。

示例: 

i = 0;
MYSQL_ROW line;
for(; i < nums; i++){
line = mysql_fetch_row(res);
int j = 0;
for(; j < fields; j++){
cout<<line[j]<<" ";
}
cout<<endl;
}

在mysql中,我们每次查询出来的结果都是一个表结构,但这其实是被处理过后的结果。每次查询,mysql会先将所有的数据读取出来后,转化成字符串。

所以MYSQL_RES可以想象成一个三维数组,没一行代表的是表中的每一行信息。

每一个元素就是一个char**,它们又指向了char*,char*则最终指向了该表中某行某列的结果。 

 这个是跟表的内容相关的。

MYSQL_FIELD跟表的属性相关,它也是一个结构体。

在我们使用完了这个结果集之后,记得将其free掉。

mysql_free_result()函数就是这些API函数之一,其主要用途是释放一个MYSQL_RES结构所占用的内存。

void mysql_free_result(MYSQL_RES *result);

 浅谈一下mysql连接池

 我们知道mysql是网络服务,那么其他客户端想让mysql执行命令时需要先进行链接,为了提高效率,我们可以创建一个连接池,连接池里面有多个线程,每一个线程管理着一个mysql对象(已连接好mysqld的),然后循环等待任务。然后用户想进行操作时,就只需要打包一个task任务结构体,交给连接池,连接池把这个任务放在队列里面,让空闲的线程取走,把里面的sql交给musql执行。就是生产者消费者模型。这样就避免了每次sql都要重新建立链接的操作。

  另外关于查询,在task结构体里面可以设置一个回调函数,如果这是一个查询sql,那么可以通过这个回调函数把结果拿回来,这个回调函数是由用户这边设置好的。

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

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

相关文章

【大模型LLM面试合集】大语言模型基础_NLP面试题

NLP面试题 1.BERT 1.1 基础知识 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是谷歌提出&#xff0c;作为一个Word2Vec的替代者&#xff0c;其在NLP领域的11个方向大幅刷新了精度&#xff0c;可以说是近年来自残差网络最优突破性的…

分享一个项目模板electron+vue+ts+vite

分享一个项目模板electronvuetsvite GitHub - xiugou798/electron-vue-ts-vite-template: electron-vue-ts-vite-templateelectron-vue-ts-vite-template. Contribute to xiugou798/electron-vue-ts-vite-template development by creating an account on GitHub.https://gith…

C++的异常处理机制

C的异常处理机制 (1)Why&#xff08;异常处理机制的作用&#xff09;(2)How&#xff08;异常机制如何工作&#xff09;A.抛出异常B.捕获异常C.处理异常D.传递异常 (3)抛出异常A.栈展开B.析构函数和异常C.异常对象 (4)捕获异常(4)处理异常A.构造函数的异常处理B.不抛出异常noexc…

【SWMM】模型概述及软件安装

SWMM模型概述及软件安装 SWMM 模型 &#xff08;Storm Water Management Model&#xff09;概述应用 软件安装及下载参考 暴雨管理模型 &#xff08;Storm Water Management Model&#xff0c;SWMM 模型&#xff09;是美国环保局为解决日益严重的城市排水问题而推出的暴雨径流管…

凌风云 - 十大网盘资源搜索 Ver 6.0 版正式上线

《凌风云》作为网盘资源专业搜索领域的佼佼者&#xff0c;汇聚了国内十大网盘的丰富资源&#xff0c;凌风云搜索弥补其他搜索引擎可能无法搜索到相关资源的缺陷&#xff0c;作为专业的搜索引擎服务网络平台&#xff0c;您只需输入关键词&#xff0c;通过智能算法精准匹配&#…

C++的介绍与认识

目录 前言 1.什么是C 2.C的发展历史 3.C参考文档 4.C重要性 4.1C特点 4.2编程语言排行榜 4.3 C的应用领域 5.C学习指南 1. 基础知识 2. 面向对象编程&#xff08;OOP&#xff09; 3. 泛型编程 4. 标准库&#xff08;STL&#xff09; 结束语 前言 学习了C语言的知识…

使用mid360进行fast_lio建图、octomap生成栅格地图

前面我已经实现了fast_lio建图并使用octomap转为三维栅格地图&#xff0c;今天来填上次留的坑 使用Livox-Mid360激光雷达&#xff0c;复现FAST_LIO&#xff08;保姆级教程&#xff09;-CSDN博客 这是我上次写的&#xff0c;来复现上次失败的&#xff0c;这个教程&#xff1a;…

【PHP安装内置扩展】

PHP安装内置扩展 1、首先查看php源码以及查询是否有需要的扩展;本次以zlib扩展为例子 2、进入需要安装的扩展目录,执行命令 cd zlib 执行 make clean 清掉之前的安装的残留文件; 不需要的话直接略过,新安装也略过3、运行phpize,执行/usr/local/php/bin/phpize 注意这个路径一…

设计分享—国外后台界面设计赏析

国外后台界面设计将用户体验放在首位&#xff0c;通过直观易懂的布局和高效的交互设计&#xff0c;提升用户操作效率和满意度。 设计不仅追求美观大方&#xff0c;还注重功能的实用性和数据的有效展示&#xff0c;通过图表和图形化手段使数据更加直观易懂。 采用响应式布局&a…

Windows 部署ollama

一、简介 Ollama是在Github上的一个开源项目&#xff0c;其项目定位是&#xff1a;一个本地运行大模型的集成框架&#xff0c;目前主要针对主流的LLaMA架构的开源大模型设计&#xff0c;通过将模型权重、配置文件和必要数据封装进由Modelfile定义的包中&#xff0c;从而实现大模…

[GICv3] 3. 物理中断处理(Physical Interrupt Handling)

中断生命周期 ​​ 外设通过中断信号线生成中断&#xff0c;或者软件生成中断&#xff08;SGI&#xff09;。Distributor 和 ReDistributor 配合按照中断分组和中断优先级仲裁后将最高优先级的中断分发到 CPU interface。cpu interface 向中断发送到 PEPE 读取 IAR 寄存器&am…

队列+二叉树广度优先

题目出自力扣-n叉树的层序遍历 我是原始人&#xff0c;递归写出一道题就只有递归思路&#xff0c;开始的想法是写深搜函数&#xff0c;传一个随着层数递增的int参数q&#xff0c;节点空就return&#xff0c;否则遍历所有节点&#xff0c;每个子节点又以q1为层数递归&#xff…

Postman工具基本使用

一、安装及基本使用 安装及基本使用参见外网文档&#xff1a;全网最全的 postman 工具使用教程_postman使用-CSDN博客 建议版本&#xff1a;11以下&#xff0c;比如10.x.x版本。11版本以后貌似是必须登录使用 二、禁止更新 彻底禁止postman更新 - 简书 host增加&#xff1…

15.x86游戏实战-汇编指令jmp call ret

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

从零开始学习嵌入式----Linux系统中shell脚本

目录 Shell脚本入门&#xff1a;玩转功能语句和数组&#xff0c;提升你的效率&#xff01; 一、功能语句&#xff1a;让你的脚本更灵活 1. 条件语句&#xff1a;if、else、elif 2. 循环语句&#xff1a;for、while 二、数组&#xff1a;处理多项数据的好帮手 1. 声明数组…

程序员学长 | PyCaret,一个超强的 python 库

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;PyCaret&#xff0c;一个超强的 python 库 今天给大家分享一个超强的 python 库&#xff0c;PyCaret。 https://github.com/pycaret/pycaret 简介 …

力扣 160相聚链表

注意 判断是否有交点 用while(A! B) 其中A A nullptr? headb:A->next;B同理 注意&#xff0c;while循环的退出条件是AB指针指向同一个&#xff0c;如果没有相交&#xff0c;仍然可以退出 当AB都为NULLPTR时退出

包成功安装tiny-cuda-nn,记录安装过程中的问题解决,附带pytorch3d安装【踩坑指南】

tiny-cuda-nn安装过程中的问题解决&#xff0c;附带pytorch3d安装【踩坑指南】 前言tiny-cuda-nn第一种下载方法&#xff1a;命令行安装tiny-cuda-nn第二种下载方法&#xff1a;本地编译 pytorch3d安装 前言 official repo: https://github.com/NVlabs/tiny-cuda-nn 该包可以显…

【记录】LaTex|LaTex 代码片段 Listings 添加带圆圈数字标号的箭头(又名 LaTex Tikz 库画箭头的简要介绍)

文章目录 前言注意事项1 Tikz 的调用方法&#xff1a;newcommand2 标号圆圈数字的添加方式&#xff1a;\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭头写法&#xff1a;插入点相对位移标号node3.1 第一张图&#xff1a;插入点相对位移3.2 第二张图&#xff1…

(2024,测试时训练(TTT),线性注意力,RNN,嵌套循环)学习(在测试时学习):具有表达性隐藏状态的 RNN

Learning to (Learn at Test Time): RNNs with Expressive Hidden States 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. 方法 2.1 使用 TTT 更新隐藏状态 2.2 …