Linux C/C++ 开发(学习笔记七):Mysql数据库C/C++编程实现 插入/读取/删除

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Linux C/C++ 开发(学习笔记七):Mysql数据库C/C++编程实现 插入/读取/删除

一、数据库建模与建库建表

用户admin登入mysql

创建一个数据库

create database KING_DB;#创建数据库
show databases;
use KING_DB;#使用数据库

在KING_DB数据库中创建一张表

create table TBL_USER(
  U_ID int primary key auto_increment,
    U_NAME varchar(32),
  U_GENDER varchar(8)
);

尝试插入一条数据

insert TBL_USER(U_NAME,U_GENDER) value('King','man');

二、安装libmysqlclient-dev

要用代码去操作数据库,需要安装一个mysql客户端工具,这样才可以在代码中使用

安装libmysqlclient-dev

sudo apt-get install libmysqlclient-dev

三、代码中实现SQL插入数据

#include<mysql.h>
#include<stdio.h>
#include<string.h>
#define KING_DB_SERVER_IP "192.168.192.128" //ip
#define KING_DB_SERVER_PORT 3306            //端口号
#define KING_DB_USERNAME "admin"            //用户名
#define KING_DB_PASSWORD "123456"           //密码
#define KING_DB_DEFAULTDB "KING_DB"         //数据库名
//SQL语句
#define SQL_INSERT_TBL_USER "insert TBL_USER(U_NAME,U_GENDER) value('Lee','man');"  
//C U R D  //create update read delete   传说中的:增删改查
int main(){
    MYSQL mysql;
    if(!mysql_init(&mysql)){//mysql初始化并判断是否出错(返回0为失败)
        printf("mysql_init:%s\n",mysql_error(&mysql));//mysql_error() 函数返回上一个 MySQL 操作产生的文本错误信息
        return -1;
    }
    if(!mysql_real_connect(&mysql,KING_DB_SERVER_IP,KING_DB_USERNAME,KING_DB_PASSWORD, 
    KING_DB_DEFAULTDB,KING_DB_SERVER_PORT,NULL,0)){ //连接mysql数据库,并判断是否出错(返回0为失败)
        printf("mysql_real_connect:%s\n",mysql_error(&mysql));
        return -2;
    }
    //Mysql -->insert
    if(mysql_real_query(&mysql,SQL_INSERT_TBL_USER,strlen(SQL_INSERT_TBL_USER))){ //(返回0为成功)
        printf("mysql_real_query:%s\n",mysql_error(&mysql));
    }
    mysql_close(&mysql);
    return 0;
}

四、代码中实现SQL查询操作

#include<mysql.h>
#include<stdio.h>
#include<string.h>
#define KING_DB_SERVER_IP "192.168.192.128" //ip
#define KING_DB_SERVER_PORT 3306            //端口号
#define KING_DB_USERNAME "admin"            //用户名
#define KING_DB_PASSWORD "123456"           //密码
#define KING_DB_DEFAULTDB "KING_DB"         //数据库名
//SQL语句
#define SQL_SELECT_TBL_USER "select * from TBL_USER;"
//第一步:要把sql语句发送给mysql服务器
//第二步:把mysql服务器处理结果接受回来,并保存
//第三步:接受的数据(判断多少行多少列)
//第四步:抓取我们想要的数据 
int king_mysql_select(MYSQL* handle){
    //mysql_real_query--->sql
    if(mysql_real_query(handle,SQL_SELECT_TBL_USER,strlen(SQL_SELECT_TBL_USER))){ //(返回0为成功)
        printf("mysql_real_query:%s\n",mysql_error(handle));
        return -1;
    }
    //store    当查询语句执行完之后,数据就已经接收到了管道的数据(mysql服务器发送的),因此要存储起来
    MYSQL_RES *res=mysql_store_result(handle);
    if(res==NULL){
        printf("mysql_store_result:%s\n",mysql_error(handle));
        return -2;
    }
    //rows/fields  行/列
    int rows=mysql_num_rows(res);
    printf("rows:%d\n",rows);
    int fields = mysql_num_fields(res);
    printf("fields:%d\n",fields);
    //fetch
    MYSQL_ROW row;//定义一行的数据
    while(row=mysql_fetch_row(res)){
        for(int i=0;i<fields;i++){
            printf("%s\t",row[i]);
        }
        printf("\n");
    }
    mysql_free_result(res);
    return 0;
}
//C U R D  //create update read delete   传说中的:增删改查
int main(){
    MYSQL mysql;
    if(!mysql_init(&mysql)){//mysql初始化并判断是否出错(返回0为失败)
        printf("mysql_init:%s\n",mysql_error(&mysql));//mysql_error() 函数返回上一个 MySQL 操作产生的文本错误信息
        return -1;
    }
    if(!mysql_real_connect(&mysql,KING_DB_SERVER_IP,KING_DB_USERNAME,KING_DB_PASSWORD, 
    KING_DB_DEFAULTDB,KING_DB_SERVER_PORT,NULL,0)){ //连接mysql数据库,并判断是否出错(返回0为失败)
        printf("mysql_real_connect:%s\n",mysql_error(&mysql));
        return -2;
    }
    //Mysql-->select
    king_mysql_select(&mysql);
    mysql_close(&mysql);
    return 0;
}

