文章目录
🌈 一、引入 MySQL 库
⭐ 1. 下载库文件
- 进入下载界面:[MySQL 官网]:MySQL :: MySQL Community Downloads,然后选择 CAPI 这一个选项。
- 再选择人家推荐得那个版本即可。
- 选择适合自己平台的,然后下载即可。
⭐ 2. 上传库文件
- 将刚刚下下来的解压包上传到 Linux 服务器上,可以专门建一个 third_part_lib 目录用于存储这些第三方库,
- 将下好的文件直接使用
rz -E
上传到云服务器上。
- 再将压缩包使用
tar -xzf
命令进行解压。
- 如果觉得解压之后的文件名太长了也可以换个名字,我这里是改成了 mysql-connector。
⭐ 3. 引用库文件
- 在刚刚解压出来的 mysql-connector 目录中,有两个目录是最重要的。
- include 目录下存放着各种头文件。
- lib 目录下存放着所需的动静态库。
- 为了项目能够方便的使用这两个目录中的文件,可在项目目录下使用软链接的方式链接到 include 和 lib 这两个目录。
⭐ 4. 验证是否引入成功
- 通过调用
mysql_get_client_info
来判断库是否引入成功,该函数的作用就是获取客户端的版本信息。
// 文件名 test.cpp#include<mysql.h>#include<iostream>usingnamespace std;intmain(){
cout <<"mysql client version: "<<mysql_get_client_info()<< endl;return0;}
- 对该文件进行编译,编译完成后再运行形成的 .exe 可执行程序,如果能成功显示客户端的版本信息则说明库引入成功。
g++ -o test.exe test.cpp -I./include -L./lib -lmysqlclient
🌈二、MySQL 接口介绍
⭐ 1. 初始化
- 要使用库,得先使用
mysql_init()
进行初始化构建一个 MySQL 对象。
MYSQL* 对象名 =mysql_init(MYSQL *mysql);
- 该函数用来分配或初始化一个 MySQL 对象,用于连接 MySQL 服务器。
- 如果传入得参数是个空指针,则 mysql_init 函数会自动分配一个 MySQL 对象并返回。
- 如果传入得参数是一个地址,则 mysql_init 会在该地址处完成初始化。
⭐2. 连接数据库
MYSQL *mysql_real_connect(
MYSQL *mysql,// mysql_init 函数创建的 MySQL 对象constchar*host,// 需要连接的 MySQL 主机的 ip 地址,"127.0.0.1" 表示本机地址constchar*user,// 连接 MySQL 服务器时,所使用的用户的用户名constchar*passwd,// 连接 MySQL 服务器时,对应用户的用户密码constchar*db,// 连接 MySQL 服务器后,所要使用的数据库unsignedint port,// 连接的 MySQL 服务器所对应的端口号constchar*unix_socket,// 连接时应该使用的套接字或命名管道,通常设置为 空指针unsignedlong clientflag);// 标志位组合,表示允许特定的功能,通常被置为 0
- 如果数据库连接成功,则返回一个MySQL 对象,该对象与第一个参数的值相同。
- 如果连接失败,则返回空指针
NULL / nullptr
。
举个栗子
- 如果运行下面的代码之后能够成功显示 “数据库连接成功” 这几个字就说明连接成功了。
#include<mysql.h>#include<iostream>using std::cerr;using std::cout;using std::endl;using std::string;const string host ="127.0.0.1";// 主机 ipconst string user ="connector";// 用户名const string passwd ="123456";// 用户密码const string db ="conn";// 数据库constint port =3306;// 端口号intmain(){// 初始化一个 MYSQL 对象
MYSQL *mfp =mysql_init(nullptr);if(nullptr== mfp){
cerr <<"init MySQL error"<< endl;return1;}// 连接数据库if(nullptr==mysql_real_connect(mfp, host.c_str(), user.c_str(),
passwd.c_str(), db.c_str(), port,nullptr,0)){
cerr <<"数据库连接失败"<< endl;return2;}
cout <<"数据库连接成功"<< endl;// 断连数据库mysql_close(mfp);return0;}
⭐ 3. 关闭数据库连接
voidmysql_close(MYSQL *sock);
- 与数据库交互完毕后,需要关闭数据库连接。
- sock 是使用 mysql_init 创建得 MYSQL 对象,如果传入得 MYSQL 对象是 由mysql_init 创建的,那么调用 mysql_close 就会释放该对象。
⭐ 4. 设置编码格式
- 连接完数据库后,还要统一客户端和服务器的编码格式,避免在数据交互过程中出现乱码的情况。
intmysql_set_character_set(MYSQL *mysql,constchar*csname);
- mysql:该参数表示 MYSQL 对象
- csname:该参数表示要设置的编码格式 (如 utf8 这种)。
- 返回值为 0 则表示设置成功,其他则为设置失败。
⭐ 5. 发送 sql 指令
- 在与数据库建立了连接之后,可以使用下面的指令向数据库对象发送 sql 指令。
intmysql_query(MYSQL *mysql,constchar*q);
- mysql:该参数表示 MYSQL 对象
- q:该参数表示要执行的 sql 语句 (这里的 sql 可不带分号)。
- 返回值为 0 则表示 sql 执行成功,反之则表示执行失败。
准备测试表
- 在 conn 数据库中创建一张名为 user 的表,表中包含用户 id、姓名 name、年龄 age、电话 telphone 这四个字段。 - 之后的操作都是基于这张表进行的。
🌙 5.1 向数据库表中插入数据
- 在调用
mysql_query
函数时,向 MySQL 服务器发送一条 insert 语句。
#include<mysql.h>#include<iostream>using std::cerr;using std::cout;using std::endl;using std::string;const string host ="127.0.0.1";// 主机 ipconst string user ="connector";// 用户名const string passwd ="123456";// 用户密码const string db ="conn";// 数据库constint port =3306;// 端口号intmain(){// 初始化一个 MYSQL 对象
MYSQL *mfp =mysql_init(nullptr);if(nullptr== mfp){
cerr <<"init MySQL error"<< endl;return1;}// 连接数据库if(nullptr==mysql_real_connect(mfp, host.c_str(), user.c_str(),
passwd.c_str(), db.c_str(), port,nullptr,0)){
cerr <<"数据库连接失败"<< endl;return2;}
cout <<"数据库连接成功"<< endl;// 设置编码集if(0!=mysql_set_character_set(mfp,"utf8")){
cerr <<"编码集设置失败"<< endl;return3;}/* ---------- 看这里 ---------- */// 发送 sql 请求const string sql ="insert into user values (1, '张三', 18, '12355667788')";if(0!=mysql_query(mfp, sql.c_str())){
cerr <<"插入数据失败"<< endl;return4;}
cout <<"插入数据成功"<< endl;// 断连数据库mysql_close(mfp);return0;}
- 运行这段代码之后,能看到 MySQL 中的 user 表确实多出了这么一行数据。
🌙 5.2 修改数据库表中的数据
- 在调用
mysql_query
函数时,向 MySQL 服务器发送一条 update 语句。 - 例:将张三的名字改成李四
#include<mysql.h>#include<iostream>using std::cerr;using std::cout;using std::endl;using std::string;const string host ="127.0.0.1";// 主机 ipconst string user ="connector";// 用户名const string passwd ="123456";// 用户密码const string db ="conn";// 数据库constint port =3306;// 端口号intmain(){// 初始化一个 MYSQL 对象
MYSQL *mfp =mysql_init(nullptr);if(nullptr== mfp){
cerr <<"init MySQL error"<< endl;return1;}// 连接数据库if(nullptr==mysql_real_connect(mfp, host.c_str(), user.c_str(),
passwd.c_str(), db.c_str(), port,nullptr,0)){
cerr <<"数据库连接失败"<< endl;return2;}
cout <<"数据库连接成功"<< endl;// 设置编码集if(0!=mysql_set_character_set(mfp,"utf8")){
cerr <<"编码集设置失败"<< endl;return3;}/* ---------- 看这里 ---------- */// 发送 sql 请求const string sql ="update user set name = '李四' where id = 1";if(0!=mysql_query(mfp, sql.c_str())){
cerr <<"修改数据失败"<< endl;return4;}
cout <<"修改数据成功"<< endl;// 断连数据库mysql_close(mfp);return0;}
- 运行这段代码之后,再查看 user 表,发现张三的名字确实变成李四了。
🌙 5.3 删除数据库表中的数据
- 在调用
mysql_query
函数时,向 MySQL 服务器发送一条 delete 语句。
#include<mysql.h>#include<iostream>using std::cerr;using std::cout;using std::endl;using std::string;const string host ="127.0.0.1";// 主机 ipconst string user ="connector";// 用户名const string passwd ="123456";// 用户密码const string db ="conn";// 数据库constint port =3306;// 端口号intmain(){// 初始化一个 MYSQL 对象
MYSQL *mfp =mysql_init(nullptr);if(nullptr== mfp){
cerr <<"init MySQL error"<< endl;return1;}// 连接数据库if(nullptr==mysql_real_connect(mfp, host.c_str(), user.c_str(),
passwd.c_str(), db.c_str(), port,nullptr,0)){
cerr <<"数据库连接失败"<< endl;return2;}
cout <<"数据库连接成功"<< endl;// 设置编码集if(0!=mysql_set_character_set(mfp,"utf8")){
cerr <<"编码集设置失败"<< endl;return3;}/* ---------- 看这里 ---------- */// 发送 sql 请求const string sql ="delete from user where id = 1";if(0!=mysql_query(mfp, sql.c_str())){
cerr <<"删除数据失败"<< endl;return4;}
cout <<"删除数据成功"<< endl;// 断连数据库mysql_close(mfp);return0;}
⭐ 6. 获取查询结果
- 对数据库中的数据进行 增删改 操作时,只要调用 mysql_query 成功即可。
- 而对数据库中的数据进行 查询 操作时,除了调用 mysql_query 函数,还需要能够获取 MySQL 返回的这些数据。
- 当 mysql_query 函数成功执行 select 语句时,可以使用下面的函数获取查询结果。 - 之后的四种查询结果都是根据该函数的返回值确定的。
MYSQL_RES*mysql_store_result(MYSQL *mysql);
- 该函数会调用指定 MYSQL 对象中对应的函数指针来获取查询结果,并将获取到的查询结果保存到 MYSQL_RES 变量中进行返回。
MYSQL_RES 的内容
- 该结构体会以行里的形式将查询的数据保存起来。
typedefstructst_mysql_res{
my_ulonglong row_count;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;unsignedlong*lengths;/* column lengths of current row */
MYSQL *handle;/* for unbuffered reads */conststructst_mysql_methods*methods;
MYSQL_ROW row;/* If unbuffered read */
MYSQL_ROW current_row;/* buffer to current row */
MEM_ROOT field_alloc;unsignedint field_count, current_field;
my_bool eof;/* Used by mysql_fetch_row *//* mysql_stmt_close() had to cancel this result */
my_bool unbuffered_fetch_cancelled;void*extension;} MYSQL_RES;
🌙 6.1 获取查询结果的行数
my_ulonglong mysql_num_rows(MYSQL_RES *res);
- 该函数会从指定的 MYSQL_RES 对象中,获取查询结果的行数。
🌙 6.2 获取查询结果的列数
unsignedintmysql_num_fields(MYSQL_RES *res);
- 该函数会从指定的 MYSQL_RES 对象中,获取查询结果的列数
🌙 6.3 获取查询结果的列属性
MYSQL_FIELD*mysql_fetch_fields(MYSQL_RES *res);
- 该函数会从指定 MYSQL_RES 对象中,获取查询结果的列名。
MYSQL_FIELD 的内容
typedefstructst_mysql_field{char*name;/* Name of column */char*org_name;/* Original column name, if an alias */char*table;/* Table of column if column was a field */char*org_table;/* Org table name, if table was an alias */char*db;/* Database for table */char*catalog;/* Catalog for table */char*def;/* Default value (set by mysql_list_fields) */unsignedlong length;/* Width of column (create length) */unsignedlong max_length;/* Max width for selected set */unsignedint name_length;unsignedint org_name_length;unsignedint table_length;unsignedint org_table_length;unsignedint db_length;unsignedint catalog_length;unsignedint def_length;unsignedint flags;/* Div flags */unsignedint decimals;/* Number of decimals in field */unsignedint charsetnr;/* Character set */enumenum_field_types type;/* Type of field. See mysql_com.h for types */void*extension;} MYSQL_FIELD;
🌙 6.4 获取查询结果的内容
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
- 该函数会从指定的 MYSQL_RES 对象中,获取查询结果中的单行数据。
- 该函数的返回值实际上就是个二维数组,数组中保存着这一行中每一列的数据。
🌙 6.5 获取查询结果示例
- 先往表中插入三条记录,方便之后的查询。
#include<mysql.h>#include<iostream>using std::cerr;using std::cout;using std::endl;using std::string;const string host ="127.0.0.1";// 主机 ipconst string user ="connector";// 用户名const string passwd ="123456";// 用户密码const string db ="conn";// 数据库constint port =3306;// 端口号intmain(){// 初始化一个 MYSQL 对象
MYSQL *mfp =mysql_init(nullptr);if(nullptr== mfp){
cerr <<"init MySQL error"<< endl;return1;}// 连接数据库if(nullptr==mysql_real_connect(mfp, host.c_str(), user.c_str(),
passwd.c_str(), db.c_str(), port,nullptr,0)){
cerr <<"数据库连接失败"<< endl;return2;}
cout <<"数据库连接成功"<< endl;// 设置编码集if(0!=mysql_set_character_set(mfp,"utf8")){
cerr <<"编码集设置失败"<< endl;return3;}// 发送 sql 请求const string sql ="select * from user";if(0!=mysql_query(mfp, sql.c_str())){
cerr <<"查询数据失败"<< endl;return4;}
cout <<"查询数据成功"<< endl;// 获取查询结果
MYSQL_RES *res =mysql_store_result(mfp);if(nullptr== res){
cerr <<"调用 mysql_store_result 函数失败"<< endl;return5;}
my_ulonglong rows =mysql_num_rows(res);// 获取查询结果的行数
my_ulonglong cols =mysql_num_fields(res);// 获取查询结果的列数
MYSQL_FIELD *fields =mysql_fetch_field(res);// 获取每一列的列明for(size_t i =0; i < cols; i++)// 打印所有的列名
cout << fields[i].name <<"\t";
cout << endl;for(size_t i =0; i < rows; i++){
MYSQL_ROW row =mysql_fetch_row(res);// 获取第 i 行的数据for(size_t j =0; j < cols; j++)// 打印获取到的这行的第 j 列的数据
cout << row[j]<<"\t";
cout << endl;}free(res);//释放内存空间// 断连数据库mysql_close(mfp);return0;}
- 运行上述代码之后的结果如下:
本文转载自: https://blog.csdn.net/shangguanxiu/article/details/141612583
版权归原作者 ♬咖啡猫♬ 所有, 如有侵权,请联系我们删除。
版权归原作者 ♬咖啡猫♬ 所有, 如有侵权,请联系我们删除。