MySQL访问

MySQL访问就是可以让我们不通过命令行的方式去防蚊数据库 可以使用我们平常使用的语言去访问数据库

要做到这一点需要配置环境 要么去官网下载第三方库 要么安装yum或者apt源它自带有需要的开发环境

查看进行MySQL访问的头文件以及库函数 我们在程序中使用的就是这些库函数实现数据库访问 这些库函数也有自己的头文件

环境配置成功之后可以开始进行访问了 首先来验证一下环境是不是好的 先在Linux环境下连接云服务器新建一个test.cc 在这里面来调用mysql头文件中的一个库函数

编译链接

找不到库函数 这是因为不知道去默认路径中找那个库 所以要指明 -lmysqlclient 来告诉程序链接哪一个库

至于头文件这里不需要 因为程序中已经包含了<mysql/mysql.h>而这个头文件本身就在查找头文件的默认路径里面 所以不需要手动指明头文件路径

现在验证了可以正常访问数据库 接下来开始使用C++来对库中的表进行增删查改操作

首先新建一个MySQL普通用户connector 之后在root下新建一个数据库conn在conn里面新建一张表user 并且将对conn的user的所有权限赋予这个connector

先要创建一个类似于FILE*的句柄 并且初始化 下面每一个参数对应的就是在mysql中创建的一系列东西 最后两个参数不管

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);

接下来用C++调用mysql库函数对connector下的conn数据库中的user表进行操作

cpp 复制代码
#include <iostream>
#include <string>
#include <mysql/mysql.h> // 系统默认识别这个二级路径

const std::string host = "localhost";
const std::string user = "connector";
const std::string passwd = "12345678";
const std::string db = "conn";
const unsigned int port = 3306;

int main()
{
    
    // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
    
    MYSQL* my = mysql_init(nullptr);
    if (my == nullptr)
    {
        std::cerr << "mysql init error" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << "mysql connect error" << std::endl;
        return 2;
    }
    std::string sql;
    while (true)
    {
        std::cout << "MySql>>> ";
        if (!std::getline(std::cin, sql) || sql == "quit")
        {
            std::cout << "Bye" << std::endl;
            break;
        }
        int n = mysql_query(my, sql.c_str());
        if (n == 0)
        {
            std::cout << "success:" << n << std::endl;
        }
        else
        {
            std::cout << "failed:" << n << std::endl;
        }
    }
    mysql_close(my);
    return 0;
}

正常访问
//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8")

有一个需要关注的点 就是select能不呢正常访问

success 但是没有显示查找的数据 这是因为select相对于增删改更加复杂 这三种只需要对数据修改即可 没有后续 而select还有后续

那么如何查看select之后的结果呢 这需要使用相关接口
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 中的数据。

获取结果行数mysql_num_rows my_ulonglong mysql_num_rows(MYSQL_RES *res);
获取结果列数mysql_num_fields unsigned int mysql_num_fields(MYSQL_RES *res);
获取列名mysql_fetch_fields MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

res就相当于一个char**地二维数组 里面存放了select地一些数据 我们可以通过特定的接口来访问这些数据而不需要自己手动操作指针

看代码和操作结果

cpp 复制代码
int main()
{    
    MYSQL* my = mysql_init(nullptr);
    if (my == nullptr)
    {
        std::cerr << "mysql init error" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << "mysql connect error" << std::endl;
        return 2;
    }
    // 输入语句
    std::string sql = "select * from user";
    int n = mysql_query(my, sql.c_str());
    if (n == 0) 
    {
        std::cout << "success" << std::endl;
    }
    else
    {
        std::cerr << "failed" << std::endl;
        return 3;
    }
    
    // 获取select的转储集
    MYSQL_RES* res = mysql_store_result(my);
    if (nullptr == res)
    {
        std::cerr << "mysql_store_result error" << std::endl;
        return 4; 
    }

    int rows = mysql_num_rows(res);
    int fields = mysql_num_fields(res);
    std::cout << "行: " << rows << std::endl;
    std::cout << "列: " << fields << std::endl;

    // 获取属性
    MYSQL_FIELD *fields_array = mysql_fetch_fields(res);
    for (int i = 0; i < fields; i++)
    {
        std::cout << fields_array[i].name << "\t";
    }
    std::cout << std::endl;
    // 获取内容
    for (int i = 0; i < rows; i++)
    {
        MYSQL_ROW row = mysql_fetch_row(res);
        for (int j = 0; j < fields; j++)
        {
            std::cout << row[j] << "\t";
        }
        std::cout << std::endl;
    }
    mysql_free_result(res);
    mysql_close(my);
    return 0;
}
相关推荐
2301_813599551 小时前
Go语言怎么做秒杀系统_Go语言秒杀系统实战教程【实用】
jvm·数据库·python
NCIN EXPE6 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台6 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路6 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家6 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE6 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow126 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO6 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_743623926 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python