五、代码中实现SQL数据删除(以及存储过程调用)

要根据主键删除才是安全的,因为其他键可能会出现重复,不安全

如果直接执行下面这句会报错,因为不安全。

delete from TBL_USER where U_NAME='Dog';

如果非要这样操作,则需要进入安全模式

set SQL_SAFE_UPDATES=0;
delete from TBL_USER where U_NAME='Dog';
set SQL_SAFE_UPDATES=1;

但是如何把这三句话放入一个sql语句中呢

使用存储过程的方式,将语句打包在一起。

主要还要DELIMITER作为定界符,随意取什么符号@@、$$都行

MySQL创建存储过程(CREATE PROCEDURE)

DELIMITER @@    
create procedure PROC_DELETE_USER(in UNAME varchar(32))
begin
set SQL_SAFE_UPDATES=0;
delete from TBL_USER where U_NAME=UNAME;
set SQL_SAFE_UPDATES=1;
end@@

在该数据库定义好该函数后,以后一直都可以使用。

只需要调用下面就行了

CALL PROC_DELETE_USER('Dog');

完整代码

#include<mysql.h>
#include<stdio.h>
#include<string.h>
#define KING_DB_SERVER_IP "192.168.192.128" //ip
#define KING_DB_SERVER_PORT 3306            //端口号
#define KING_DB_USERNAME "admin"            //用户名
#define KING_DB_PASSWORD "123456"           //密码
#define KING_DB_DEFAULTDB "KING_DB"         //数据库名
//SQL语句
#define SQL_INSERT_TBL_USER "insert TBL_USER(U_NAME,U_GENDER) value('Lee','man');"  
#define SQL_SELECT_TBL_USER "select * from TBL_USER;"
#define SQL_DELETE_TBL_USER "CALL PROC_DELETE_USER('Dog');"
//******查询******///
//第一步:要把sql语句发送给mysql服务器
//第二步:把mysql服务器处理结果接受回来,并保存
//第三步:接受的数据(判断多少行多少列)
//第四步:抓取我们想要的数据 
int king_mysql_select(MYSQL* handle){
    //mysql_real_query--->sql
    if(mysql_real_query(handle,SQL_SELECT_TBL_USER,strlen(SQL_SELECT_TBL_USER))){ //(返回0为成功)
        printf("mysql_real_query:%s\n",mysql_error(handle));
        return -1;
    }
    //store    当查询语句执行完之后,数据就已经接收到了管道的数据(mysql服务器发送的),因此要存储起来
    MYSQL_RES *res=mysql_store_result(handle);
    if(res==NULL){
        printf("mysql_store_result:%s\n",mysql_error(handle));
        return -2;
    }
    //rows/fields  行/列
    int rows=mysql_num_rows(res);
    printf("rows:%d\n",rows);
    int fields = mysql_num_fields(res);
    printf("fields:%d\n",fields);
    //fetch
    MYSQL_ROW row;//定义一行的数据
    while(row=mysql_fetch_row(res)){
        for(int i=0;i<fields;i++){
            printf("%s\t",row[i]);
        }
        printf("\n");
    }
    mysql_free_result(res);
    return 0;
}
//C U R D  //create update read delete   传说中的:增删改查
int main(){
    MYSQL mysql;
    if(!mysql_init(&mysql)){//mysql初始化并判断是否出错(返回0为失败)
        printf("mysql_init:%s\n",mysql_error(&mysql));//mysql_error() 函数返回上一个 MySQL 操作产生的文本错误信息
        return -1;
    }
    if(!mysql_real_connect(&mysql,KING_DB_SERVER_IP,KING_DB_USERNAME,KING_DB_PASSWORD, 
    KING_DB_DEFAULTDB,KING_DB_SERVER_PORT,NULL,0)){ //连接mysql数据库,并判断是否出错(返回0为失败)
        printf("mysql_real_connect:%s\n",mysql_error(&mysql));
        return -2;
    }
#if 0
    //Mysql->select
    king_mysql_select(&mysql);
#endif
#if 0
    //Mysql -->insert
    if(mysql_real_query(&mysql,SQL_INSERT_TBL_USER,strlen(SQL_INSERT_TBL_USER))){ //(返回0为成功)
        printf("mysql_real_query:%s\n",mysql_error(&mysql));
    }
#endif
#if 1
    //mysql-->delete
    if(mysql_real_query(&mysql,SQL_DELETE_TBL_USER,strlen(SQL_DELETE_TBL_USER))){ //(返回0为成功)
        printf("mysql_real_query:%s\n",mysql_error(&mysql));
    }
#endif
    mysql_close(&mysql);
    return 0;
}

