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

简介: 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)

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

于是就能编译成功了


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
Java 关系型数据库 MySQL
在Linux平台上进行JDK、Tomcat、MySQL的安装并部署后端项目
现在,你可以通过访问http://Your_IP:Tomcat_Port/Your_Project访问你的项目了。如果一切顺利,你将看到那绚烂的胜利之光照耀在你的项目之上!
703 41
|
开发框架 Java 关系型数据库
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
959 17
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
723 18
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
705 28
|
安全 算法 Ubuntu
Linux(openssl)环境:编程控制让证书自签的技巧。
总结:在Linux环境中,OpenSSL是一个非常实用的工具,可以帮助我们轻松地生成自签名证书。通过上述三个简单步骤,即可为内部网络、测试环境或开发环境创建自签名证书。但在公共访问场景下,建议购买经过权威认证机构签发的证书,以避免安全警告。
802 13
|
关系型数据库 MySQL Java
安装和配置JDK、Tomcat、MySQL环境,以及如何在Linux下更改后端端口。
遵循这些步骤,你可以顺利完成JDK、Tomcat、MySQL环境的安装和配置,并在Linux下更改后端端口。祝你顺利!
835 11
|
开发框架 关系型数据库 Java
Linux操作系统中JDK、Tomcat、MySQL的完整安装流程以及J2EE后端接口的部署
然后Tomcat会自动将其解压成一个名为ROOT的文件夹。重启Tomcat,让新“植物”适应新环境。访问http://localhost:8080/yourproject看到你的项目页面,说明“植物”种植成功。
474 10
|
关系型数据库 MySQL Linux
查看Linux、Apache、MySQL、PHP版本的技巧
以上就是查看Linux、Apache、MySQL、PHP版本信息的方法。希望这些信息能帮助你更好地理解和使用你的LAMP技术栈。
774 17
|
Oracle 关系型数据库 MySQL
Oracle linux 8 二进制安装 MySQL 8.4企业版
Oracle linux 8 二进制安装 MySQL 8.4企业版
716 1
|
JavaScript Ubuntu Linux
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。