当前位置:   article > 正文

Qt6教程之三(16) Qt使用mysql数据库_qt mysql

qt mysql

目录

一 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系统,直接使用该链接下载安装即可!

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

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

 安装过程:

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

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

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

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

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 ,命令如下,

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

 现在我们开始使用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

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

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能否连接成功!

五 测试MySQL与Qt的连接

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

  1. CMake:
  2. find_package(Qt6 COMPONENTS Sql REQUIRED)
  3. target_link_libraries(test_QtConnectMySQL PRIVATE Qt6::Sql)
  4. qmake:
  5. QT += sql

开始写代码:

  1. #include "mainwindow.h"
  2. #include "./ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent)
  4. : QMainWindow(parent)
  5. , ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. linkDatabase();
  9. }
  10. MainWindow::~MainWindow()
  11. {
  12. delete ui;
  13. }
  14. //连接数据库
  15. void MainWindow::linkDatabase()
  16. {
  17. QSqlDatabase database=QSqlDatabase::addDatabase("QMYSQL");
  18. database.setHostName("127.0.0.1");
  19. database.setPort(3307);
  20. database.setUserName("root");
  21. database.setPassword("123456");
  22. database.setDatabaseName("my_database");
  23. if(! database.open()){
  24. ui->statusbar->showMessage("连接MySQL失败: "+database.lastError().text());
  25. }else{
  26. ui->statusbar->showMessage("连接MySQL成功: "+database.databaseName());
  27. }
  28. }

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

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

Qt程序与MySQL数据的交互

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

Mainwindow.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QSqlDatabase>
  4. #include <QSqlError>
  5. #include <QSqlQuery>
  6. #include <QSqlRecord>
  7. #include <QMainWindow>
  8. QT_BEGIN_NAMESPACE
  9. namespace Ui { class MainWindow; }
  10. QT_END_NAMESPACE
  11. class MainWindow : public QMainWindow
  12. {
  13. Q_OBJECT
  14. public:
  15. MainWindow(QWidget *parent = nullptr);
  16. ~MainWindow();
  17. void showDriver();
  18. private slots:
  19. void linkDatabase(); //连接数据库
  20. void closeDatabase();//关闭数据库
  21. void query(); //从数据库中查询数据
  22. void insert(); //从数据库中新增数据
  23. void del();//从数据库中删除数据
  24. void update();//从数据库中修改数据
  25. void showData(); //实时展示数据
  26. private:
  27. Ui::MainWindow *ui;
  28. QSqlDatabase database;
  29. QSqlError sqlError;
  30. QSqlQuery *sqlQuery;
  31. QSqlRecord sqlRecord;
  32. };
  33. #endif // MAINWINDOW_H

Mainwindow.cpp

  1. #include "mainwindow.h"
  2. #include "./ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent)
  4. : QMainWindow(parent)
  5. , ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. showDriver();
  9. connect(ui->linkMySQL,SIGNAL(clicked(bool)),this,SLOT(linkDatabase()));
  10. connect(ui->DisMySQL,SIGNAL(clicked(bool)),this,SLOT(closeDatabase()));
  11. connect(ui->insert,SIGNAL(clicked(bool)),this,SLOT(insert()));
  12. connect(ui->del,SIGNAL(clicked(bool)),this,SLOT(del()));
  13. connect(ui->update,SIGNAL(clicked(bool)),this,SLOT(update()));
  14. connect(ui->query,SIGNAL(clicked(bool)),this,SLOT(showData()));
  15. }
  16. MainWindow::~MainWindow()
  17. {
  18. delete ui;
  19. closeDatabase(); //程序退出前关闭数据库
  20. delete sqlQuery;
  21. }
  22. void MainWindow::showDriver()
  23. {
  24. QStringList list=database.drivers();
  25. ui->showData->append("Qt支持的驱动有:");
  26. for (int var = 0; var < list.length(); ++var) {
  27. ui->showData->append(list[var]);
  28. }
  29. }
  30. //连接数据库
  31. void MainWindow::linkDatabase()
  32. {
  33. database=QSqlDatabase::addDatabase("QMYSQL");
  34. database.setHostName("127.0.0.1");
  35. database.setPort(3307);
  36. database.setUserName("root");
  37. database.setPassword("123456");
  38. database.setDatabaseName("my_database");
  39. if(database.open()){
  40. ui->showData->append("连接MySQL成功: "+database.databaseName());
  41. //当只有一个数据库时,我们需要把sqlQuery类与数据库进行绑定,不然会执行语句失败和导入驱动失败
  42. sqlQuery=new QSqlQuery("my_database");
  43. }else{
  44. ui->showData->append("连接MySQL失败: "+database.lastError().text());
  45. }
  46. }
  47. //关闭数据库
  48. void MainWindow::closeDatabase()
  49. {
  50. if(database.isOpen()){
  51. database.close();
  52. ui->showData->append("数据库已经断开连接!");
  53. }
  54. }
  55. //查询操作
  56. void MainWindow::query()
  57. {
  58. /*
  59. 在使用自定义数据连接后,发生了数据库连接成功,但是查询失败
  60. Succeed to connect local database.
  61. QSqlQuery::exec: database not open
  62. QSqlError("", "Driver not loaded", "Driver not loaded")
  63. 将 query 与特定的数据库绑定便可解决上述问题
  64. //QSqlQuery sqlQuery("my_database");
  65. */
  66. //获取表格所有字段名称
  67. QString AllCharNameSql=QString("select COLUMN_NAME from information_schema.COLUMNS where table_name = 'student';");
  68. //ui->showData->append("查询表格的所有字段名称的语句为:"+AllCharNameSql);
  69. //开始查询,并判断是否执行成功
  70. if(sqlQuery->exec(AllCharNameSql)) {
  71. qDebug()<<"查询结果的条数:"+QString::number(sqlQuery->size());
  72. //获取查询到的数据
  73. ui->showData->append("查询到的字段为:");
  74. while (sqlQuery->next()) {
  75. //根据下标找到对应字段的值
  76. ui->showData->append(sqlQuery->value(0).toString());
  77. }
  78. }else {
  79. ui->showData->append("查询失败:"+sqlQuery->lastError().text());
  80. }
  81. //获取数据库中的所有表名
  82. QString allTableName=QString("select table_name from information_schema.tables where table_schema='my_database';");
  83. //判断执行语句是否成功
  84. if(sqlQuery->exec(allTableName)){
  85. ui->showData->append("查询结果条数:"+QString::number(sqlQuery->size()));
  86. //遍历所有结果
  87. while(sqlQuery->next()){
  88. //根据下标找到对应字段值
  89. ui->showData->append(sqlQuery->value(0).toString());
  90. }
  91. }else {
  92. ui->showData->append("查询错误:"+sqlQuery->lastError().text());
  93. }
  94. //查询所有数据
  95. QString sql2=QString("select *from student;");
  96. if(sqlQuery->exec(sql2)){
  97. ui->showData->append("查找结果条数:"+QString::number(sqlQuery->size()));
  98. //遍历查询到的所有数据
  99. while (sqlQuery->next()) {
  100. ui->showData->append(sqlQuery->value("name").toString()); //姓名
  101. ui->showData->append(QString::number(sqlQuery->value("age").toInt())); //年龄
  102. ui->showData->append(sqlQuery->value("sex").toString()); //性别
  103. }
  104. }else{
  105. ui->showData->append("查询结果错误:"+sqlQuery->lastError().text());
  106. }
  107. //根据指定字段查询列信息
  108. QString sql3=QString("select name from student;");
  109. if(sqlQuery->exec(sql3)){
  110. ui->showData->append("查找结果数量:"+QString::number(sqlQuery->size()));
  111. //遍历所有数据
  112. while (sqlQuery->next()) {
  113. ui->showData->append(sqlQuery->value(0).toString());
  114. }
  115. }else{
  116. ui->showData->append("查询结果错误:"+sqlQuery->lastError().text());
  117. }
  118. }
  119. //插入数据
  120. void MainWindow::insert()
  121. {
  122. ui->showData->setText("");
  123. QString name=ui->name->text().trimmed();
  124. int age=ui->age->text().trimmed().toInt();
  125. QString sex=ui->sex->text().trimmed();
  126. //插入一条数据
  127. QString sql=QString( "insert into student(name,age,sex) values('%1',%2,'%3');").arg(name).arg(age).arg(sex);
  128. //判断是否执行成功
  129. if(sqlQuery->exec(sql)){
  130. ui->showData->append("插入数据数量:"+QString::number(sqlQuery->size()));
  131. //遍历查询到的所有数据
  132. while (sqlQuery->next()) {
  133. QString name,age,sex;
  134. name=sqlQuery->value("name").toString(); //姓名
  135. age=QString::number(sqlQuery->value("age").toInt()); //年龄
  136. sex=sqlQuery->value("sex").toString(); //性别
  137. ui->showData->append("name:"+name+" "+"age:"+age+" "+"sex:"+sex);
  138. }
  139. }else {
  140. ui->showData->append("插入数据失败"+sqlQuery->lastError().text());
  141. }
  142. }
  143. //删除数据
  144. void MainWindow::del()
  145. {
  146. ui->showData->setText("");
  147. //QString name=ui->name->text().trimmed();
  148. int age=ui->age->text().trimmed().toInt();
  149. //QString sex=ui->sex->text().trimmed();
  150. QString sql=QString("delete from student where age=%1;").arg(age);
  151. //开始执行查询语句
  152. if(sqlQuery->exec(sql)){
  153. ui->showData->append("删除成功");
  154. ui->showData->append("删除数据后的结果为:");
  155. //遍历查询到的所有数据
  156. while (sqlQuery->next()) {
  157. QString name,age,sex;
  158. name=sqlQuery->value("name").toString(); //姓名
  159. age=QString::number(sqlQuery->value("age").toInt()); //年龄
  160. sex=sqlQuery->value("sex").toString(); //性别
  161. ui->showData->append("name:"+name+" "+"age:"+age+" "+"sex:"+sex);
  162. }
  163. }else{
  164. ui->showData->append("删除数据失败:"+sqlQuery->lastError().text());
  165. }
  166. }
  167. //修改数据
  168. void MainWindow::update()
  169. {
  170. ui->showData->setText("");
  171. QString name=ui->name->text().trimmed();
  172. int age=ui->age->text().trimmed().toInt();
  173. //QString sex=ui->sex->text().trimmed();
  174. QString sql=QString("update student set name='%1' where age='%2';").arg(name).arg(age);
  175. //开始执行查询语句
  176. if(sqlQuery->exec(sql)){
  177. ui->showData->append("修改成功");
  178. ui->showData->append("修改数据后的结果为:");
  179. //遍历查询到的所有数据
  180. while (sqlQuery->next()) {
  181. QString name,age,sex;
  182. name=sqlQuery->value("name").toString(); //姓名
  183. age=QString::number(sqlQuery->value("age").toInt()); //年龄
  184. sex=sqlQuery->value("sex").toString(); //性别
  185. ui->showData->append("name:"+name+" "+"age:"+age+" "+"sex:"+sex);
  186. }
  187. }else{
  188. ui->showData->append("修改数据失败:"+sqlQuery->lastError().text());
  189. }
  190. }
  191. //查询所有数据
  192. void MainWindow::showData()
  193. {
  194. ui->showData->setText("");
  195. QString sql=QString("select *from student;");
  196. //开始执行查询语句
  197. if(sqlQuery->exec(sql)){
  198. ui->showData->append("查询成功");
  199. ui->showData->append("查询数据结果为:");
  200. //遍历查询到的所有数据
  201. while (sqlQuery->next()) {
  202. QString name,age,sex;
  203. name=sqlQuery->value("name").toString(); //姓名
  204. age=QString::number(sqlQuery->value("age").toInt()); //年龄
  205. sex=sqlQuery->value("sex").toString(); //性别
  206. ui->showData->append("name:"+name+" "+"age:"+age+" "+"sex:"+sex);
  207. }
  208. }else{
  209. ui->showData->append("查询数据失败:"+sqlQuery->lastError().text());
  210. }
  211. }

main.cpp

  1. #include "mainwindow.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. MainWindow w;
  7. w.show();
  8. return a.exec();
  9. }

界面布局与对象名称:

 

运行效果:

 

下一篇博客:

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

上一篇博客:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/173402?site
推荐阅读
相关标签
  

闽ICP备14008679号