Bootstrap

mysql C语言连接

库安装

C语言连接首先要安装connector,按下图指示,下载的是旧版本的,下载新版要配置openssl,很麻烦。
不想找的话,这是链接
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

安装之后解压(tar -xvf + 文件名)。选项x是解压的意思
在这里插入图片描述
解压之后进入目录:重点看两个文件夹,一个是include,一个是lib。一个是所有头文件,一个是库文件,包括静态库和动态库。

由于这是第三方库,自然是要链接文件的了。

  1. 若是动态链接:
    export LD_LIBRARY_PATH=动态库名字
    g++ -o $@ $^ -I include -L lib -l mysqlclient(库文件名字)

  2. 静态链接:
    g++ -o mysql_conn mysql_conn.cc -I include -L lib -l mysqlclient -ldl -pthread -static
    至于为什么要链接dl文件和pthread文件不需要关心。因为是静态链接,所有库都必须是静态的

能跑得动这个程序既是安装并连接成功

#include <iostream>
#include "include/mysql.h"                                                                                                                                                                                                                                               

using namespace std;
int main()
{
	cout << "version: " << mysql_get_client_info() << endl;
}

接口介绍

mysql_init()

相当于创建一个句柄资源。相当于文件描述符了。和socket是一个道理。

它的返回值是一个MYSQL类型的指针

MYSQL* my = mysql_init(NULL);

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

host就是服务器ip,和命令行的-h是同理的,db是你想要访问的数据库名字,port是端口号,mysql服务器的端口号默认是3306。unix_socket默认给null即可,clientflag默认给0即可。

mysql_query()

发送sql语句给mysql服务器
q是你要写的sql语句的字符串。返回值是代表是否成功发送query,成功返回0,失败返回1.

int mysql_query(MYSQL *mysql, const char *q);

对于insert,delete,update这种无反馈的query,直接使用即可。对于seletc这种有反馈的,我们需要更多接口去获得内容。

获取select结果的接口

mysql_store_result()

MYSQL_RES *mysql_store_result(MYSQL *mysql);

该函数malloc了一段空间之后,把select的结果放在这段空间了。这个函数的返回值是MYSQL_RES类型,执行完这个函数之后,select结果就在MYSQL_RES变量里面了。下面就从这个变量里读数据即可。

注:记得free掉这段空间。

mysql_num_rows()

获取有多少行,返回值是一个无符号整型

unsign int 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_FIELD是一个结构体数组指针。这个结构体有一个成员叫name,放的就是列名

如果要把列名全部打印出来,就要mysql_num_fields函数来获取有多少列。

int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
int i = 0;
for(; i < fields; i++){
cout<<field[i].name<<" ";
}
cout<<endl;

在这里插入图片描述

mysql_fetch_row()

获取一行 行结构体(从名字也看得出来了),因此要把整个表打印出来,要循环行数次。

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

打印每一行是怎么打印的呢?
MYSQL_ROW是一个char* str[],每一个元素都是一个字符串。直接打印列数次即可。

i = 0;
MYSQL_ROW line;
for(; i < nums; i++){
	line = mysql_fetch_row(res);
	int j = 0;
	for(; j < fields; j++){
		cout<<line[j]<<" ";
	}
	cout<<endl;
}

在这里插入图片描述

mysql_close

用来断开客户端和mysql服务器的链接。

void mysql_close(MYSQL *sock);

ps:整体测试代码

#include <stdio.h>
#include <mysql.h>

int main()
{
  printf("version: %s\n", mysql_get_client_info());
  MYSQL* my = mysql_init(NULL);

  if(!mysql_real_connect(my, "127.0.0.1", "mhq", "1353601324Eric@", "test", 3306, NULL, 0)){
      printf("connect error !\n");
      mysql_close(my);
  }
  const char* sql = "update account set name = \"zhaoliu\" where id = 5;";
  const char* sql1 = "select * from account;";
  int res = mysql_query(my, sql1);
  //printf("%d", res);
  MYSQL_RES* a = mysql_store_result(my);
  int rows = mysql_num_rows(a);
  int cols = mysql_num_fields(a);
  //printf("rows: %d, cols: %d", rows, cols);
  MYSQL_FIELD *field = mysql_fetch_fields(a);
  for(int i = 0; i < cols; i++)
  {
      printf("%-10s\t", field[i].name);
  }
  puts("");
  MYSQL_ROW line;
  for(int i = 0; i < rows; i++)
  {
      line =  mysql_fetch_row(a);
      for(int j = 0; j < cols; j++)
      {
          printf("%-10s\t", line[j]);
      }
      puts("");
  }
  mysql_close(my);
  return 0;
}
;