• 【MySQL从0到1】第十一篇:连接数据库



    一、连接数据库

    mysql的基础,我们之前已经学过,后面我们只关心使用

    要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以去官网下载

    我们使用C接口库来进行连接

    要正确使用,我们需要做一些准备工作:
    保证mysql服务有效

    • 保证mysql服务有效
    • 在官网上下载合适自己平台的mysql connect库,以备后用

    下载链接
    在这里插入图片描述
    在这里插入图片描述
    其中 include 包含所有的方法声明, lib 包含所有的方法实现(打包成库)
    尝试链接mysql client
    通过 mysql_get_client_info() 函数,来验证我们的引入是否成功
    在这里插入图片描述
    在这里插入图片描述

    1.1 mysql接口介绍

    • 初始化mysql_init()

    要使用库,必须先进行初始化!

    • MYSQL *mysql_init(MYSQL *mysql);

    如: MYSQL *mfp = mysql_init(NULL)

    • 链接数据库mysql_real_connect

    初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的)

    YSQL *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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    第一个参数 MYSQL是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。mysql_real_connect函数中各参数,基本都是顾名思意。

    • 下发mysql命令mysql_query
    int mysql_query(MYSQL *mysql, const char *q);
    
    • 1

    第一个参数上面已经介绍过,第二个参数为要执行的sql语句,如“select * from table”。

    • 获取执行结果mysql_store_result

    sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert等语句,那么就看下操作成功与否即可。我们来看看如何获取查询结果: 如果mysql_query返回成功,那么我们就通过mysql_store_result这个函数来读取结果。原型如下:

     MYSQL_RES *mysql_store_result(MYSQL *mysql);
    
    • 1

    该函数会调用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);
    
    • 1
    • 获取结果列数mysql_num_fields
    unsigned int mysql_num_fields(MYSQL_RES *res);
    
    • 1
    • 获取列名mysql_fetch_fields
    MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
    
    • 1
    • 获取结果内容mysql_fetch_row
    MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
    
    • 1

    它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。

    • 关闭mysql链接mysql_close
    void mysql_close(MYSQL *sock);
    
    • 1

    1.2 案例

    #include 
    #include 
    #include 
    #include "mysql.h"
    
    const std::string host = "127.0.0.1";
    const std::string user = "ts";
    const std::string passwd = "FSFgudg!@#5_$@3dgdkdg342343";
    const std::string db = "db_test2";
    unsigned int port = 3306;
    
    int main()
    {
        // std::cout << mysql_get_client_info() << std::endl;
        // std::cout << "hello world" << std::endl;
        // 1.创建mysql句柄
        MYSQL *mfp = mysql_init(nullptr);
        // 2.链接数据库
        if (nullptr == mysql_real_connect(mfp, host.c_str(), user.c_str(),
                                          passwd.c_str(), db.c_str(), port, nullptr, 0))
        {
            std::cerr << "connect failed!" << std::endl;
            return 1;
        }
        // mysql_set_character_set(mfp, "utf8");
        mysql_set_character_set(mfp, "utf8");
        std::cout << "connect success!" << std::endl;
    
        // 3.数据库操作
        // 增加,删除,更改比较简单
        // std::string sql = "insert into stu values(5,'唐僧')";
        // std::string sql = "insert into stu values(5,'唐僧')";
        // std::string sql = "delete from stu where id=5";
        // std::string sql = "update stu set name='八戒' where id=1";
        // 查询来说相对较难
        std::string sql = "select * from stu";
        int ret = mysql_query(mfp, sql.c_str());
        if (ret != 0)
        {
            std::cout << "execute " << sql << " failed!" << std::endl;
        }
        else
        {
            std::cout << "execute " << sql << " success!" << std::endl;
            // 该函数malloc了一片内存空间来存储查询过来的数据
            MYSQL_RES *result = mysql_store_result(mfp);
            int row = mysql_num_rows(result);
            int col = mysql_num_fields(result);
            std::cout << "row:" << row << " col:" << col << std::endl;
            MYSQL_FIELD* fields = mysql_fetch_field(result);
            for(int i = 0; i < col; ++i)
            {
                std::cout << fields[i].name <<  "\t";
            }
            std::cout << std::endl;
    
            for(int i = 0; i < row; ++i)
            {
                 //获取完整的一行记录[可能包含了多列]
                MYSQL_ROW line = mysql_fetch_row(result);
                for(int j = 0; j < col; ++j)
                {
                    std::cout << line[j] << "\t"; //将记录内部的多列字符串依次打印!
                }
                std::cout << std::endl;
            }
    
            free(result);
        }
        // sleep(30);
        // 4.关闭数据接口
        mysql_close(mfp);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    在这里插入图片描述

    另外,mysql C api还支持事务等常用操作,大家下来自行了解:

    my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
    my_bool STDCALL mysql_commit(MYSQL * mysql);
    my_bool STDCALL mysql_rollback(MYSQL * mysql);
    
    • 1
    • 2
    • 3

    二、数据库的备份

    2.1 备份

    语法:

    mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
    
    • 1

    示例:将mytest库备份到文件(退出连接)
    在这里插入图片描述

    在这里插入图片描述
    这时,可以打开看看 mytest.sql 文件里的内容,其实把我们整个创建数据库,建表,导入数据的语句都装载这个文件中

    2.2 还原

    mysql> source D:/mysql-5.7.22/mytest.sql;
    
    • 1

    在这里插入图片描述

    在这里插入图片描述
    注意事项

    • 如果备份的不是整个数据库,而是其中的一张表,怎么做?
    mysqldump -u root -p 数据库名 表名1 表名2 > D:/mytest.sql
    
    • 1
    • 同时备份多个数据库
    # mysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径
    
    • 1
    • 如果备份一个数据库时,没有带上-B参数, 在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source来还原

    2.3 查看连接情况

    语法:

    show processlist
    
    • 1

    在这里插入图片描述
    以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能你的数据库被人入侵了。以后大家发现自己数据库比较慢时,可以用这个指令来查看数据库连接情况

  • 相关阅读:
    Nacos作为注册中心和配置中心的使用总结
    自学WEB后端02-基于Express框架完成一个交互留言板!
    八 动手学深度学习v2 ——卷积神经网络之卷积+填充步幅+池化+LeNet
    TCP-4次挥手小记
    【JavaEE初阶】 UDP协议的详细解析
    Spring常见的三种getBean的API
    集成Swagger
    【笔者感悟】笔者的工作感悟【五】
    了解模型开发与部署,看这里!
    JAVA 读写文件(InputStream,FileReader)
  • 原文地址:https://blog.csdn.net/qq_52809807/article/details/126786513