使用C/C++语言链接Mysql详解

链接mysql数据库的方式有很多,用命令行链接、用图形化界面链接、 用编程语言链接,上一篇文章我们已经学习如何创建访问数据库的账号,现在就让我们一起来发挥它的作用吧!

1.使用编程语言链接

首先,我们的数据库服务端在我们的xshell中,而我们使用了vscode将我们的xshell和vscode链接在了一起,所以我们现在通过vscode来使用语言访问数据库,就得想办法实现将之前在xshll的mysql中通过sql语句对数据库里面的内容进行增删查改的操作转为使用语言了,其实我们的vscode就相当于我们在xshell中使用的vim;

好了现在我们开始学习怎么使用编程语言来对我们的数据库进行操作吧;

1.1前期准备

1.1.1 头文件

我们在后面敲的代码中的链接mysql的接口函数都有对应的头文件,常见的头文件如下,在代码中需要包含

查看头文件的bash语句

1.1.2 库和函数

在我们写makefile文件中需要有对应的库文件名;

库的安装

安装 MySQL C/C++ 开发库的主要作用是让你能够在 C/C++ 程序中连接和操作 MySQL 数据库 。简单来说,它为你提供了编程接口;

bash 复制代码
sudo apt install libmysqlclient-dev

1.1.3 库和头文件的对应关系

1.2初始化

比如现在我们要访问mysql中的一个名为conn的数据库,首先我们要做的是初始化;针对这种现象mysql为我们提供了特定的接口;(这些函数可以在mysql官方文档中查到)

为什么要初始化库

什么是API

1.3 链接数据库

1.4 对数据库进行操作

有了这个语句我们就可以实现对数据库的内表的插入内容和删除内容了

cpp 复制代码
 std::string sql ="insert into user (name,age,telephone) values ('张三',14,'1234444')";
      int n = mysql_query(my,sql.c_str());
      if(n==0)
      {
        std:: cout << sql << "success" <<std::endl;
      }  
      else
      {
         std:: cout << sql << "failed" <<std::endl;
      }

但是最复杂的不是这两个操作,而是怎么样将我们的select到的内容呈现在我们客户端上;

这就需要一个新的接口了

首先我们的数据其实缓存在my结构体中,也就是我们最开始初始化的结构体,后来通过上面的函数mysql_store_result,它可以实现将我们的数据回调到我们的应用层上;他的返回类型是MYSQL_RES *;

cpp 复制代码
 MYSQL_RES * res = mysql_store_result(my);

      if(res==nullptr)

      {

        std::cerr<< "mysql_store_result error" << std::endl;

        return 4;

      }

但是上面的函数只是实现了对我们的数据回调的操作,将数据呈现在我们应用层还是没有实现以表格的形式呈现我我们的数据;

这就需要两个新的函数了,分别是mysql_num_rows( 呈现表中行上的一个个数据),**mysql_num_fields(**呈现表中列上的一个个数据),

cpp 复制代码
my_ulonglong rows =mysql_num_rows(res);
      my_ulonglong fields=mysql_num_fields(res);
      
      std::cout<< "行:" << rows << std::endl;
      std::cout <<"列:" <<  fields << std::endl;
      //属性
      MYSQL_FIELD * fields_array = mysql_fetch_fields(res);

      for(int i=0 ;i<fields;i++)
      {
         std::cout<< fields_array[i].name << "\t";
      }
      std::cout<< "\n";

      
      for(int i=0 ;i<rows; i++)
      {
          MYSQL_ROW row =mysql_fetch_row(res);   //fetch可以看作迭代器;
          for(int j=0; j<fields; j++)
          {
              std::cout << row[j] << "\t";
          }
          std:: cout<< "\n" ;

      }

不要忘记my_stroe_result中的数据需要释放

cpp 复制代码
 mysql_free_result(res);

除了表格中的数据,我们还要得到属性,使用下面的函数;

cpp 复制代码
 MYSQL_FIELD * fields_array = mysql_fetch_fields(res);

mysql_field中存储表格的属性很多,我们现在只访问name,但是这个数据也是一个一个需要遍历;

5.关闭数据库

cpp 复制代码
   mysql_close(my);  //close 的参数就是我们刚才初始化的指针

1.5.编码格式不一致问题

所有的乱码问题一定是客户端和服务器因为编码问题没有形成一致;

1.6完整实现代码

cpp 复制代码
#include <iostream>
#include <mysql/mysql.h>  
#include <string>
const std::string host="127.0.0.1";
const std::string user ="gy";
const std::string passwd ="123456";
const std::string db = "conn";
const unsigned int port = 3306;

//测试库有没有引入成功
int main()
{
    std::cout<<"mysql client version"<< mysql_get_client_info()<<std::endl;

    //初始化
    MYSQL *my =mysql_init(nullptr);
    mysql_set_character_set(my,"utf8mb4");
    if(nullptr == my)
    {
        std::cerr<<"init Mysql error" <<std::endl;
        return 1;
    }

    //连接
    if(mysql_real_connect(my,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,0)==nullptr)
    {
        std::cerr<< "connect Mysql error"<<mysql_error(my)<<std::endl;
        return 2;
    }


    //操作

    //向mysql下达sql指令
    //获取用户的sql语句
      //std::string sql = "update user set name='jimmy' where id=1";
      // std::string sql = "insert into user (name,age,telephone) values ('张三',14,'1234444')";
      std::string sql ="insert into user (name,age,telephone) values ('张三',14,'1234444')";
      int n = mysql_query(my,sql.c_str());
      if(n==0)
      {
        std:: cout << sql << "success" <<std::endl;
      }  
      else
      {
         std:: cout << sql << "failed" <<std::endl;
      }
      MYSQL_RES * res = mysql_store_result(my);
      if(res==nullptr)
      {
        std::cerr<< "mysql_store_result error" << std::endl;
        return 4;
      }
      
      my_ulonglong rows =mysql_num_rows(res);
      my_ulonglong fields=mysql_num_fields(res);
      
      std::cout<< "行:" << rows << std::endl;
      std::cout <<"列:" <<  fields << std::endl;
      //属性
      MYSQL_FIELD * fields_array = mysql_fetch_fields(res);

      for(int i=0 ;i<fields;i++)
      {
         std::cout<< fields_array[i].name << "\t";
      }
      std::cout<< "\n";

      
      for(int i=0 ;i<rows; i++)
      {
          MYSQL_ROW row =mysql_fetch_row(res);   //fetch可以看作迭代器;
          for(int j=0; j<fields; j++)
          {
              std::cout << row[j] << "\t";
          }
          std:: cout<< "\n" ;

      }

      mysql_free_result(res);
       


    mysql_close(my);  //close 的参数就是我们刚才初始化的指针
    return 0;
}
相关推荐
代码什么用5 分钟前
Spring对IoC的实现
数据库·spring
程序员老陆7 分钟前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
hz567892 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC2 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
程序员Sunday2 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
半杯咖啡半行码3 小时前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
Yyyyyy~3 小时前
[ Mysql ] 库的操作
mysql
小米里的大麦3 小时前
16 MySQL 事务
数据库·mysql
西柚小萌新3 小时前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库
Titan20243 小时前
MySQL访问个人学习笔记
笔记·学习·mysql