深入探索MySQL C API:使用C语言操作MySQL数据库

目录

引言

[一. 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_rowsmysql_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为理解数据库操作的细节提供了宝贵的视角。

相关推荐
kejijianwen2 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
高兴就好(石5 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆6 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0666 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下6 小时前
Redis的配置与优化
数据库·redis·缓存
MuseLss7 小时前
Mycat搭建分库分表
数据库·mycat
Hsu_kk8 小时前
Redis 主从复制配置教程
数据库·redis·缓存
DieSnowK8 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
程序猿小D8 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa