环境:5.7.42-0ubuntu0.18.04.1 (Ubuntu)
mysql接口介绍
初始化mysql指针
用来生成MySQL对象,返回值为MySQL*,MySQL*是MySQL对象的指针。
MySQL在mysql.h中是一个结构体
链接数据库
初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的)
- 第一个参数,填之前初始化的MySQL*指针
- 第二个参数,填要连接的主机IP地址,如果主机为 NULL 或字符串“localhost”,则假定连接到本地主机。在 Unix 上,客户端使用 Unix 套接字文件进行连接。 unix_socket 参数或 MYSQL_UNIX_PORT 环境变量可用于指定套接字名称。否则使用TCP/IP连接。
- 第三个参数,填要连接的用户名
- 第四个参数,填要登录该用户使用的密码,无密码填NULL
- 第五个参数,填要使用的数据库名字
- 第六个参数,填主机端口号,主机参数决定连接的类型。如果 port 不为 0,则该值用作 TCP/IP 连接的端口号。
- 第七个参数,主机参数决定连接的类型。如果 unix_socket 不为 NULL,则该字符串指定要使用的套接字或命名管道。
- 第八个参数,一般填0,填其他则启用其他功能,具体看官网
下发mysql命令
- 第一个参数上面已经介绍过
- 第二个参数为要执行的sql语句,如“select * from table”
- 第三个参数为第二个参数的大小,即strlen(length)
获取执行结果
sql执行完以后,如果是查询语句,我们还要读取数据,如果update,insert等语句,那么就看下操
作成功与否即可。
- 该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记得调用
void mysql_free_result(MYSQL_RES *result)
,不然是肯定会造成内存泄漏的。 - 执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了
- 下面的api基本就是读取MYSQL_RES 中的数据。
四个接口的作用分别是: - 返回结果集中的行数
- 返回结果集中的列数
- 将结果集的一列的定义返回为 MYSQL_FIELD 结构。该结构中的name字段就是列名
- mysql_fetch_row() 检索结果集的下一行,即它是一行一行读取的,不是所有的都返回到
MYSQL_ROW
中
代码演示
数据库名称为11_30,表名为stu
#include<mysql/mysql.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;const char *host = NULL;
const char *user = "root";
const char *passwd = NULL;
const char *db = "11_30";
unsigned int port = 0;
const char *unix_socket = NULL;
unsigned long clientflag = 0;void mysql_module()
{ //初始化MYSQL* mysql_ = mysql_init(NULL);//建立连接if(mysql_real_connect(mysql_, host, user, passwd, db, port, unix_socket, clientflag)==NULL){cout<<"连接错误"<<endl;cout<<mysql_errno(mysql_)<<endl;exit(-1);}mysql_set_character_set(mysql_, "utf8"); // 设置默认字符集//查询语句const char* stmt_str="select* from stu";if(mysql_real_query(mysql_,stmt_str,strlen(stmt_str))!=0){cout<<"执行查询失败"<<endl;cout<<mysql_errno(mysql_)<<endl;exit(-1);}//获取查询结果保存在MYSQL_RES中MYSQL_RES* res=NULL;res = mysql_store_result(mysql_);if(res==NULL){perror("返回结果集失败或者为空");printf("%u\n",mysql_errno(mysql_));exit(-1);}uint64_t rows = mysql_num_rows(res);//获取行数unsigned int cols = mysql_num_fields(res);//获取列数MYSQL_FIELD * filed = mysql_fetch_fields(res);//获取列名cout<<"行:"<<rows<<endl;cout<<"列:"<<cols<<endl;//打印结果集for(int i=0;i<cols;i++){printf("%s ",filed[i].name);}printf("\n");for(int i=0;i<rows;i++){MYSQL_ROW content = mysql_fetch_row(res);//获取结果内容for(int j=0;j<cols;j++)printf("%s ",content[j]);printf("\n");}mysql_free_result(res);mysql_close(mysql_);//关闭连接
}
int main(){mysql_module();return 0;
}
打印结果: