c++实现mysql关系型数据库连接与增删改查操作

最近老师让我实现这个功能,顺便发个东西,我感觉mysql从入门到精通这本书写的蛮好的,其实连接数据库就是调用mysql-c-api库里面的函数mysql_real_connect,下来的增删改查,也无非就是cmd命令台里面的语句,插入:insert into.....values......;删除:delete from.....;更新:update set......;查询:select*from......

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>

// 连接数据库函数
bool ConnectDatabase(MYSQL* mysql) {
    // 初始化数据库
    mysql_init(mysql);//初始化传入的 MYSQL 结构体,设置其内部状态为默认值,准备进行数据库连接

    // 设置字符编码
    mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "gbk");

    // 连接数据库
    if (mysql_real_connect(mysql, "127.0.0.1", "root", "Zyc679613", "db_test", 3306, NULL, 0) == NULL) {//3306端口号
        printf("错误原因: %s\n", mysql_error(mysql));
        printf("连接失败!\n");
        return false;
    }
    return true;
}

// 断掉数据库连接的函数
void DisconnectDatabase(MYSQL* mysql) {
    if (mysql != NULL) {
        mysql_close(mysql);//自带的关闭函数
    }
}

// 执行SQL查询并返回结果
MYSQL_RES* ExecuteQueryAndGetResult(MYSQL* mysql, const char* query) {
    if (mysql_query(mysql, query)) {//mysql_query 是一个PHP函数,它用于执行一个MySQL数据库查询
        printf("Query failed: %s\n", mysql_error(mysql));
        return NULL;
    }
    return mysql_store_result(mysql);
}

// 插入数据函数
void InsertData(MYSQL* mysql, const char* books, const char* category, const char* user, int sale, const char* sort, const char* brands) {
    char query[256];//整一个足够大的字符数组
    snprintf(query, sizeof(query), "INSERT INTO tb_books (books, category, user, sale, sort, brands) VALUES ('%s', '%s', '%s', %d, '%s', '%s')",
        books, category, user, sale, sort, brands);//snprintf返回成功写入的字符,第一个参数指针,第二个大小,第三个格式化。
    if (mysql_query(mysql, query)) {//snprintf 将 SQL 插入语句格式化并写入到 query 数组中,sizeof(query) 确保了写入不会超过数组的大小,从而避免了潜在的安全问题。
        printf("Insert failed: %s\n", mysql_error(mysql));
    }
    else {
        printf("Insert successful!\n");
    }
}

// 查询数据函数,展示函数
void SelectData(MYSQL* mysql) {
    MYSQL_RES* res = ExecuteQueryAndGetResult(mysql, "SELECT * FROM tb_books");
    if (res) {//非空
        MYSQL_ROW row;//指向行数据的指针
        while ((row = mysql_fetch_row(res))) {//mysql_fetch_row 来逐行获取数据
            printf("ID: %s, Books: %s, Category: %s, User: %s, Sale: %s, Sort: %s, Brands: %s\n",
                row[0], row[1], row[2], row[3], row[4], row[5], row[6]);
        }
        mysql_free_result(res);//用于释放查询结果集的内存
    }
}

// 更新数据函数
void UpdateData(MYSQL* mysql, int id, const char* books, const char* category, const char* user, int sale, const char* sort, const char* brands) {
    char query[256];
   // 使用snprintf安全地构造SQL更新语句
    snprintf(query, sizeof(query), "UPDATE tb_books SET books = '%s', category = '%s', user = '%s', sale = %d, sort = '%s', brands = '%s' WHERE id = %d",
        books, category, user, sale, sort, brands, id);
    //更新
    if (mysql_query(mysql, query)) {
        printf("Update failed: %s\n", mysql_error(mysql));
    }
    else {
        printf("Update successful!\n");
    }
}

// 删除数据函数
void DeleteData(MYSQL* mysql, int id) {
    char query[256];
    snprintf(query, sizeof(query), "DELETE FROM tb_books WHERE id = %d", id);
    if (mysql_query(mysql, query)) {
        printf("Delete failed: %s\n", mysql_error(mysql));
    }
    else {  
        printf("Delete successful!\n");
    }
}

// 主函数
int main() {
    MYSQL mysql;// 声明MYSQL结构体变量用于数据库操作
    if (ConnectDatabase(&mysql)) {// 尝试连接数据库
        // 插入数据示例
        InsertData(&mysql, "张宇超自传", "人文科学类", "newuser", 10, "New Sort", "New Brands");

        // 查询数据
        printf("Data after insertion:\n");
        SelectData(&mysql);

        // 更新数据示例
        UpdateData(&mysql, 1, "更新后的Book", "更新后的Category", "updateduser", 20, "更新后的Sort", "更新后的Brands");

        // 再次查询数据以查看更新结果
        printf("Data after update:\n");
        SelectData(&mysql);

        // 删除数据示例
        DeleteData(&mysql, 1);

        // 最后查询数据以查看删除结果
        printf("Data after deletion:\n");
        SelectData(&mysql);

        // 断开连接
        DisconnectDatabase(&mysql);
    }

    system("pause");
    return 0;
}

结果如下:

也可以看看cmd命令行里面的

相关推荐
恣艺5 分钟前
Redis是什么?一篇讲透它的定位、特点与应用场景
数据库·redis·缓存
天天爱吃肉821810 分钟前
【比亚迪璇玑架构深度解析:重新定义智能电动汽车的“整车智能”】
数据库·人工智能·嵌入式硬件·架构·汽车
一成码农21 分钟前
MySQL问题8
数据库·mysql
axban31 分钟前
QT M/V架构开发实战:M/V架构的初步认识
开发语言·数据库·qt
Dontla38 分钟前
Docker Compose healthcheck介绍(监控容器中服务的实际健康状态)数据库健康检查pg_isready
数据库·docker·容器
semantist@语校1 小时前
第十九篇|东京世界日本语学校的结构数据建模:制度函数、能力矩阵与升学图谱
数据库·人工智能·线性代数·矩阵·prompt·github·数据集
数巨小码人1 小时前
Oracle SQL调优技巧实战指南
数据库·sql·oracle
noravinsc1 小时前
在银河麒麟v10上安装达梦8数据库
服务器·数据库·oracle
没有bug.的程序员1 小时前
Redis 内存优化与压缩:从原理到实战的完整指南
java·数据库·redis·内存优化·压缩内存
零点零一1 小时前
`vcpkg` 微软开源的 C/C++ 包管理工具的使用和安装使用spdlog
c语言·c++·microsoft