文章目录
库安装
C语言连接首先要安装connector,按下图指示,下载的是旧版本的,下载新版要配置openssl,很麻烦。
不想找的话,这是链接
安装之后解压(tar -xvf + 文件名)。选项x是解压的意思
解压之后进入目录:重点看两个文件夹,一个是include,一个是lib。一个是所有头文件,一个是库文件,包括静态库和动态库。
由于这是第三方库,自然是要链接文件的了。
-
若是动态链接:
export LD_LIBRARY_PATH=动态库名字
g++ -o $@ $^ -I include -L lib -l mysqlclient(库文件名字) -
静态链接:
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;
}