Qt6教程之三(16) Qt使用mysql数据库
作者:mmseoamin日期:2023-12-05

目录

一 MySQL数据库简介

二 MySQL社区版下载安装教程

三 建立数据库和表

四 准备MySQL的Qt连接驱动程序

五 测试MySQL与Qt的连接

六 Qt程序与MySQL数据的交互


一 MySQL数据库简介

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。

MySQL是数据库管理系统中的一种,是市面上最流行的数据库管理软件之一。据统计,MySQL是目前使用率最高的数据库管理软件,知名企业比如淘宝、网易、百度、新浪、Facebook等大部分互联网公司都在使用MySQL,而且不仅仅是互联网领域,许多游戏公司也在使用MySQL,比如劲舞团、魔兽世界之类我们熟知的游戏。甚至连中国移动、中国电网这样的知名国企也在使用MySQL。由此可知,MySQL的受众的非常广的。

二 MySQL社区版下载安装教程

官网下载地址:MySQL :: Begin Your Download ,注意区分操作系统,博主使用的是window系统,直接使用该链接下载安装即可!

Qt6教程之三(16) Qt使用mysql数据库,第1张

 如果是其他系统,请在MySQL :: Download MySQL Installer 里面选择自己的操作系统下载,如下:

Qt6教程之三(16) Qt使用mysql数据库,第2张

等待下载完成后, 双击安装包开始安装,如下:

Qt6教程之三(16) Qt使用mysql数据库,第3张

 安装过程:

1,选择自定义安装,点击下一步

Qt6教程之三(16) Qt使用mysql数据库,第4张

  1. 避免下次安装其他组件麻烦,我们把所有的组件全部安装。

先在左边选择组件,然后在点击中间的绿色箭头,表示我们要安装这个组件,

Qt6教程之三(16) Qt使用mysql数据库,第5张

  1. 依次选中右边的每一个组件根目录,点击下方的advanced options设置安装路径,

Qt6教程之三(16) Qt使用mysql数据库,第6张

4,设置自己想要安装的路径,如果不设置则默认安装到C盘下面,这里要特别注意一下。设置好之后点击OK,接下来的其他组件选择安装路径操作重复第3、4步即可。

Qt6教程之三(16) Qt使用mysql数据库,第7张

5,设置完各个组件的安装路径后,点击下一步,

Qt6教程之三(16) Qt使用mysql数据库,第8张

6,点击执行 execute,点击后需要大概5分钟左右的安装时间,等待全部组件安装完成,

Qt6教程之三(16) Qt使用mysql数据库,第9张

7,全部组件安装完成后,继续点击下一步 next,

Qt6教程之三(16) Qt使用mysql数据库,第10张

8,继续下一步 next,

Qt6教程之三(16) Qt使用mysql数据库,第11张

9,设置一些选项,如果下一步next不可以点击的话,是因为端口有冲突,重新改一个可用的端口即可,我这里设置为3307,设置完成后继续下一步next,

Qt6教程之三(16) Qt使用mysql数据库,第12张

10,默认使用密码方式,点击下一步next,

Qt6教程之三(16) Qt使用mysql数据库,第13张

11,设置密码,两次输入的密码要一致,接着点击下一步next,

Qt6教程之三(16) Qt使用mysql数据库,第14张

12,保持默认,继续点击下一步next,

Qt6教程之三(16) Qt使用mysql数据库,第15张

13,设置MySQL相关的各种日志路径,点击右侧的三个小点来设置路径,

Qt6教程之三(16) Qt使用mysql数据库,第16张

日志路径我这里是跟MySQL的组件安装路径设置为一致,设置完成后,继续下一步next,

Qt6教程之三(16) Qt使用mysql数据库,第17张

14,保持默认,继续下一步next,

Qt6教程之三(16) Qt使用mysql数据库,第18张

15,点击execute 执行,

Qt6教程之三(16) Qt使用mysql数据库,第19张

执行完成后点击finish,

Qt6教程之三(16) Qt使用mysql数据库,第20张

15,点击next,

Qt6教程之三(16) Qt使用mysql数据库,第21张

16,保持默认,点击finish,

Qt6教程之三(16) Qt使用mysql数据库,第22张

17,点击next,

Qt6教程之三(16) Qt使用mysql数据库,第23张

输入之前我们设置的密码,并check一下,若密码验证通过,则出现一个绿色箭头,继续下一步,

Qt6教程之三(16) Qt使用mysql数据库,第24张

18,点击execute执行,

Qt6教程之三(16) Qt使用mysql数据库,第25张

等待执行完成后,点击finish,

Qt6教程之三(16) Qt使用mysql数据库,第26张

19,点击下一步next,

Qt6教程之三(16) Qt使用mysql数据库,第27张