六、补充

1.mysql.h在vscode中导入并正确编译

查找头文件位置

mysql_config --cflags

查找链接库位置

mysql_config --libs

因此只要将下面,插入到vscode编译指令中即可

“-I/usr/include/mysql”,

“-lmysqlclient”,

在vscode中,另外还要加入头文件,不然编辑器会显示红字,特别难受

ctrl+shift+p 选择Edit Configuration(UI)

包含路径添加,这样就不会有红字了

于是就能编译成功了


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
48 17
|
1月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
59 26
|
3月前
|
存储 JSON 测试技术
【HarmonyOS Next开发】云开发-云数据库(二)
实现了云侧和端侧的云数据库创建、更新、修改等操作。这篇文章实现调用云函数对云数据库进行增删改查。
77 9
【HarmonyOS Next开发】云开发-云数据库(二)
|
2月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
90 2
|
3月前
|
SQL 关系型数据库 API
HarmonyOs开发:关系型数据库封装之增删改查
每个方法都预留了多种调用方式,比如使用callback异步回调或者使用Promise异步回调,亦或者同步执行,大家在使用的过程中,可以根据自身业务需要进行选择性调用,也分别暴露了成功和失败的方法,可以针对性的判断在执行的过程中是否执行成功。
137 13
|
3月前
|
关系型数据库 MySQL Linux
Linux下mysql数据库的导入与导出以及查看端口
本文详细介绍了在Linux下如何导入和导出MySQL数据库,以及查看MySQL运行端口的方法。通过这些操作,用户可以轻松进行数据库的备份与恢复,以及确认MySQL服务的运行状态和端口。掌握这些技能,对于日常数据库管理和维护非常重要。
164 8
|
3月前
|
存储 前端开发 关系型数据库
鸿蒙开发:实现键值数据库存储
对于数据量比较的小的,我们直接选择轻量级的用户首选项方式即可,而对于数据量比较大的情况下,直接可以使用数据库,而对于相对来说,比较大的数据,我们就可以使用键值型数据库方式
121 2
|
Linux C++
C++ 调用Linux系统命令
一个简单的C++程序,Test函数用来测试调用Linux的系统命令ls -l #include #include #include #include #include #include using namespace std; const i...
2223 0
|
22天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
4天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
30 6