文章目录
- 一、导入官方库
- 二、接口介绍
适用不同的语言连接MySQL,需要使用mysql官网提供的库。官网地址
一、导入官方库
下载下来的文件中 include
包含所有的方法声明, lib
包含所有的方法实现(打包成库)
尝试链接mysql client
通过 mysql_get_client_info()
函数,来验证我们的引入是否成功
// 测试C语言连接MySQL
#include <iostream>
#include "./include/mysql.h" // 这里文件路径
int main()
{
printf("mysql client Version: %s\n", mysql_get_client_info());
return 0;
}
编译的时候需要链接指定头文件路径(-I),指定库路径(-L),指定库名称(-l)。
[sqin@VM-16-8-centos test]$ make
g++ -o test test.cc -std=c++11 -I./include -L./lib -lmysqlclient
[sqin@VM-16-8-centos test]$ ./test
mysql client Version: 5.6.51
二、接口介绍
用来练习,在数据库中设置这样一张表:
mysql> select * from grade;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| 1 | 张三 | A |
| 2 | 李四 | B |
| 3 | 王五 | D |
| 4 | 赵六 | A |
| 5 | 田七 | C |
+----+--------+-------+
5 rows in set (0.01 sec)
- 初始化
mysql_init()
获取MySQL句柄:MYSQL* my = mysql_init(nullptr);
- 连接数据库:
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);
第一个参数是mysql_init的返回值。最后两个参数不用管,分别填nullptr和0
// 需要的参数
const std::string host="127.0.0.1";
const std::string user="root";
// password
const std::string db = "test9_18";
const unsigned int port = 3306;
// 2. 连接数据库,TCP/IP
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;
}
//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");
- 访问数据库(增删查改)
它们使用都是一个函数:int mysql_query(MYSQL *mysql, const char *q);
返回0表执行成功。
// 插入
std::string sql = "insert into grade values(7, \'123\', \'A\')";
int res = mysql_query(my, sql.c_str());
if (res == 0) {
std::cout << "insert succeeded" << std::endl;
}
// 删改,也是如此,它们没有从MySQL获取数据,操作很简单
std::string sql = "delete from grade where id = 6;";
std::string sql = "update grade set grade=\'F\' where name = \'张三\';";
但是如果是查询,需要拿到结果
如果mysql_query返回成功,那么我们就通过mysql_store_result这个函数来读取结果。原型如下:MYSQL_RES *mysql_store_result(MYSQL *mysql);
该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。
获取结果行数my_ulonglong mysql_num_rows(MYSQL_RES *res);
获取结果列数unsigned int mysql_num_fields(MYSQL_RES *res);
获取列名MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
std::string sql = "select * from grade";
int code = mysql_query(my, sql.c_str());
if(code != 0)
{
std::cout << "execute: " << sql << " failed" << std::endl;
return 2;
}
// 3.2 解析数据,拿到行数和列数
MYSQL_RES *result = mysql_store_result(my);
int rows = mysql_num_rows(result); // 行
int cols = mysql_num_fields(result); // 列
// 3.3 解析数据 -- 获取表中列名
MYSQL_FIELD *fields = mysql_fetch_fields(result);
for(int i = 0; i < cols; i++)
{
std::cout << fields[i].name << "\t";
}
std::cout << std::endl;
获取一行内容MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。
// 3.4 拿到每个数据
for (int i = 0; i < rows; i ++ )
{
// 拿到完整一行
MYSQL_ROW line = mysql_fetch_row(result);
for (int j = 0; j < cols; j ++ )
{
std::cout << line[j] << "\t"; // 依次打印每列的值
}
std::cout << std::endl;
}
- 关闭mysql链接
// 4. 关闭MySQL
free(result);
mysql_close(my);