MySQL(七)---C/C++连接MySQL

1、方法

想要用C语言连接MySQL,需要使用MySQL官网提供的库。

可以下载官方的库,然后传到Linux上。

也可以直接在Linux上,下载MySQL的开发工具包,即客户端开发包:

bash 复制代码
sudo apt-get install libmysqlclient-dev

随后只要在 /usr/include/mysql/ 下出现了 <mysql.h>这个头文件即可:

bash 复制代码
yangz@yangz-virtual-machine:~/MyHome$ ll /usr/include/mysql/
-rw-r--r--  1 root root  33601  9月 18 18:08 mysql.h

或者找到mysqlclient库也行:

bash 复制代码
yangz@yangz-virtual-machine:~/MyHome$ find / -name libmysqlclient.so*
/usr/lib/libmysqlclient.so
/usr/lib/x86_64-linux-gnu/libmysqlclient.so
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21.2.40
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.2

之后使用的时候,需要在Makefile文件里连接mysqlclient库:

bash 复制代码
-L /usr/lib/x86_64-linux-gnu -lmysqlclient

2、MySQL接口介绍

接下来全部使用C语言进行连接,更接近底层。

C++的话,就是对C进行了一通封装,然后创建对象进行操作。

2.1、初始化 mysql_init

要使用数据库,必须先进行初始化:

cpp 复制代码
    MYSQL *ms = mysql_init(nullptr); // MYSQL* 就相当于FILE*、fd等 -> 统称为句柄
    if (ms == nullptr)
    {
        std::cerr << "init MySQL error" << std::endl;
        return 1;
    }

2.2、连接数据库 mysql_real_connect

cpp 复制代码
    const std::string host = "127.0.0.1"; // 也可以写localhost,就是本地环回
    const std::string user = "username";
    const std::string passwd = "password";
    const std::string db = "conn";
    const unsigned int port = 8080; // 看配置文件里面设置的port

    ms = mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0);
    if (ms == nullptr)
    {
        std::cerr << "connect MySQL error" << std::endl;
        return 2;
    }
    std::cout << "connect MySQL success" << std::endl;

2.3、设置连接的字符集编码 mysql_set_character_set

cpp 复制代码
    mysql_set_character_set(ms, "utf8mb4");

2.4、下达sql语句指令 mysql_query

bash 复制代码
int mysql_query(MYSQL *mysql, const char *q);

其中const char* q:就是要下达的sq指令:

cpp 复制代码
 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(ms, sql.c_str());
     if (n == 0)
         std::cout << sql << " success , n : " << n << std::endl;
     else
         std::cerr << sql << " error , n : " << n << std::endl;
 }

2.5、获取select查询结果

cpp 复制代码
    std::string sql = "select * from user;"; // 先select
    int n = mysql_query(ms, sql.c_str());
    if (n == 0)
        std::cout << sql << " success , n : " << n << std::endl;
    else
        std::cerr << sql << " error , n : " << n << std::endl;

    MYSQL_RES *msr = mysql_store_result(ms); // 再将select的结果转储到MYSQL_RES
    if (msr == nullptr)
    {
        std::cerr << "mysql_store_result error " << std::endl;
        return 3;
    }

    my_ulonglong rows = mysql_num_rows(msr);     // 行数
    my_ulonglong fields = mysql_num_fields(msr); // 列数
    std::cout << "行: " << rows << " , 列 : " << fields << std::endl;

    MYSQL_FIELD *msr_fields = mysql_fetch_field(msr); // 获取列名
    for (size_t i = 0; i < fields; i++)
        std::cout << msr_fields[i].name << "\t";
    std::cout << "\n";

    MYSQL_ROW row; // 获取msr这个"二维数组"的一行,逐次往后获取
    for (size_t i = 0; i < rows; i++)
    {
        row = mysql_fetch_row(msr); // mysql_fetch_row 就类似于一个迭代器,自动向后获取
        for (size_t j = 0; j < fields; j++)
            std::cout << row[j] << "\t";
        std::cout << "\n";
    }

    mysql_free_result(msr); // 释放msr

2.6、关闭

cpp 复制代码
    mysql_close(ms);

