文章目录
- 1.下载库
- 2.上传库
- 3.编译库
- 4.连接库
- 创建对象-mysql_init
- 连接数据库-mysql_real_connect
- 关闭数据库连接-mysql_close
- 5.sql函数
- 设置编码格式-mysql_set_character_set
- 发送请求-mysql_query
- 获取查询结果-mysql_store_result
- 获取查询结果的行数-mysql_num_rows
- 获取查询结果中的一行数据-mysql_fetch_row
- 获取查询结果的列数-mysql_num_fields
- 获取查询结果的列属性-mysql_fetch_fields
- 实例
1.下载库
- 进入官网Mysql
- 选择DEVELOPER ZONE
- 点击MySQL Downloads
- 选择Download Archives
- 选择MySQL Connector/C
2.上传库
- 找到需要存放的库,我建立一个thirdpath库,我的路径/home/aaa/thirdpath/
rz -E
命令上传下载的库- tar -xzf mysql-connector-c-6.1.11-linux-glibc2.12-x86_64.tar.gz//把库解压
- mv mysql-connector-c-6.1.11-linux-glibc2.12-x86_64 mysql-connector//改名方便
- cd connector//会发现include(头文件)lib(动静态库)
3.编译库
- ln -s ~/thirdpath/mysql-connector/include include
- ln -s ~/thirdpath/mysql-connector/lib lib
- 在项目的目录下创建上面两个软连接,我的项目是file(路径是/home/aaa/file),我就在file文件夹下创建软连接
通过调用mysql_get_client_info来判断库是否引入成功,该函数的作用就是获取客户端的版本信息,使用的文件test.cc
#include <iostream>
#include <mysql.h>
using namespace std;
int main()
{
//获取客户端的版本信息
cout<<"mysql client version: "<<mysql_get_client_info()<<endl;
return 0;
}
编译
g++ -o test test.cc -I./include/ -L./lib/ -lmysqlclient
解决libmysqlclient.so.18 => not found
echo /home/aaa/thirdpath/mysql-connector/lib > test.conf
sudo cp test.conf /etc/ld.so.conf.d/
ls /etc/ld.so.conf.d/ //发现test.conf就算成功
sudo ldconfig
ldd test //发现libmysqlclient.so.18 =>不是not found就算成功
之后./test成功运行
4.连接库
创建对象-mysql_init
MYSQL* mysql_init(MYSQL *mysql);
例如:MYSQL*m1 = mysql_init(NULL);
- 如果传入的参数是NULL,那么mysql_init将自动为你分配一个MySQL对象并返回。
- 如果传入的参数是一个地址,那么mysql_init将在该地址处帮你完成初始化。
连接数据库-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);
例如:MYSQL*m2 = mysql_real_connect(m1,"127.0.0.1", "king", "123456","connect_demon", 3306, NULL, 0);
参数
- mysql: 调用mysql_init函数创建的MySQL对象。
- host: MySQL服务器的IP地址,"127.0.0.1"表示本地MySQL服务器。
- user: MySQL服务器,用户名。
- passwd: MySQL服务器,用户密码
- db: MySQL服务器,需要使用的数据库。
- port: MySQL服务器,对应的端口号。
- unix_socket: 使用的套接字或命名管道,通常设置为NULL。
- clientflag: 设置为多个标志位的组合,表示允许特定的功能,通常设置为0。
返回值
- 如果连接数据库成功,则返回一个MySQL对象,该对象与第一个参数的值相同。
- 如果连接数据库失败,则返回NULL。
关闭数据库连接-mysql_close
void mysql_close(MYSQL *sock);
实例:
#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;
const string host = "127.0.0.1";
const string user = "king";
const string passwd = "123456";
const string db = "connect_demon";
const int port = 3306;
int main()
{
//1、创建MySQL对象
MYSQL* ms = mysql_init(nullptr);
//2、连接数据库
if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
{
cerr<<"数据库连接失败!"<<endl;
return 1;
}
cout<<"数据库连接成功!"<<endl;
//3、关闭数据库
mysql_close(ms);
cout<<"数据库关闭成功!"<<endl;
return 0;
}
5.sql函数
设置编码格式-mysql_set_character_set
int mysql_set_character_set(MYSQL *mysql, const char *csname);
mysql_set_character_set(m1, "utf8"); //设置编码格式为utf8
- mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
- csname: 表示要设置的编码格式,如
"utf8"
。 - 返回值为0表示设置成功,否则表示设置失败。
发送请求-mysql_query
int mysql_query(MYSQL *mysql, const char *q);
例如:
string sql = "insert into user values (4,'赵六',25)";
mysql_query(m1, sql.c_str());
- mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
- q: 表示向MySQL服务器下发的SQL请求,SQL最后可以不带分号。
- 返回值为0表示SQL执行成功,否则表示SQL执行失败。
获取查询结果-mysql_store_result
MYSQL_RES* mysql_store_result(MYSQL *mysql);
例如:
MYSQL_RES* res = mysql_store_result(m1);
free(m1);
- 查询结果保存到MYSQL_RES指针中进行返回
- MYSQL_RES指针的内存空间是malloc出来,使用完后需要调用free函数进行释放
获取查询结果的行数-mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
例如:
int rows = mysql_num_rows(res); //数据的行数
获取查询结果中的一行数据-mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
例如:
MYSQL_ROW row = mysql_fetch_row(res);//获取一行数据
注意:MYSQL_ROW本质就是char**类型
获取查询结果的列数-mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
例如:
int cols = mysql_num_fields(res); //数据的列数
获取查询结果的列属性-mysql_fetch_fields
MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES *res);
例如:
MYSQL_FIELD* fields = mysql_fetch_fields(res);//获取每列的属性
实例
#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;
const string host = "127.0.0.1";
const string user = "king";
const string passwd = "123456";
const string db = "connect_demon";
const int port = 3306;
int main()
{
//1、获取MySQL实例(相当于给我们创建了一个MySQL句柄)
MYSQL* ms = mysql_init(nullptr);
//2、连接数据库
if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
{
cerr<<"数据库连接失败!"<<endl;
return 1;
}
cout<<"数据库连接成功!"<<endl;
mysql_set_character_set(ms, "utf8"); //设置编码格式为utf8
//3、查询数据库表中的记录
//a、执行查询语句
std:string sql = "select * from user";
if(mysql_query(ms, sql.c_str()) != 0)
{
cout<<"查询数据失败!"<<endl;
return 2;
}
cout<<"查询数据成功!"<<endl;
//b、获取查询结果
MYSQL_RES* res = mysql_store_result(ms);
int rows = mysql_num_rows(res); //数据的行数
int cols = mysql_num_fields(res); //数据的列数
//获取每列的属性并打印列名
MYSQL_FIELD* fields = mysql_fetch_fields(res);
for(int i = 0;i < cols;i++)
{
cout<<fields[i].name<<"\t";
}
cout<<endl;
for(int i = 0;i < rows;i++)
{
//获取一行数据并进行打印
MYSQL_ROW row = mysql_fetch_row(res);
for(int j = 0;j < cols;j++)
{
cout<<row[j]<<"\t";
}
cout<<endl;
}
free(res); //释放内存空间
//4、关闭数据库
mysql_close(ms);
cout<<"数据库关闭成功!"<<endl;
return 0;
}