目录
[一. MySQL C API简介](#一. MySQL C API简介)
[二. MySQL C API核心函数](#二. MySQL C API核心函数)
[2.1 初始化和连接](#2.1 初始化和连接)
[2.2 配置和执行](#2.2 配置和执行)
[2.3 处理结果](#2.3 处理结果)
[2.4 清理和关闭](#2.4 清理和关闭)
[2.5 错误处理](#2.5 错误处理)
[三. MySQL使用过程](#三. MySQL使用过程)
[四. 实现CRUD操作](#四. 实现CRUD操作)
[4.1 创建数据库并建立表](#4.1 创建数据库并建立表)
[4.2 添加数据(Create)](#4.2 添加数据(Create))
[编辑4.3 修改数据(Update)](#编辑4.3 修改数据(Update))
[4.4 删除数据(Delete)](#4.4 删除数据(Delete))
[4.5 查询数据(Retrieve)](#4.5 查询数据(Retrieve))
引言
在软件开发中,数据库是存储、检索和操作数据的关键组件。MySQL作为一种广泛使用的数据库系统,提供了丰富的API接口,允许开发者通过不同的编程语言与其交互。本文将详细介绍如何使用MySQL的C语言API来实现数据库的基本增删改查(CRUD)操作。
一. MySQL C API简介
MySQL C API是一组函数,它们提供了对MySQL服务器的底层访问。通过这个API,开发者可以在C语言程序中执行SQL语句并处理结果。
二. MySQL C API核心函数
cpp
// Mysql操作句柄初始化
MYSQL *mysql_init(MYSQL *mysql);
// 参数为空则动态申请句柄空间进⾏初始化
// 失败返回NULL
// 连接mysql服务器
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 client_flag);
// mysql--初始化完成的句柄
// host---连接的mysql服务器的地址
// user---连接的服务器的⽤⼾名
// passwd-连接的服务器的密码
// db ----默认选择的数据库名称
// port---连接的服务器的端⼝: 默认0是3306端⼝
// unix_socket---通信管道⽂件或者socket⽂件,通常置NULL
// client_flag---客⼾端标志位,通常置0
// 返回值:成功返回句柄,失败返回NULL
// 设置当前客⼾端的字符集
int mysql_set_character_set(MYSQL *mysql, const char *csname)
// mysql--初始化完成的句柄
// csname--字符集名称,通常:"utf8"
// 返回值:成功返回0, 失败返回⾮0;
// 选择操作的数据库
int mysql_select_db(MYSQL *mysql, const char *db)
// mysql--初始化完成的句柄
// db-----要切换选择的数据库名称
// 返回值:成功返回0, 失败返回⾮0;
// 执⾏sql语句
int mysql_query(MYSQL *mysql, const char *stmt_str)
// mysql--初始化完成的句柄
// stmt_str--要执⾏的sql语句
// 返回值:成功返回0, 失败返回⾮0;
// 保存查询结果到本地
MYSQL_RES *mysql_store_result(MYSQL *mysql)
// mysql--初始化完成的句柄
// 返回值:成功返回结果集的指针, 失败返回NULL;
// 获取结果集中的⾏数与列数
uint64_t mysql_num_rows(MYSQL_RES *result);
//result--保存到本地的结果集地址
// 返回值:结果集中数据的条数;
// 获取结果中列的个数
unsigned int mysql_num_fields(MYSQL_RES *result)
// result--保存到本地的结果集地址
// 返回值:结果集中每⼀条数据的列数;
// 遍历结果集
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
// result--保存到本地的结果集地址
// 返回值:实际上是⼀个char **的指针,将每⼀条数据做成了字符串指针数组 row[0]-第0列row[1] -第1列
// 并且这个接⼝会保存当前读取结果位置,每次获取的都是下⼀条数据
// 释放结果集
void mysql_free_result(MYSQL_RES *result)
// result--保存到本地的结果集地址
// 返回值:void
// 关闭数据库客⼾端连接,销毁句柄:
void mysql_close(MYSQL *mysql)
// 获取mysql接⼝执⾏错误原因
const char *mysql_error(MYSQL *mysql)
2.1 初始化和连接
mysql_init
:初始化MySQL操作句柄。mysql_real_connect
:使用给定的参数连接到MySQL服务器。
2.2 配置和执行
mysql_set_character_set
:设置客户端字符集。mysql_select_db
:选择要操作的数据库。mysql_query
:执行SQL语句。
2.3 处理结果
mysql_store_result
:保存查询结果到本地。mysql_num_rows
和mysql_num_fields
:获取结果集中的行数和列数。mysql_fetch_row
:遍历结果集,获取单行数据。
2.4 清理和关闭
mysql_free_result
:释放结果集资源。mysql_close
:关闭数据库连接,销毁句柄。
2.5 错误处理
mysql_error
:获取MySQL接口执行错误原因。
三. MySQL使用过程
初始化MySQL句柄:
- 使用
mysql_init
函数初始化一个MySQL连接句柄,为后续操作做准备。连接到MySQL服务器:
- 使用
mysql_real_connect
函数连接到MySQL服务器,需要提供主机地址、用户名、密码、数据库名等信息。设置字符集:
- 使用
mysql_set_character_set
设置客户端字符集,以确保字符编码的一致性。执行SQL语句:
- 使用
mysql_query
执行SQL语句,可以是查询、插入、更新或删除等操作。处理查询结果(对于查询操作):
- 如果执行的是查询操作,可以使用
mysql_store_result
保存结果集,然后通过mysql_fetch_row
逐行读取数据。错误处理:
- 在每个步骤中,如果操作失败,可以使用
mysql_error
获取错误信息。清理资源:
- 使用完MySQL句柄后,使用
mysql_free_result
释放结果集资源(如果有查询操作),然后使用mysql_close
关闭连接,释放句柄资源。关闭连接:
- 最后,关闭与MySQL服务器的连接,清理分配的资源。
四. 实现CRUD操作
4.1 创建数据库并建立表
cpp
create database if not exists test_db;
use test_db;
create table if not exists test_tb(
id int primary key auto_increment,
age int,
name varchar(32),
score decimal(4, 2)
);
4.2 添加数据(Create)
使用
insert
语句向数据库表中添加新记录。
cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mysql/mysql.h>
#define HOST "127.0.0.1"
#define USER "root"
#define PASSWD "mima"
#define DBNAME "test_db"
void add(MYSQL *mysql)
{
char *sql = "insert into test_tb values(null, 18, '张三', 88.88), (null, 17, '李四', 77);";
int ret = mysql_query(mysql, sql);
if (ret != 0)
{
printf("mysql query error:%s\n", mysql_error(mysql));
return;
}
return;
}
int main()
{
MYSQL *mysql = mysql_init(NULL);
if (mysql == NULL)
{
printf("init mysql handle failed!\n");
return -1;
}
if (mysql_real_connect(mysql, HOST, USER, PASSWD, DBNAME, 0, NULL, 0) ==
NULL)
{
printf("mysql connect error:%s\n", mysql_error(mysql));
return -1;
}
mysql_set_character_set(mysql, "utf8");
add(mysql);
mysql_close(mysql);
return 0;
}
编译并运行 +运行结果
4.3 修改数据(Update)
使用
update
语句更新表中的现有记录。
cpp
void mod(MYSQL *mysql)
{
char *sql = "update test_tb set age=34 where name='张三';";
int ret = mysql_query(mysql, sql);
if (ret != 0)
{
printf("mysql query error:%s\n", mysql_error(mysql));
return;
}
return;
}
运行结果
4.4 删除数据(Delete)
使用
delete
语句从表中删除记录。
cpp
void del(MYSQL *mysql)
{
char *sql = "delete from test_tb where name='张三';";
int ret = mysql_query(mysql, sql);
if (ret != 0)
{
printf("mysql query error:%s\n", mysql_error(mysql));
return;
}
return;
}
运行结果
4.5 查询数据(Retrieve)
使用
select
语句检索表中的数据。
cpp
void get(MYSQL *mysql)
{
char *sql = "select * from test_tb;";
int ret = mysql_query(mysql, sql);
if (ret != 0)
{
printf("mysql query error:%s\n", mysql_error(mysql));
return;
}
MYSQL_RES *res = mysql_store_result(mysql);
if (res == NULL)
{
printf("mysql store result error:%s\n", mysql_error(mysql));
return;
}
int row = mysql_num_rows(res);
int col = mysql_num_fields(res);
printf("%10s%10s%10s%10s\n", "ID", "年龄", "姓名", "成绩");
for (int i = 0; i < row; i++)
{
MYSQL_ROW row_data = mysql_fetch_row(res);
for (int i = 0; i < col; i++)
{
printf("%10s", row_data[i]);
}
printf("\n");
}
mysql_free_result(res);
return;
}
运行结果
结语
通过本文的介绍,你应该对MySQL的C语言API有了深入的了解。使用这些API,你可以在C语言项目中实现对MySQL数据库的高效操作。虽然现代开发中更倾向于使用高级语言和ORM框架,但直接使用MySQL C API为理解数据库操作的细节提供了宝贵的视角。