C语言连接 MySQL:libmysqlclient 获取方式详解

目录

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语言接口

可以选择和自己的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() 还会释放该句柄所占用的内存资源。

连接关闭后,禁止再使用该句柄。

相关推荐
angushine1 小时前
Python常用方法
开发语言·前端·python
潜创微科技2 小时前
CH9245:双 Type‑C 转 PD 芯片方案,便携显示与拓展坞的理想选择
c语言·开发语言
【 】4232 小时前
pyhon相对导入
开发语言·python
小同志002 小时前
IoC 详解
java·开发语言
t***5442 小时前
如何在 Dev-C++ 中设置和使用 Clang 编译器
开发语言·c++
csbysj20202 小时前
Markdown 段落格式
开发语言
无限进步_2 小时前
C++ 继承机制完全解析:从基础原理到菱形继承问题
java·开发语言·数据结构·c++·vscode·后端·算法
roman_日积跬步-终至千里2 小时前
【系统架构师案例题-知识点】数据库与缓存设计
数据库·缓存·系统架构
leo__5203 小时前
基于时延的麦克风声源定位 - C实现
c语言·开发语言·算法