接着点击finish,

Qt6教程之三(16) Qt使用mysql数据库,第28张

至此,MySQL安装完成,此时会自动弹出MySQL客户端和MySQL workbench,如下

Qt6教程之三(16) Qt使用mysql数据库,第29张

Qt6教程之三(16) Qt使用mysql数据库,第30张

到这里,恭喜大家,你的MySQL环境安装完成了,可以准备后面的Qt交互开发工作了。

三 建立数据库和表

首先我们启动MySQL的命令行客户端,

Qt6教程之三(16) Qt使用mysql数据库,第31张

启动后,输入安装时配置的密码,敲击回车确认,如下:

Qt6教程之三(16) Qt使用mysql数据库,第32张

接着创建一个数据库,叫my_database ,命令是create database my_database ;

Qt6教程之三(16) Qt使用mysql数据库,第33张

接着,我们查看一下数据库表,是否存在my_database数据库,命令是show databases;

Qt6教程之三(16) Qt使用mysql数据库,第34张

接下来, 使用my_database数据库,并在数据中创建一个表,叫my_table ,命令如下,

 use my_database;
create table student(
name char(10),  //姓名
age smallint,   //年龄
sex char(2));   //性别

Qt6教程之三(16) Qt使用mysql数据库,第35张

 现在我们开始使用Qt代码来对这张表进行操作,也就是增删改查的操作。

四 准备MySQL的Qt连接驱动程序

在网站在以下网址中下载和当前Qt版本对应的驱动,

Releases · thecodemonkey86/qt_mysql_driver · GitHub 

博主使用的Qt版本是6.2.4 ,所以下载的驱动为下面的第一个(我使用的编译器是MinGW).

https://github.com/thecodemonkey86/qt_mysql_driver/files/8312271/qsqlmysql.dll_Qt_SQL_driver_6.2.4_MinGW_11.2.0_64-bit.zip

https://github.com/thecodemonkey86/qt_mysql_driver/files/8312273/qsqlmysql.dll_Qt_SQL_driver_6.2.4_MSVC2019_64-bit.zip

然后把下载的文件解压,得到一个文件夹,如箭头所示:

Qt6教程之三(16) Qt使用mysql数据库,第36张

将qsqlmysql.dll_Qt_SQL_driver_6.2.4_MinGW_11.2.0_64-bit\release\libmysql.dll拷贝到qt 对应编译器的bin目录下,即D:\Qt6.2\6.2.4\mingw_64\bin ; 

Qt6教程之三(16) Qt使用mysql数据库,第37张

Qt6教程之三(16) Qt使用mysql数据库,第38张

将qsqlmysql.dll_Qt_SQL_driver_6.2.4_MinGW_11.2.0_64-bit\release\sqldrivers\qsqlmysql.dll及.debug文件拷贝到对应编译器plugins/sqldrivers目录下,

Qt6教程之三(16) Qt使用mysql数据库,第39张

Qt6教程之三(16) Qt使用mysql数据库,第40张​ 

 若Qt Qcreator已经启动,则重启之后才能使用,下面开始新建一个工程,测试一下看看MySQL能否连接成功!

五 测试MySQL与Qt的连接

我们新建一个工程叫test_QtConnectMySQL ,并在工程文件中导入数据库模块,根据不同的构建器写入,博主新建项目时选择的是CMake,下面是两种构建器导入模块的写法,写完之后记得按CTRL+S保存:

CMake:
find_package(Qt6 COMPONENTS Sql REQUIRED)
target_link_libraries(test_QtConnectMySQL PRIVATE Qt6::Sql)
qmake:
QT += sql

Qt6教程之三(16) Qt使用mysql数据库,第41张

开始写代码:

#include "mainwindow.h"
#include "./ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    linkDatabase();
}
MainWindow::~MainWindow()
{
    delete ui;
}
//连接数据库
void MainWindow::linkDatabase()
{
  QSqlDatabase database=QSqlDatabase::addDatabase("QMYSQL");
  database.setHostName("127.0.0.1");
  database.setPort(3307);
  database.setUserName("root");
  database.setPassword("123456");
  database.setDatabaseName("my_database");
  if(! database.open()){
      ui->statusbar->showMessage("连接MySQL失败: "+database.lastError().text());
  }else{
      ui->statusbar->showMessage("连接MySQL成功: "+database.databaseName());
  }

}

 运行代码后,提示数据库连接成功,说明上面的所有配置正确,

Qt6教程之三(16) Qt使用mysql数据库,第42张

接下来我们将在工程中实现数据库的增删改查,同时把操作的数据实时显示出来。 

六 Qt程序与MySQL数据的交互

本实例主要实现操作数据库里面的数据的增加、删除、修改、查询功能,完整代码如下:

Mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include 
#include 
#include 
#include 
#include 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void showDriver();
private slots:
    void linkDatabase(); //连接数据库
    void closeDatabase();//关闭数据库
    void query();  //从数据库中查询数据
    void insert(); //从数据库中新增数据
    void del();//从数据库中删除数据
    void update();//从数据库中修改数据
    void showData(); //实时展示数据
private:
    Ui::MainWindow *ui;
    QSqlDatabase database;
    QSqlError sqlError;
    QSqlQuery *sqlQuery;
    QSqlRecord sqlRecord;
};
#endif // MAINWINDOW_H

Mainwindow.cpp

#include "mainwindow.h"
#include "./ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    showDriver();

    connect(ui->linkMySQL,SIGNAL(clicked(bool)),this,SLOT(linkDatabase()));
    connect(ui->DisMySQL,SIGNAL(clicked(bool)),this,SLOT(closeDatabase()));
    connect(ui->insert,SIGNAL(clicked(bool)),this,SLOT(insert()));
    connect(ui->del,SIGNAL(clicked(bool)),this,SLOT(del()));
    connect(ui->update,SIGNAL(clicked(bool)),this,SLOT(update()));
    connect(ui->query,SIGNAL(clicked(bool)),this,SLOT(showData()));
}
MainWindow::~MainWindow()
{
    delete ui;
    closeDatabase(); //程序退出前关闭数据库
    delete sqlQuery;
}
void MainWindow::showDriver()
{
    QStringList list=database.drivers();
    ui->showData->append("Qt支持的驱动有:");
    for (int var = 0; var < list.length(); ++var) {
        ui->showData->append(list[var]);
    }
}
//连接数据库
void MainWindow::linkDatabase()
{
    database=QSqlDatabase::addDatabase("QMYSQL");
    database.setHostName("127.0.0.1");
    database.setPort(3307);
    database.setUserName("root");
    database.setPassword("123456");
    database.setDatabaseName("my_database");
    if(database.open()){
        ui->showData->append("连接MySQL成功: "+database.databaseName());
        //当只有一个数据库时,我们需要把sqlQuery类与数据库进行绑定,不然会执行语句失败和导入驱动失败
        sqlQuery=new QSqlQuery("my_database");
    }else{
        ui->showData->append("连接MySQL失败: "+database.lastError().text());
    }

}
//关闭数据库
void MainWindow::closeDatabase()
{
    if(database.isOpen()){
        database.close();
        ui->showData->append("数据库已经断开连接!");
    }
}
//查询操作
void MainWindow::query()
{
    /*
    在使用自定义数据连接后,发生了数据库连接成功,但是查询失败
    Succeed to connect local database.
    QSqlQuery::exec: database not open
    QSqlError("", "Driver not loaded", "Driver not loaded")
    将 query 与特定的数据库绑定便可解决上述问题
    //QSqlQuery sqlQuery("my_database");
*/
    //获取表格所有字段名称
    QString AllCharNameSql=QString("select COLUMN_NAME from information_schema.COLUMNS where table_name = 'student';");
    //ui->showData->append("查询表格的所有字段名称的语句为:"+AllCharNameSql);
    //开始查询,并判断是否执行成功
    if(sqlQuery->exec(AllCharNameSql)) {
        qDebug()<<"查询结果的条数:"+QString::number(sqlQuery->size());
        //获取查询到的数据
        ui->showData->append("查询到的字段为:");
        while (sqlQuery->next()) {
            //根据下标找到对应字段的值
            ui->showData->append(sqlQuery->value(0).toString());
        }
    }else {
        ui->showData->append("查询失败:"+sqlQuery->lastError().text());
    }
    //获取数据库中的所有表名
    QString allTableName=QString("select table_name from information_schema.tables where table_schema='my_database';");
    //判断执行语句是否成功
    if(sqlQuery->exec(allTableName)){
        ui->showData->append("查询结果条数:"+QString::number(sqlQuery->size()));
        //遍历所有结果
        while(sqlQuery->next()){
            //根据下标找到对应字段值
            ui->showData->append(sqlQuery->value(0).toString());
        }
    }else {
        ui->showData->append("查询错误:"+sqlQuery->lastError().text());
    }
    //查询所有数据
    QString sql2=QString("select *from student;");
    if(sqlQuery->exec(sql2)){
         ui->showData->append("查找结果条数:"+QString::number(sqlQuery->size()));
        //遍历查询到的所有数据
        while (sqlQuery->next()) {
             ui->showData->append(sqlQuery->value("name").toString()); //姓名
             ui->showData->append(QString::number(sqlQuery->value("age").toInt())); //年龄
             ui->showData->append(sqlQuery->value("sex").toString()); //性别
        }
    }else{
        ui->showData->append("查询结果错误:"+sqlQuery->lastError().text());
    }
    //根据指定字段查询列信息
    QString sql3=QString("select name from student;");
    if(sqlQuery->exec(sql3)){
        ui->showData->append("查找结果数量:"+QString::number(sqlQuery->size()));
        //遍历所有数据
        while (sqlQuery->next()) {
            ui->showData->append(sqlQuery->value(0).toString());
        }
    }else{
        ui->showData->append("查询结果错误:"+sqlQuery->lastError().text());
    }
}
//插入数据
void MainWindow::insert()
{
    ui->showData->setText("");
    QString name=ui->name->text().trimmed();
    int age=ui->age->text().trimmed().toInt();
    QString sex=ui->sex->text().trimmed();
    //插入一条数据
   QString sql=QString( "insert into student(name,age,sex) values('%1',%2,'%3');").arg(name).arg(age).arg(sex);
   //判断是否执行成功
   if(sqlQuery->exec(sql)){
       ui->showData->append("插入数据数量:"+QString::number(sqlQuery->size()));
       //遍历查询到的所有数据
       while (sqlQuery->next()) {
           QString name,age,sex;
           name=sqlQuery->value("name").toString(); //姓名
           age=QString::number(sqlQuery->value("age").toInt()); //年龄
           sex=sqlQuery->value("sex").toString(); //性别
           ui->showData->append("name:"+name+"  "+"age:"+age+"  "+"sex:"+sex);
       }
   }else {
       ui->showData->append("插入数据失败"+sqlQuery->lastError().text());
   }
}
//删除数据
void MainWindow::del()
{
    ui->showData->setText("");
    //QString name=ui->name->text().trimmed();
    int age=ui->age->text().trimmed().toInt();
    //QString sex=ui->sex->text().trimmed();
    QString sql=QString("delete from student where age=%1;").arg(age);
    //开始执行查询语句
    if(sqlQuery->exec(sql)){
        ui->showData->append("删除成功");
        ui->showData->append("删除数据后的结果为:");
        //遍历查询到的所有数据
        while (sqlQuery->next()) {
            QString name,age,sex;
            name=sqlQuery->value("name").toString(); //姓名
            age=QString::number(sqlQuery->value("age").toInt()); //年龄
            sex=sqlQuery->value("sex").toString(); //性别
            ui->showData->append("name:"+name+"  "+"age:"+age+"  "+"sex:"+sex);
        }
    }else{
        ui->showData->append("删除数据失败:"+sqlQuery->lastError().text());
    }
}
//修改数据
void MainWindow::update()
{
    ui->showData->setText("");
    QString name=ui->name->text().trimmed();
    int age=ui->age->text().trimmed().toInt();
    //QString sex=ui->sex->text().trimmed();
    QString sql=QString("update student set name='%1' where age='%2';").arg(name).arg(age);
    //开始执行查询语句
    if(sqlQuery->exec(sql)){
        ui->showData->append("修改成功");
        ui->showData->append("修改数据后的结果为:");
        //遍历查询到的所有数据
        while (sqlQuery->next()) {
            QString name,age,sex;
            name=sqlQuery->value("name").toString(); //姓名
            age=QString::number(sqlQuery->value("age").toInt()); //年龄
            sex=sqlQuery->value("sex").toString(); //性别
            ui->showData->append("name:"+name+"  "+"age:"+age+"  "+"sex:"+sex);
        }
    }else{
        ui->showData->append("修改数据失败:"+sqlQuery->lastError().text());
    }
}
//查询所有数据
void MainWindow::showData()
{
    ui->showData->setText("");
    QString sql=QString("select *from student;");
    //开始执行查询语句
    if(sqlQuery->exec(sql)){
        ui->showData->append("查询成功");
        ui->showData->append("查询数据结果为:");
        //遍历查询到的所有数据
        while (sqlQuery->next()) {
            QString name,age,sex;
            name=sqlQuery->value("name").toString(); //姓名
            age=QString::number(sqlQuery->value("age").toInt()); //年龄
            sex=sqlQuery->value("sex").toString(); //性别
            ui->showData->append("name:"+name+"  "+"age:"+age+"  "+"sex:"+sex);
        }
    }else{
        ui->showData->append("查询数据失败:"+sqlQuery->lastError().text());
    }
}

main.cpp

#include "mainwindow.h"
#include 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

界面布局与对象名称:

Qt6教程之三(16) Qt使用mysql数据库,第43张

 

运行效果:

Qt6教程之三(16) Qt使用mysql数据库,第44张

 

下一篇博客:

Qt6教程之三(17) SQLite数据库使用_折腾猿王申兵的博客-CSDN博客

上一篇博客:

Qt6教程之三(15) Modbus通信_折腾猿王申兵的博客-CSDN博客