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命令行里面的

相关推荐
zpjing~.~21 分钟前
Mongo 分页判断是否有下一页
数据库
2401_8576009522 分钟前
技术与教育的融合:构建现代成绩管理系统
数据库·oracle
秋恬意1 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
潇湘秦1 小时前
一文了解Oracle数据库如何连接(1)
数据库·oracle
雅冰石1 小时前
oracle怎样使用logmnr恢复误删除的数据
数据库·oracle
web前端神器1 小时前
mongodb给不同的库设置不同的密码进行连接
数据库·mongodb
从以前1 小时前
Berlandesk 注册系统算法实现与解析
数据库·oracle
Muko_0x7d21 小时前
Mongodb
数据库·mongodb
Ren_xixi1 小时前
redis和mysql的区别
数据库·redis·mysql
m0_748233882 小时前
SQL语句整理五-StarRocks
数据库·sql