目录
使用 yum 配置 mysqld 环境
查看 mysqld 服务的版本
创建 mysql 句柄
链接数据库
使用数据库
增加数据
修改数据
查询数据
获取查询结果的行数
获取查询结果的列数
获取查询结果的列名
获取查询结果所有数据
断开链接
C语言访问mysql数据库整体源码
通过前段时间的 mysql 数据库的学习,我们知道了 mysql 数据库本质上就是一个网络服务,本期的主要内容在于讲解如何使用 C 语言相关的接口连接 mysqld 网络服务。
使用 yum 配置 mysqld 环境
centos7 版本的操作系统使用一下指令安装 mysqld 服务的配置文件。
sudo yum install mysql-devel
配置好之后,mysqld 相关的头文件在 /usr/include/mysql 目录下。我们连接 mysqld 服务时主要使用 mysql.h 头文件。
配置好后。mysqld 对应的库文件在 /usr/lib64/mysql 下。
在链接 mysqlclient 库时,需要使用 -L 字段指明库的路径。
g++ -o $@ $^ -std=c++11 -L/usr/lib64/mysql -lmysqlclient
查看 mysqld 服务的版本
- 使用 mysql_get_client_info() 函数查看 mysqld 云服务版本。
std::cout<<"client version: "<<mysql_get_client_info()<<std::endl;
作者的版本是 mysql 5.7.44 版本。
创建 mysql 句柄
- 使用 mysql_init() 函数创建 mysql 句柄。
MYSQL *my=mysql_init(nullptr);
链接数据库
- 使用 mysql_real_connect() 函数链接数据库。
#include<iostream>
#include<cstdio>
#include<mysql/mysql.h>
const std::string host="127.0.0.1";
const std::string user="jd";
const std::string password="YJD010918madeinchina...";
const std::string db="study";
const unsigned int port=8088;
int main()
{
std::cout<<"client version: "<<mysql_get_client_info()<<std::endl;
//1.创建mysql句柄
MYSQL *my=mysql_init(nullptr);
//2.链接数据库
if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0)==nullptr)
{
std::cout<<"connect failed!"<<std::endl;
return 1;
}
std::cout<<"connect success!"<<std::endl;
}
第一个参数为刚开始创建的 mysql 句柄,第二个参数为要访问的 mysqld 的 ip,第三个参数为使用哪个 mysql 用户访问数据库, 第四个参数为访问数据库的这个 mysql 用户的密码是多少,第四个参数为当前用户访问的数据库的名称,第五个参数为访问的 mysqld 的端口号,后面两个参数不需要了解。返回值为 MYSQL* 数据库句柄类型,如果为空则连接数据库失败,如果不为空则链接数据库成功。
使用数据库
数据库的使用其实就是对数据库表的使用,数据库表的使用包含四个部分数据记录的 增加,查询,修改,删除。
无论是 增加,查询,修改还是删除,都使用下面的函数进行操作。
int mysql_query(MYSQL *mysql, const char *q);
在对数据进行操作之前,我们应该先设置 mysql 句柄的编码格式。
//设置句柄的编码格式
mysql_set_character_set(my,"utf8");
增加数据
向 study 数据库中的 students 表中插入数据。
insert into students values (6,66,'张三','297599');
成功插入。
修改数据
向 study 数据库中的 students 表中修改数据。
update from students set name='李四' where id =6;
成功修改。
查询数据
查询数据是数据操作中较为复杂的一个操作,因为涉及到了将数据查询出来,并将数据显示出来。查询出来数据很简单,但是复杂的是将查询出来的数据显示出来,如何显示出来,我们需要使用 多个接口共同搭配使用将插叙出来的数据显示出来。
查询 students 表中的所有记录。
select * from students;
使用下述函数读取 mysql_query() 接口执行之后,mysql 句柄中查询的结果。
MYSQL_RES *mysql_store_result(MYSQL *mysql);
MYSQL_RES* res=mysql_store_result(my);
读取的结果存储在了 MYSQL_RES* 类型的返回值指向的特定结构体中。后续使用这个返回值获取相关的结果字段。
获取查询结果的行数
使用以下函数查询行数。
my_ulonglong mysql_num_rows(MYSQL_RES *res);
//4.2获取查询的行数
unsigned int rows = mysql_num_rows(res);
std::cout << rows << std::endl;
查询列数成功。
获取查询结果的列数
使用以下函数查询列数。
unsigned int mysql_num_fields(MYSQL_RES *res);
unsigned int fields = mysql_num_fields(res);
std::cout << fields << std::endl;
查询列数成功。
获取查询结果的列名
使用以下函数查询列名。
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
//4.3获取查询记录的每一列的列名称
MYSQL_FIELD* fields_name=mysql_fetch_field(res);
for(int i=0;i<fields;i++)
{
std::cout<<fields_name[i].name<<"\t";
}
std::cout<<std::endl;
查询结果的列名称获取成功。
获取查询结果所有数据
1.先使用以下函数获取查询结果的所有行数据。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
可以将 MYSQL_ROW 看做一个二维数组。
for(int i=0;i<rows;i++)
{
MYSQL_ROW lines=mysql_fetch_row(res);
//line[i]表示第几行的数据,直接获取是无法获取的,因为无法知道这一行数据的列数
//就相当于如果只知道二维数组的行标不知道列表也是无法访问二维数组的元素的
}
2.通过列数,然后再访问每行的每个元素,最终实现所有查询结果的访问。但是要注意,每列的元素都不应为空,否则会出现一些异常打印的问题。
基于此,对 students 中为空的字段进行修改。
std::cout << std::endl;
for (int i = 0; i < rows; i++)
{
MYSQL_ROW lines = mysql_fetch_row(res);
// line[i]表示第几行的数据,直接获取是无法获取的,因为无法知道这一行数据的列数
// 就相当于如果只知道二维数组的行标不知道列表也是无法访问二维数组的元素的
for (int j = 0; j < fields; j++)
{
std::cout << lines[j] << "\t";
}
std::cout << std::endl;
}
查询结果的所有数据获取成功。
断开链接
使用以下函数断开链接。
void mysql_close(MYSQL *sock);
free(res);
mysql_close(my);
C语言访问mysql数据库整体源码
#include <iostream>
#include <stdlib.h>
#include <string>
#include <mysql/mysql.h>
const std::string host = "127.0.0.1";
const std::string user = "jd";
const std::string password = "YJD010918madeinchina...";
const std::string db = "study";
const unsigned int port = 8088;
int main()
{
std::cout << "client version: " << mysql_get_client_info() << std::endl;
// 1.创建mysql句柄
MYSQL *my = mysql_init(nullptr);
// 2.链接数据库
if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
{
std::cout << "connect failed!" << std::endl;
return 1;
}
// 3.设置链接的编码格式
mysql_set_character_set(my, "utf8");
std::cout << "connect success!" << std::endl;
// 4.进行数据库表操作
std::string sql = "select * from students";
int code = mysql_query(my, sql.c_str());
if (code != 0)
{
std::cout << "execute: " << sql << "failed!" << std::endl;
return 2;
}
std::cout << "execute: " << sql << " success!" << std::endl;
// 4.1获取查询的结果到res中
MYSQL_RES *res = mysql_store_result(my);
// 4.2获取查询的行数
int rows = mysql_num_rows(res);
std::cout << rows << std::endl;
int fields = mysql_num_fields(res);
std::cout << fields << std::endl;
// 4.3获取查询记录的每一列的列名称
MYSQL_FIELD *fields_name = mysql_fetch_field(res);
for (int i = 0; i < fields; i++)
{
std::cout << fields_name[i].name << "\t";
}
// 4.4获取查询结果的每一行的数据
std::cout << std::endl;
for (int i = 0; i < rows; i++)
{
MYSQL_ROW lines = mysql_fetch_row(res);
// line[i]表示第几行的数据,直接获取是无法获取的,因为无法知道这一行数据的列数
// 就相当于如果只知道二维数组的行标不知道列表也是无法访问二维数组的元素的
for (int j = 0; j < fields; j++)
{
std::cout << lines[j] << "\t";
}
std::cout << std::endl;
}
//5.断开链接
mysql_close(my);
}
至此,C语言链接数据库的操作全部完成。
本期内容到此结束^_^