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

目录

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)

运行前:

运行后:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值