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

第一个参数 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);

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

  • 获取执行结果mysql_store_result

sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert等语句,那么就看下操作成功与否即可。我们来看看如何获取查询结果: 如果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 中的数据。

  • 获取结果行数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);
  • 获取结果内容mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

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

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

1.2 案例

#include <iostream>
#include <string>
#include <unistd.h>
#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;
}

在这里插入图片描述

另外,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);

二、数据库的备份

2.1 备份

语法:

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

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

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

2.2 还原

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

在这里插入图片描述

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

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

2.3 查看连接情况

语法:

show processlist

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小唐学渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值