MySQL笔记--Ubuntu安装MySQL并基于C++测试API

news2024/11/26 21:24:45

目录

1--安装MySQL

2--MySQL连接

3--代码案例


1--安装MySQL

# 安装MySQL-Server
sudo apt install mysql-server

# 设置系统启动时自动开启
sudo systemctl start mysql
# sudo systemctl enable mysql

# 检查MySQL运行状态
sudo systemctl status mysql

# 进入MySQL终端
sudo mysql

# 更改root密码为123456
alter user 'root'@'localhost' identified with mysql_native_password by '123456';

# 退出MySQL终端
exit

# 以root用户登录
mysql -u root -p

2--MySQL连接

① 首先安装依赖:

sudo apt-get install libmysqlclient-dev

② 测试连接:

先在终端创建一个测试数据库,并新建一个测试表:

# 进入MySQL终端
mysql -u root -p

# 创建数据库
create database test_by_ljf;

# 进入数据库
use test_by_ljf;

# 创建表
create table Stu_table(id int comment 'ID',
    name varchar(20) comment 'Name of Student',
    class varchar(10) comment 'Class of Student'
) comment 'Table of Student';

③ 测试代码:

// 包含头文件
#include <iostream>
#include <string>
#include <mysql/mysql.h>

// 定义数据库连接参数
const char* host = "127.0.0.1";
const char* user = "root";
const char* pw = "123456";
const char* database_name = "test_by_ljf";
const int port = 3306;

// 定义学生结构体
struct Student{
public:
    int student_id;
    std::string student_name;
    std::string class_id;
};

int main(int argc, char* argv[]){
    // 初始化
    MYSQL* con = mysql_init(NULL);

    // 连接
    if(!mysql_real_connect(con, host, user, pw, database_name, port, NULL, 0)){
        fprintf(stderr, "Failed to connect to database : Error:%s\n", mysql_error(con));
        return -1;
    }

    // 初始化插入的学生对象
    Student stu1{1, "big_clever", "class 1"};

    // 语法 "insert into 表名 (字段1, ...) values (值1, ...)""
    char sql[256];
    sprintf(sql, "insert into Stu_table (id, name, class) values (%d, '%s', '%s')",
        stu1.student_id, stu1.student_name.c_str(), stu1.class_id.c_str());
    
    // 插入学生对象
    if(mysql_query(con, sql)){
        fprintf(stderr, "Failed to insert data : Error:%s\n", mysql_error(con));
        return -1;
    }

    // 关闭连接
    mysql_close(con);

    return 0;
}

编译时需要加上 -lmysqlclient 依赖;

3--代码案例

案例分析:

        封装一个学生类,实现对上面学生表的增删改查操作;

头文件:

#pragma once
#include <mysql/mysql.h>
#include <iostream>
#include <string>
#include <vector>

// 定义学生结构体
struct Student{
public:
    int student_id;
    std::string student_name;
    std::string class_id;
};

class StudentManager{
    StudentManager(); // 构造函数
    ~StudentManager(); // 析构函数
public:
    static StudentManager* GetInstance(){ // 单例模式
        static StudentManager StudentManager;
        return &StudentManager;
    }
public:
    bool insert_student(Student& stu); // 插入
    bool update_student(Student& stu); // 更新
    bool delete_student(int student_id); // 删除
    std::vector<Student> get_student(std::string condition = ""); // 查询

private:
    MYSQL* con;
    // 定义数据库连接参数
    const char* host = "127.0.0.1";
    const char* user = "root";
    const char* pw = "123456";
    const char* database_name = "test_by_ljf";
    const int port = 3306;
};

源文件:

#include "StudentManager.h"

StudentManager::StudentManager(){
    this->con = mysql_init(NULL); // 初始化
    // 连接
    if(!mysql_real_connect(this->con, this->host, this->user, this->pw, this->database_name, this->port, NULL, 0)){
        fprintf(stderr, "Failed to connect to database : Error:%s\n", mysql_error(con));
        exit(1);
    }
}

StudentManager::~StudentManager(){
    // 关闭连接
    mysql_close(con);
}

bool StudentManager::insert_student(Student& stu){
    char sql[256];
    sprintf(sql, "insert into Stu_table (id, name, class) values (%d, '%s', '%s')",
        stu.student_id, stu.student_name.c_str(), stu.class_id.c_str());
    
    if(mysql_query(con, sql)){
        fprintf(stderr, "Failed to insert data : Error:%s\n", mysql_error(con));
        return false;
    }
    return true;
}

bool StudentManager::update_student(Student& stu){
    char sql[256];
    sprintf(sql, "update Stu_table set name = '%s', class = '%s'" "where id = %d",
        stu.student_name.c_str(), stu.class_id.c_str(), stu.student_id);

    if(mysql_query(con, sql)){
        fprintf(stderr, "Failed to update data : Error:%s\n", mysql_error(con));
        return false;
    }
    return true;
}

bool StudentManager::delete_student(int student_id){
    char sql[256];
    sprintf(sql, "delete from Stu_table where id = %d", student_id);
    
    if(mysql_query(con, sql)){
        fprintf(stderr, "Failed to delete data : Error:%s\n", mysql_error(con));
        return false;
    }
    return true;
}

std::vector<Student> StudentManager::get_student(std::string condition){
    char sql[256];
    sprintf(sql, "select * from Stu_table %s", condition.c_str());

    if(mysql_query(con, sql)){
        fprintf(stderr, "Failed to select data : Error:%s\n", mysql_error(con));
        return {};
    }

    std::vector<Student> stuList;
    MYSQL_RES* res = mysql_store_result(con);
    MYSQL_ROW row;
    while((row = mysql_fetch_row(res))){
        Student stu;
        stu.student_id = std::atoi(row[0]);
        stu.student_name = row[1];
        stu.class_id = row[2];
        stuList.push_back(stu);
    }
    return stuList;
}

测试函数:

#include <StudentManager.h>

int main(int argc, char* argv[]){
    Student stu2{2, "small clever", "class 2"};
    StudentManager::GetInstance()->insert_student(stu2); // 测试插入

    Student stu1{1, "big big clever", "class 1"}; // 测试更新
    StudentManager::GetInstance()->update_student(stu1);
    
    std::string condition = "where class = 'class 2'";
    std::vector<Student> res = StudentManager::GetInstance()->get_student(condition); // 测试查询
    for(Student stu_test : res){
        std::cout << "id: " << stu_test.student_id << " name: " << stu_test.student_name 
            << " class: " << stu_test.class_id << std::endl;
    }

    StudentManager::GetInstance()->delete_student(2); // 测试删除
    return 0;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)

project(Test)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_STANDARD 11)

