目录
引言
一. MySQL C API简介
二. MySQL C API核心函数
2.1 初始化和连接
2.2 配置和执行
2.3 处理结果
2.4 清理和关闭
2.5 错误处理
三. MySQL使用过程
四. 实现CRUD操作
4.1 创建数据库并建立表
编辑
4.2 添加数据(Create)
编辑
编辑
编辑4.3 修改数据(Update)
编辑
4.4 删除数据(Delete)
4.5 查询数据(Retrieve)
结语
引言
在软件开发中,数据库是存储、检索和操作数据的关键组件。MySQL作为一种广泛使用的数据库系统,提供了丰富的API接口,允许开发者通过不同的编程语言与其交互。本文将详细介绍如何使用MySQL的C语言API来实现数据库的基本增删改查(CRUD)操作。
一. MySQL C API简介
MySQL C API是一组函数,它们提供了对MySQL服务器的底层访问。通过这个API,开发者可以在C语言程序中执行SQL语句并处理结果。
二. MySQL C API核心函数
// 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 创建数据库并建立表
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
语句向数据库表中添加新记录。
#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
语句更新表中的现有记录。
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
语句从表中删除记录。
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
语句检索表中的数据。
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为理解数据库操作的细节提供了宝贵的视角。