Mysql使用 C语言连接

目录

1.下载Mysql的C接口库

2.程序中引入Mysql头文件和库文件

3.Mysql接口介绍


        

 

1.下载Mysql的C接口库

  • 要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以去官网下载
  • 实际上连接数据库的功能在mysql 8.0版本之后已经集成在安装包里面了。

Mysql使用 C语言连接_第1张图片

Mysql使用 C语言连接_第2张图片

Mysql使用 C语言连接_第3张图片

  •  将下载好的压缩包传送到 Linux服务器,进行解压

                                        

2.程序中引入Mysql头文件和库文件

(1)压缩包解压之后最重要的两个文件夹 

Mysql使用 C语言连接_第4张图片

        

(2) 如何使mysql头文件和库文件引入到项目中?

  • ①将下载好的头文件和库文件放在系统默认的头文件和库文件路径下
  • ②将下载好的头文件和库文件拷贝到当前工作目录下面(有点挫)
  • ③建立软连接

Mysql使用 C语言连接_第5张图片

                

(3)代码测试

  • ① mysql_ops.cc
#include
#include"./include/mysql.h"


int main()
{   
    //显示MySQL客户端库版本
    std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
    return 0;
}
  • ②Makefile 
mysql_ops:mysql_ops.cc
	g++ -o $@ $^ -std=c++11 -I./include -L./lib -lmysqlclient


.PHONY:clean
clean:
	rm -f mysql_ops
  • -I :指定头文件搜索路径
  • -L : 指定库文件搜索路径
  • -l :  指明需要链接库文件路径下的哪一个库(lib目录下面有很多 .a的库)

        

③解决OS找不到动态库的方法 - 动静态库

Mysql使用 C语言连接_第6张图片

Mysql使用 C语言连接_第7张图片

                

                                

                

3.Mysql接口介绍

#include 
#include 
#include "./include/mysql.h"

const std::string host = "49.232.80.153";
const std::string user = "gsx";
const std::string passwd = "";
const std::string db = "mysql_test";
const int port = 3306;

int main()
{

    // 相当于给我们创建了一个mysql句柄
    MYSQL *my = mysql_init(nullptr); 

    // 链接数据库
    if( nullptr == mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0))
    {
        std::cerr << "mysql 连接失败!" << std::endl;
        return 1;
    }

    // 设置连接的编码也是utf8
    mysql_set_character_set(my, "utf8");

    std::cout << "mysql 连接成功!" << std::endl;
	
    //增删改
    std::string sql = "insert into user values (4,21, \'王五\')";
    mysql_query(my, sql.c_str());
    // std::string sql = "update user set age=18 where id=1";
    // std::string sql = "delete from user where id=4";


    // 查找所有的数据
    // 1. 执行查询语句
    std::string select_sql = "select * from user";
    if (0 != mysql_query(my, select_sql.c_str()))
    {
        std::cout << "execute: " << select_sql << " failed!" << std::endl;
        return 2;
    }
    std::cout << "execute: [" << select_sql << " ] success" << std::endl;
    
    // 2. 获取查询结果数据
    MYSQL_RES *res = mysql_store_result(my);

    // 3. 数据的行列信息
    // 获取结果行数
    int rows = mysql_num_rows(res);

    // 获取列数
    int cols = mysql_num_fields(res);

    // 获取所有的列属性
    MYSQL_FIELD *fields = mysql_fetch_field(res);
    for (int i = 0; i < cols; i++)
    {
        // 获取列名,通常没什么用
        std::cout << fields[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 < cols; j++) 
        {
            std::cout << row[j] << "\t";
        }
        std::cout << std::endl;
    }


    free(res); //不要忘记释放空间
    mysql_close(my);
    std::cout << "关闭mysql连接" << std::endl;

    return 0;
}

 

(1) 连接数据库

  • 要使用库,必须先进行初始化 ,MYSQL *mysql_init(MYSQL *mysql)
  • mysql网络部分是基于TCP/IP的,链接数据库 mysql_real_connect
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
);
  • 第一个参数 MYSQLC api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有 port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。mysql_real_connect函数中各参数,基本都是顾名思意。

                        

(2) 连接示例演示

#include 
#include 
#include "./include/mysql.h"

const std::string host = "49.232.80.153";
const std::string user = "gsx";
const std::string passwd = "";
const std::string db = "mysql_test";
const int port = 3306;

int main()
{

    // 相当于给我们创建了一个mysql句柄
    MYSQL* my = mysql_init(nullptr); 

    // 链接数据库
    if( nullptr == mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0))
    {
        std::cerr << "mysql 连接失败!" << std::endl;
        return 1;
    }

    std::cout << "mysql 连接成功!" << std::endl;
    mysql_close(my);
    std::cout << "关闭mysql连接" << std::endl;

Mysql使用 C语言连接_第8张图片

                

(3)下发mysql命令mysql_query

int mysql_query(MYSQL *mysql, const char *q);
  • 第一个参数上面已经介绍过,第二个参数为要执行的sql语句,“select * from table” 

                 

①增

std::string sql = "insert into user values (4,21, \'wangwu\')";
mysql_query(my, sql.c_str());

Mysql使用 C语言连接_第9张图片

                 

②改

std::string sql = "update user set age=18 where id=1"; 
mysql_query(my, sql.c_str());

Mysql使用 C语言连接_第10张图片

 

③删

 std::string sql = "delete from user where id=4";
mysql_query(my, sql.c_str());

Mysql使用 C语言连接_第11张图片

                 

(4)查询结果 

  •  如果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_fifields
  • unsigned int mysql_num_fields(MYSQL_RES *res);
  • 获取列名mysql_fetch_fifields
  • MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

                                                 

    // 查找所有的数据
    // 1. 执行查询语句
    std::string select_sql = "select * from user";
    if (0 != mysql_query(my, select_sql.c_str()))
    {
        std::cout << "execute: " << select_sql << " failed!" << std::endl;
        return 2;
    }
    std::cout << "execute: [" << select_sql << " ] success" << std::endl;

    // 2. 获取查询结果数据
    MYSQL_RES *res = mysql_store_result(my);

    // 3. 数据的行列信息
    // 获取结果行数
    int rows = mysql_num_rows(res);

    // 获取列数
    int cols = mysql_num_fields(res);

    // 获取所有的列属性
    MYSQL_FIELD *fields = mysql_fetch_field(res);
    for (int i = 0; i < cols; i++)
    {
        // 获取列名,通常没什么用
        std::cout << fields[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 < cols; j++) 
        {
            std::cout << row[j] << "\t";
        }
        std::cout << std::endl;
    }


    free(res); //不要忘记释放空间

Mysql使用 C语言连接_第12张图片

 // 设置连接的编码也是utf8
 mysql_set_character_set(my, "utf8");

Mysql使用 C语言连接_第13张图片

                

(5) mysql C api还支持事务等常用操作

  •  在语言层面上我们不需要知道事物,除非将来要执行的sql具有强相关性,把多条sq|打包成一个事务,否则不推荐。
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);

                        

你可能感兴趣的:(Mysql数据库,mysql,数据库)