文章目录

  • 一、导入官方库
  • 二、接口介绍



适用不同的语言连接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);