2.7、完整流程

cpp 复制代码
#include <iostream>
#include <string>
#include <mysql/mysql.h>

int main()
{
    // std::cout << "mysql client version : " << mysql_get_client_info() << std::endl;

    // 1. 初始化
    MYSQL *ms = mysql_init(nullptr); // MYSQL* 就相当于FILE*、fd等 -> 统称为句柄
    if (ms == nullptr)
    {
        std::cerr << "init MySQL error" << std::endl;
        return 1;
    }

    // 2.连接数据库
    const std::string host = "127.0.0.1"; // 也可以写localhost,就是本地环回
    const std::string user = "username";
    const std::string passwd = "password";
    const std::string db = "conn";
    const unsigned int port = 8080; // 看配置文件里面设置的port

    ms = mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0);
    if (ms == nullptr)
    {
        std::cerr << "connect MySQL error" << std::endl;
        return 2;
    }
    std::cout << "connect MySQL success" << std::endl;

    // 3.设置链接字符集
    mysql_set_character_set(ms, "utf8mb4");

    // 4.查询
    std::string sql = "select * from user;"; // 先select
    int n = mysql_query(ms, sql.c_str());
    if (n == 0)
        std::cout << sql << " success , n : " << n << std::endl;
    else
        std::cerr << sql << " error , n : " << n << std::endl;

    MYSQL_RES *msr = mysql_store_result(ms); // 再将select的结果转储到MYSQL_RES
    if (msr == nullptr)
    {
        std::cerr << "mysql_store_result error " << std::endl;
        return 3;
    }

    my_ulonglong rows = mysql_num_rows(msr);     // 行数
    my_ulonglong fields = mysql_num_fields(msr); // 列数
    std::cout << "行: " << rows << " , 列 : " << fields << std::endl;

    MYSQL_FIELD *msr_fields = mysql_fetch_field(msr); // 获取列名
    for (size_t i = 0; i < fields; i++)
        std::cout << msr_fields[i].name << "\t";
    std::cout << "\n";

    MYSQL_ROW row; // 获取msr这个"二维数组"的一行,逐次往后获取
    for (size_t i = 0; i < rows; i++)
    {
        row = mysql_fetch_row(msr); // mysql_fetch_row 就类似于一个迭代器,自动向后获取
        for (size_t j = 0; j < fields; j++)
            std::cout << row[j] << "\t";
        std::cout << "\n";
    }

    mysql_free_result(msr); // 释放msr

    // // 3.下达sql指令
    // 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(ms, sql.c_str());
    //     if (n == 0)
    //         std::cout << sql << " success , n : " << n << std::endl;
    //     else
    //         std::cerr << sql << " error , n : " << n << std::endl;
    // }

    // end. 关闭
    mysql_close(ms);
    return 0;
}

3、图形化界面

相关推荐
lang201509284 分钟前
Spring Boot SQL数据库全攻略
数据库·spring boot·sql
EndingCoder36 分钟前
MongoDB基础与Mongoose ODM
服务器·javascript·数据库·mongodb·中间件·node.js
赋能大师兄1 小时前
SQLITE数据库完成数据增删改查
数据库·sqlite
一个天蝎座 白勺 程序猿1 小时前
深度解析:通过ADO.NET驱动Kdbndp高效连接与操作Kingbase数据库
数据库·.net·wpf·kingbase·金仓数据库
AI科技星2 小时前
垂直原理:宇宙的沉默法则与万物运动的终极源头
android·服务器·数据结构·数据库·人工智能
Warren982 小时前
复习MySQL
数据库·windows·tcp/ip·mysql·ubuntu·ssh·ansible
黑金IT2 小时前
3D虚拟人模型转换的完整指南
服务器·数据库·3d
凌~风2 小时前
数据库原理实验报告:在ider里搭建mysql数据库
数据库·mysql·实验报告
keke_俩个科2 小时前
ShardingSphere分库分表基础配置与使用说明
java·数据库·分布式·spring
2401_841495642 小时前
【数据库开发】个人信息管理的数据库创建以及查询方法(最简单)
数据库·sql·mysql·sqlite·数据库开发·个人数据库·管理个人信息