目录
一 MySQL数据库简介
二 MySQL社区版下载安装教程
三 建立数据库和表
四 准备MySQL的Qt连接驱动程序
五 测试MySQL与Qt的连接
六 Qt程序与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 :: Begin Your Download ,注意区分操作系统,博主使用的是window系统,直接使用该链接下载安装即可!
如果是其他系统,请在MySQL :: Download MySQL Installer 里面选择自己的操作系统下载,如下:
等待下载完成后, 双击安装包开始安装,如下:
安装过程:
1,选择自定义安装,点击下一步,
先在左边选择组件,然后在点击中间的绿色箭头,表示我们要安装这个组件,
4,设置自己想要安装的路径,如果不设置则默认安装到C盘下面,这里要特别注意一下。设置好之后点击OK,接下来的其他组件选择安装路径操作重复第3、4步即可。
5,设置完各个组件的安装路径后,点击下一步,
6,点击执行 execute,点击后需要大概5分钟左右的安装时间,等待全部组件安装完成,
7,全部组件安装完成后,继续点击下一步 next,
8,继续下一步 next,
9,设置一些选项,如果下一步next不可以点击的话,是因为端口有冲突,重新改一个可用的端口即可,我这里设置为3307,设置完成后继续下一步next,
10,默认使用密码方式,点击下一步next,
11,设置密码,两次输入的密码要一致,接着点击下一步next,
12,保持默认,继续点击下一步next,
13,设置MySQL相关的各种日志路径,点击右侧的三个小点来设置路径,
日志路径我这里是跟MySQL的组件安装路径设置为一致,设置完成后,继续下一步next,
14,保持默认,继续下一步next,
15,点击execute 执行,
执行完成后点击finish,
15,点击next,
16,保持默认,点击finish,
17,点击next,
输入之前我们设置的密码,并check一下,若密码验证通过,则出现一个绿色箭头,继续下一步,
18,点击execute执行,
等待执行完成后,点击finish,
19,点击下一步next,
接着点击finish,
至此,MySQL安装完成,此时会自动弹出MySQL客户端和MySQL workbench,如下
到这里,恭喜大家,你的MySQL环境安装完成了,可以准备后面的Qt交互开发工作了。
首先我们启动MySQL的命令行客户端,
启动后,输入安装时配置的密码,敲击回车确认,如下:
接着创建一个数据库,叫my_database ,命令是create database my_database ;
接着,我们查看一下数据库表,是否存在my_database数据库,命令是show databases;
接下来, 使用my_database数据库,并在数据中创建一个表,叫my_table ,命令如下,
use my_database; create table student( name char(10), //姓名 age smallint, //年龄 sex char(2)); //性别
现在我们开始使用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
然后把下载的文件解压,得到一个文件夹,如箭头所示:
将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 ;
将qsqlmysql.dll_Qt_SQL_driver_6.2.4_MinGW_11.2.0_64-bit\release\sqldrivers\qsqlmysql.dll及.debug文件拷贝到对应编译器plugins/sqldrivers目录下,
若Qt Qcreator已经启动,则重启之后才能使用,下面开始新建一个工程,测试一下看看MySQL能否连接成功!
我们新建一个工程叫test_QtConnectMySQL ,并在工程文件中导入数据库模块,根据不同的构建器写入,博主新建项目时选择的是CMake,下面是两种构建器导入模块的写法,写完之后记得按CTRL+S保存:
CMake: find_package(Qt6 COMPONENTS Sql REQUIRED) target_link_libraries(test_QtConnectMySQL PRIVATE Qt6::Sql) qmake: QT += sql
开始写代码:
#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()); } }
运行代码后,提示数据库连接成功,说明上面的所有配置正确,
接下来我们将在工程中实现数据库的增删改查,同时把操作的数据实时显示出来。
本实例主要实现操作数据库里面的数据的增加、删除、修改、查询功能,完整代码如下:
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" #includeint main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
界面布局与对象名称:
运行效果:
下一篇博客:
Qt6教程之三(17) SQLite数据库使用_折腾猿王申兵的博客-CSDN博客
上一篇博客:
Qt6教程之三(15) Modbus通信_折腾猿王申兵的博客-CSDN博客