目录
MySQL环境准备
使用 C 语言连接 MySQL 时,需要使用 MySQL 官方提供的 C API 库(libmysqlclient)。获取方式主要有两种:
- 一种是从 MySQL Community Server 官方安装包中直接安装获得;
- 一种是在 Linux 系统中通过包管理器安装开发库(如 libmysqlclient-dev / mysql-devel),从而获得对应的头文件和库文件。
1.安装 MySQL 服务端
c
sudo apt update
sudo apt install mysql-server
这里安装的是:
MySQL Community Server
2.安装 C/C++ 开发库
c
sudo apt install libmysqlclient-dev
3.创建一个普通用户和数据库
create database test_db; #创建test_db数据库
create user 'test_user'@'localhost' identified by '123456'; #创建用户test_user并设置密码123456
grant all privileges on test_db.* to 'test_user'@'localhost'; #授权用户test_user访问数据库test_db的权限
flush privileges; #刷新权限
MySQL接口介绍
可以选择和自己的MySQL服务器版本对应的 C/C++ 开发库版本,我这里选择的是8.0的版本。

先用一个函数来测试我们有没有配置成功
mysql_get_client_info();返回MySQL客户端的版本信息
c
#include<iostream>
#include<mysql/mysql.h>
int main()
{
printf("mysql client version is %s\n",mysql_get_client_info());
return 0;
}

出现这个报错是因为在编译的时候没有指定动态库,虽然包含了头文件,但是编译器不是到是哪个动态库,所以我们要手动指定一下。
c
//查找系统目录下的动静态库
zx@VM-0-11-ubuntu:~/mysqlTest$ ls /lib/x86_64-linux-gnu/libmysqlclient*
/lib/x86_64-linux-gnu/libmysqlclient.a /lib/x86_64-linux-gnu/libmysqlclient.so.21
/lib/x86_64-linux-gnu/libmysqlclient.so /lib/x86_64-linux-gnu/libmysqlclient.so.21.2.45
//使用-l指定库
zx@VM-0-11-ubuntu:~/mysqlTest$ g++ test.cc -o test -lmysqlclient
zx@VM-0-11-ubuntu:~/mysqlTest$ ./test
mysql client version is 8.0.45
zx@VM-0-11-ubuntu:~/mysqlTest$ ldd test
linux-vdso.so.1 (0x00007fffb03e3000)
libmysqlclient.so.21 => /lib/x86_64-linux-gnu/libmysqlclient.so.21 (0x0000763111200000)
.......
能够运行成功,说明我们的环境已经搭建好了。
初始化mysql_init()
MYSQL * mysql_init(MYSQL *mysql)
分配或初始化一个适用于 mysql_real_connect() 的 MYSQL 对象。如果 mysql 是一个空指针,该函数会分配、初始化并返回一个新的 MYSQL 对象。否则,该函数会对已有的对象进行初始化,并返回该对象的地址。如果 mysql_init() 分配了新对象,那么在调用 mysql_close() 关闭连接时,该对象会被自动释放。
成功返回一个MYSQL的句柄,失败返回空。MYSQL是一个结构体,里面存储了很多客户端连接MySQL服务端的一些参数信息。可以类比C++中的ifstream、ofstream和C语言中的FILE。
连接数据库mysql_real_connect()
MYSQL *
mysql_real_connect(MYSQL mysql, //刚刚初始化的那个MYSQL 句柄
const char *host, //主机
const char *user, //用户
const char *passwd, //密码
const char *db, //访问的数据库
unsigned int port, //MySQL服务器端口号
const char *unix_socket, //域间通信,这个用不到可以置为nullptr
unsigned long client_flag)
如果连接成功,就返回MYSQL*connect句柄,如果失败就返回nullptr.
第一个参数 MYSQL是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。mysql_real_connect函数中各参数,基本都是顾名思意。
c
const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const int port = 8080;
if(mysql_real_connect(my,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,0) == nullptr)
{
std::cerr<<"mysql client connect fail!"<<std::endl;
return 2;
}else
{
std::cout<<"mysql client connect success!"<<std::endl;
}
下发mysql命令mysql_query()
int
mysql_query(MYSQL *mysql,
const char *stmt_str)
mysql:初始化时的MYSQL*句柄
stmt_str:你要写的sql语句
c
std::string sql = "insert into person(name,telephone) values('Peter','1324135');";
std::string sql = "update person set name='Jack' where id = 2;";
std::string sql = "delete from person where id = 2;";
int n = mysql_query(my,sql.c_str());
关闭mysql链接mysql_close()
void
mysql_close(MYSQL *mysql)
关闭一个先前已建立的连接。
如果连接句柄是由 mysql_init() 或 mysql_connect() 自动分配创建的,mysql_close() 还会释放该句柄所占用的内存资源。
连接关闭后,禁止再使用该句柄。
