文章目录
- 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;
}
 



















