链接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;
}