include_directories(${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/include)
file(GLOB_RECURSE SRCS ${PROJECT_SOURCE_DIR}/src/*.cpp)

add_executable(main test.cpp ${SRCS})
target_link_libraries(main -lmysqlclient)

运行前:

运行后:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1160803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VR全景在医院的应用:缓和医患矛盾、提升医院形象

医患关系一直以来都是较为激烈的&#xff0c;包括制度的不完善、医疗资源紧张等问题也时有存在&#xff0c;为了缓解医患矛盾&#xff0c;不仅要提升患者以及家属对于医院的认知&#xff0c;还需要完善医疗制度&#xff0c;提高医疗资源的配置效率&#xff0c;提高服务质量。 因…

vue3的ref源码解析

ref的实现原理 一句话总结: ref本身是个函数&#xff0c;该函数返回一个createRef函数&#xff0c;createRef函数又返回一个“经过类RefImpl实例化”的对象。 详情介绍: ref函数接收我们传入的一个简单类型或复杂类型value&#xff0c;后又将value传递给createRef函数&#xf…

【K8S】二进制安装

常见的K8S安装部署方式 ●Minikube Minikube是一个工具&#xff0c;可以在本地快速运行一个单节点微型K8S&#xff0c;仅用于学习、预览K8S的一些特性使用。 部署地址&#xff1a;https://kubernetes.io/docs/setup/minikube ●Kubeadm☆ Kubeadm也是一个工具&#xff0c;提…

利用Docker容器化构建可移植的分布式应用程序

目录 一、什么是Docker容器化 二、构建可移植的分布式应用程序的优势 三、构建可移植的分布式应用程序的步骤 四、推荐一款软件开发工具 随着云计算和容器化技术的快速发展&#xff0c;将应用程序容器化成为构建可移植的分布式应用程序的一种重要方式。Docker作为目前最为…

批量采集各类自媒体平台内容为word文档带图片软件【支持18家自媒体平台的爬取采集】

批量采集各类自媒体平台内容为word文档带图片软件介绍&#xff1a; 1、支持头条号、大鱼号、企鹅号、一点号、凤凰号、搜狐号、网易号、趣头条、东方号、时间号、惠头条、WiFi万能钥匙、新浪看点、简书、QQ看点、快传号、百家号、微信公众号的文章批量采集为docx文档并带图片。…

c++ Templates:The Complete Guide第二版英文版勘误

看到这里的时候觉得不对劲&#xff0c;一查&#xff0c;果然是写错了&#xff0c;Values应该改成Vs 12.4 Page 204, 12.4.2: s/Values is a nontype template parameter pack.../Vs is a nontype template parameter pack.../Page 204, 12.4.2: s/...provided for the templat…

CSS3设计动画样式

CSS3动画包括过渡动画和关键帧动画&#xff0c;它们主要通过改变CSS属性值来模拟实现。我将详细介绍Transform、Transitions和Animations 3大功能模块&#xff0c;其中Transform实现对网页对象的变形操作&#xff0c;Transitions实现CSS属性过渡变化&#xff0c;Animations实现…

嵌入式每日500(3)231103 (总线结构,存储器映射,启动配置,FLASH读、写、擦除介绍,CRC校验,选项字节,)

这里写目录标题 1.总线结构2.STM32F072VBT6存储器映射3.启动配置&#xff08;BOOT0&#xff0c;BOOT1&#xff09;4.FLASH存储器&#xff08;读、写、擦除&#xff09;5.CRC计算单元6.选项字节 1.总线结构 主模块&#xff08;2个&#xff09;Cortex-M0内核、DMA通道从模块&…

20.4 OpenSSL 套接字AES加密传输

在读者了解了加密算法的具体使用流程后&#xff0c;那么我们就可以使用这些加密算法对网络中的数据包进行加密处理&#xff0c;加密算法此处我们先采用AES算法&#xff0c;在网络通信中&#xff0c;只需要在发送数据之前对特定字符串进行加密处理&#xff0c;而在接收到数据后在…

【面试经典150 | 链表】随机链表的复制

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;哈希表递归方法二&#xff1a;哈希表方法三&#xff1a;迭代拆分节点 写在最后 Tag 【递归】【迭代】【链表】 题目来源 138. 随机链表的复制 题目解读 对一个带有随机指向的链表进行深拷贝操作。 解题思路 本题一共…

layui form表单 调整 label 宽度

这个可以调整所有label .layui-form-label {width: 120px !important; } .layui-input-block {margin-left: 150px !important; }情况是这样的&#xff0c;表单里有多个输入框&#xff0c;只有个别label 是长的&#xff0c;我就想调整一下个别长的&#xff0c;其它不变 <di…

小程序day02

目标 WXML模板语法 数据绑定 事件绑定 那麽問題來了&#xff0c;一次點擊會觸發兩個組件事件的話&#xff0c;該怎么阻止事件冒泡呢&#xff1f; 文本框和data的双向绑定 注意点: 只在标签里面用value“{{info}}”&#xff0c;只会是info到文本框的单向绑定&#xff0c;必须在…

1、循环依赖详解(一)

什么是循环依赖&#xff1f; 什么情况下循环依赖可以被处理&#xff1f; Spring是如何解决的循环依赖&#xff1f; 只有在setter方式注入的情况下&#xff0c;循环依赖才能解决&#xff08;错&#xff09; 三级缓存的目的是为了提高效率&#xff08;错&#xff09; 什么是循环…

在基于亚马逊云科技的湖仓一体架构上构建数据血缘的探索和实践

背景介绍 随着大数据技术的进步&#xff0c;企业和组织越来越依赖数据驱动的决策。数据的质量、来源及其流动性因此显得非常关键。数据血缘分析为我们提供了一种追踪数据从起点到终点的方法&#xff0c;有助于理解数据如何被转换和消费&#xff0c;同时对数据治理和合规性起到关…

Ajax学习笔记第8天

放弃该放弃的是无奈&#xff0c;放弃不该放弃的是无能&#xff0c;不放弃该放弃的是无知&#xff0c;不放弃不该放弃的是执着&#xff01; 【1. 聊天室小案例】 文件目录 初始mysql数据库 index.html window.location.assign(url); 触发窗口加载并显示指定的 url的内容 当前…

TSINGSEE青犀特高压输电线可视化智能远程监测监控方案

一、背景需求分析 特高压输电线路周边地形复杂&#xff0c;纵横延伸几十甚至几百千米&#xff0c;并且受所处地理环境和气候影响很大。传统输电线路检查主要依靠维护人员周期性巡视&#xff0c;缺乏一定的时效性&#xff0c;在巡视周期的真空期也不能及时掌握线路走廊外力变化…

AQS面试题总结

一&#xff1a;线程等待唤醒的实现方法 方式一&#xff1a;使用Object中的wait()方法让线程等待&#xff0c;使用Object中的notify()方法唤醒线程 必须都在synchronized同步代码块内使用&#xff0c;调用wait&#xff0c;notify是锁定的对象&#xff1b; notify必须在wait后执…

振弦式传感器读数模块VM5系列介绍

VM5系列是专门针对单线圈式振弦传感器研发&#xff0c;可完成传感器的线圈激励、频率读数、温度测量等工作&#xff0c;具有标准的 UART&#xff08;TTL/RS232/RS485&#xff09;和 IIC 数字接口、模拟量输出接口&#xff08;电压或电流&#xff09;&#xff0c;通过数字接口数…

【论文阅读笔记】GLM-130B: AN OPEN BILINGUAL PRE-TRAINEDMODEL

Glm-130b:开放式双语预训练模型 摘要 我们介绍了GLM-130B&#xff0c;一个具有1300亿个参数的双语(英语和汉语)预训练语言模型。这是一个至少与GPT-3(达芬奇)一样好的100b规模模型的开源尝试&#xff0c;并揭示了如何成功地对这种规模的模型进行预训练。在这一过程中&#xff0…

arcgis图上添加发光效果!

看完本文, 你可以不借助外部图片素材, 让你的图纸符号表达出你想要的光! 我们以之前的某个项目图纸为例,来介绍下让符号发光的技术! 第一步—底图整理 准备好栅格影像底图、行政边界的矢量数据,确保“数据合适、位置正确、边界吻合”。 确定好图纸的大小、出图比例、投…