目录
1.下载Mysql的C接口库
- 要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以去官网下载
- 实际上连接数据库的功能在mysql 8.0版本之后已经集成在安装包里面了。
- 将下载好的压缩包传送到 Linux服务器,进行解压
2.程序中引入Mysql头文件和库文件
(1)压缩包解压之后最重要的两个文件夹
(2) 如何使mysql头文件和库文件引入到项目中?
- ①将下载好的头文件和库文件放在系统默认的头文件和库文件路径下
- ②将下载好的头文件和库文件拷贝到当前工作目录下面(有点挫)
- ③建立软连接
(3)代码测试
- ① mysql_ops.cc
#include<iostream>
#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找不到动态库的方法 - 动静态库
3.Mysql接口介绍
#include <iostream>
#include <string>
#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
);
- 第一个参数 MYSQL是C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有 port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。mysql_real_connect函数中各参数,基本都是顾名思意。
(2) 连接示例演示
#include <iostream>
#include <string>
#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;
(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());
②改
std::string sql = "update user set age=18 where id=1";
mysql_query(my, sql.c_str());
③删
std::string sql = "delete from user where id=4";
mysql_query(my, sql.c_str());
(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); //不要忘记释放空间
// 设置连接的编码也是utf8
mysql_set_character_set(my, "utf8");
(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);