Qt 如何操作数据库SQL模块

发布时间 2024-01-08 11:09:58作者: 一杯清酒邀明月

内容提要

介绍数据库相关内容,了解连接数据库方法,掌握数据库的4种基本操作

主要内容

  1. 如何连接数据库
  2. 数据库的4大基本操作

1.如何连接数据库

1.1 先了解数据库驱动的作用

  Qt SQL模块是Qt提供的一个访问数据库的接口,支持多种平台下使用不同类型的数据库,在这个过程中,数据库驱动 起到了很大的作用,它负责与不同的数据库进行通信,有了数据库驱动,我们才能使用不同类型的数据库。

以下是Qt支持的数据库驱动

如何查看当前版本Qt支持的数据库驱动

step1 新建一个项目Qt widgets项目,名称为myDataBaseDrivers,基类为QWidget

step2 在项目的.pro文件中,增加一条语句

QT += sql

step3 在 widget.h 中,添加以下代码

1 #include <QtSql/QSqlDatabase>
2 #include <QDebug>

step4 在 widget.cpp 中,添加以下代码

qDebug() << QSqlDatabase::drivers();

此时程序应该是这样的

step5 Ctrl+r 运行程序,观察运行结果

 从结果可以看出,没有MYSQL数据库的驱动,那我现在想使用这个数据库是不行的,需要添加这个驱动。

1.2 连接数据库

要想连接数据库,我们可以通过QSqlDatabase类实现。连接的方法也很简单,参考下面的代码

1 // 创建一个数据库连接,指定数据库驱动
2 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

设置数据库信息

1 // 数据库连接需要设置的信息
2     db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑  
3     db.setDatabaseName("ceshi");// 数据库名    
4     db.setUserName("root");// 用户名    
5     db.setPassword("123456");// 密码
6     db.setPort(3306);// 端口号

连接数据库

 1 // 连接数据库
 2     bool ok = db.open();
 3 
 4     if (ok)
 5     {
 6         qDebug() << "database connect is ok";
 7     }
 8     else
 9     {
10         qDebug() << "database connect is fail";
11     }

此时程序应该是这样的

 Ctrl+r的运行结果是这样的

  另外需要注意的是,QSqlDatabase::​addDatabase()函数的第一个参数,是指定数据库的类型,如“QPSQL”,“QMYSQL”,第二个参数是 connectionName。如果在多线程里访问数据库,每个线程都需要使用不同的 connectionName,否则可能会出现错误。

为了便于使用,将上面的数据库连接封装成一个函数

widget.h文件修改,增加两个函数声明

1 private:
2     void createConnectionByName(const QString &connectionName); //使用自定义 connectionName 创建连接
3     QSqlDatabase getConnectionByName(const QString &connectionName);  // 使用自定义 connectionName 获取连接

widget.cpp文件修改,实现上述两个函数

 1 //使用自定义 connectionName 创建连接
 2 void Widget::createConnectionByName(const QString &connectionName){
 3 
 4     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", connectionName);
 5     // 数据库连接需要设置的信息
 6     db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
 7     db.setDatabaseName("ceshi");// 数据库名
 8     db.setUserName("root");// 用户名
 9     db.setPassword("123456");// 密码
10     db.setPort(3306);// 端口号
11 
12     // 连接数据库判断
13     bool ok = db.open();
14 
15     if (ok){
16         qDebug() << "database connect is ok";
17     } else {
18         qDebug() << "database connect is fail";
19     }
20 
21 }
22 
23 // 使用自定义 connectionName 获取连接
24 QSqlDatabase Widget::getConnectionByName(const QString &connectionName) {
25     // 获取数据库连接
26     return QSqlDatabase::database(connectionName);
27 }

函数调用

1 // 创建名为 firstConnect 的数据库连接
2     createConnectionByName("firstConnect");

修改后代码应该是这样的

2.数据库的4大基本操作

Qt里要执行SQL语句和浏览查询结果,通常使用QSqlQuery这个类来实现。

QSqlQuery常用函数整理

数据库SQL的几个常用的基本语法

2.1 增

增 操作就是想数据库中插入输入,在做增操作前,我们需要先建立一个数据库表,用于做增删改查操作测试。核心SQL语句是

insert into 表名 (字段名1,字段名2,...字段名N) value (值1,值2,...值N)

step1 在前面代码的基础上,向 widget.h 文件中,增加一个头文件

#include <QSqlQuery>

step2 在 widget.cpp 中,增加创建数据库表的语句

1 // 实例化QSqlQuery,用于执行sql语句
2     QSqlQuery query(db);
3     // 创建一个表
4     query.exec("create table newUser (id int primary key,username varchar(20))");

创建的这个表很简单,只有id和uername两项信息

step3 在 widget.h 增加函数声明

1 private:
2     void insertUserName(QSqlDatabase db,const int &userid, const QString &name); // 增操作

step4 在 widget.cpp 实现增函数,用名称绑定的方式实现

 1 /*
 2  * 功能描述:数据增操作
 3  * 向数据库中插入一条数据记录,名称绑定的方式实现
 4  * @param QSqlDatabase:数据库连接
 5  * @param id:用户id
 6  * @param username:用户名
 7  */
 8 void Widget::insertUserName(QSqlDatabase db,const int &userid, const QString &name) {
 9     QSqlQuery query(db);
10     query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
11     query.bindValue(":id", userid);
12     query.bindValue(":username", name);
13     query.exec();
14 }

step5 向数据库表中增加数据,实现增操作

1 // [2]增操作
2     qDebug() << "---- insert operation start----";
3     insertUserName(db,1,"xiaoqiao");
4     insertUserName(db,2,"wang");
5     query.exec("INSERT INTO newUser (id, username) VALUES (3, 'alex')");
6     insertUserName(db,4,"lili");
7 
8     queryAllUser(db); // 查询增操作结果
9     qDebug() << "---- insert operation end----- " << "\n ";

插入一条数据记录可以使用名称绑定的方式,也是可以直接使用一条SQL语句的方式,当需要插入多条数据时,可以考虑用名称绑定的方式,这样不需要每次都写非常长的数据库指令,相对来说方便一些。

此是代码应该是这样的

 step6 ctrl+r 运行程序 使用后面查操作,可以看到增加到数据库的新数据记录

2.2 删

删操作就是从数据库中删除数据记录,核心SQL语句是

delete from 表名 where 删除条件

step1 在 widget.h 增加函数声明

1 private:
2     void deleteUser(QSqlDatabase db,const QString &username);// 删操作

step2 在 widget.cpp 实现删函数,用名称绑定的方式实现

 1 /*
 2  * 功能描述:数据删操作
 3  * 从数据库中删除一条数据,名称绑定的方式实现
 4  * @param QSqlDatabase:数据库连接
 5  * @param username:用户名
 6  */
 7 void Widget::deleteUser(QSqlDatabase db,const QString &username) {
 8     QSqlQuery query(db);
 9     query.prepare("DELETE FROM newUser WHERE username=:username");
10     query.bindValue(":username", username);
11     query.exec();
12 }

step3 调用刚才写的代码,实现删除记录操作

1 // [4]删操作
2     qDebug() << "---- delete operation start----";
3     deleteUser(db,"alex");
4     query.exec(" DELETE FROM newUser WHERE username='wang' ");
5 
6     queryAllUser(db);
7     qDebug() << "---- query operation end----" << "\n ";

两种方式删除记录,名称绑定的方式和直接使用SQL语句的方式

此时代码应该是这样的

step4 ctrl+r 运行程序

使用后面查操作,可以看到删操作后,数据库的记录变化

2.3 改

改操作就是修改数据库记录,核心SQL语句是

update 表名 set 字段名1=新值1,字段名2=新值2 where 条件语句

step1 在 widget.h 增加函数声明

1 private:
2       void updateUser(QSqlDatabase db,const int &id,const QString &username); // 更操作,修改数据

step2 在 widget.cpp 实现该操作函数

 1 /*
 2  * 功能描述:更新数据
 3  * 修改传入的 id 的 username
 4  * @param QSqlDatabase:数据库连接
 5  * @param id:用户id
 6  * @param username:用户名
 7  */
 8 void Widget::updateUser(QSqlDatabase db,const int &id,const QString &username) {
 9     QSqlQuery query(db);
10     query.prepare("update newUser set username=:username WHERE id=:id");
11     query.bindValue(":id", id);
12     query.bindValue(":username", username);
13     query.exec();
14 }

step3 调用刚才写的代码,实现查询记录操作

 1 // [5]改操作,根据id修改数据
 2     qDebug() << "---- update operation start----";
 3     qDebug() << "---- before update id 1: ----";
 4     queryAllUser(db);
 5 
 6     updateUser(db,1,"yase");// ID为1,数据修改为 yase
 7     query.exec(" update newUser set username='newname' WHERE id=4");
 8 
 9     qDebug() << "---- after update id 1: ----";
10     queryAllUser(db);
11     qDebug() << "---- update operation end----" << "\n ";

此时代码应该是这样的

 step4 ctrl+r 运行程序,查看结果

2.4 查

查操作就是查询数据库记录,核心SQL语句是

select * from 表名
select 字段名1,字段名2 from 表名 where 查询条件

step1 在 widget.h 增加函数声明

1 private:
2     void queryAllUser(QSqlDatabase db);    // 查操作,查询所有数据记录
3     void selectQueryUser(QSqlDatabase db,const QString &username);  // 查操作,直接执行SQL语句方式
4     void preparedQueryUser(QSqlDatabase db,const QString &username);// 查操作,名称绑定方式

step2 在 widget.cpp 实现查询函数

查询所有数据

 1 /*
 2  * 功能描述:数据查操作,查询所有数据
 3  * 执行SQL语句的方式,查询所有的用户数据记录
 4  * @param QSqlDatabase:数据库连接
 5  */
 6 void Widget::queryAllUser(QSqlDatabase db) {
 7     QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
 8     QSqlQuery query(db);                               // [1] 传入数据库连接
 9     query.exec(sql);                                   // [2] 执行sql语句
10     while (query.next()) {                             // [3] 遍历查询结果
11         qDebug() << QString("Id: %1, Username: %2")
12                     .arg(query.value("id").toInt())
13                     .arg(query.value("username").toString());
14     }
15 }

查询一条数据,直接用sql的方式

 1 /*
 2  * 功能描述:查询一条数据记录
 3  * 数据查操作,SQL语句的方式实现
 4  * @param QSqlDatabase:数据库连接
 5  * @param username:用户名
 6  */
 7 void Widget::selectQueryUser(QSqlDatabase db,const QString &username) {
 8     QString sql = "SELECT * FROM newUser WHERE username='" + username + "'";
 9     QSqlQuery query(db);    // [1] 传入数据库连接
10     query.exec(sql);        // [2] 执行sql语句
11     while (query.next()) {  // [3] 遍历查询结果
12         qDebug() << QString("Id: %1, Username: %2")
13                     .arg(query.value("id").toInt())
14                     .arg(query.value("username").toString());
15 
16     }
17 }

查询一条数据,名称绑定的方式

 1 /*
 2  * 功能描述:查询一条数据记录
 3  * 数据查操作,名称绑定的方式实现
 4  * @param QSqlDatabase:数据库连接
 5  * @param username:用户名
 6  */
 7 void Widget::preparedQueryUser(QSqlDatabase db,const QString &username) {
 8     QString sql = "SELECT * FROM newUser WHERE username=:username";
 9     QSqlQuery query(db);                    // [1] 传入数据库连接
10     query.prepare(sql);                     // [2] 使用名称绑定的方式解析 SQL 语句
11     query.bindValue(":username", username); // [3] 把占位符替换为传入的参数
12     query.exec();                           // [4] 执行数据库操作
13     while (query.next()) {                  // [5] 遍历查询结果
14         qDebug() << QString("Id: %1, Username: %2")
15                     .arg(query.value("id").toInt())
16                     .arg(query.value("username").toString());
17 
18     }
19 }

step3 调用刚才写的代码,实现查询记录操作

查询所有数据

1 qDebug() << "---- query all data start----- ";
2     queryAllUser(db); // 查询所有数据
3     qDebug() << "---- query all data end----- " << "\n ";

名称绑定的方式查询一条数据记录

preparedQueryUser(db,"wang");

直接用SQL语句的方式查询一条数据记录

selectQueryUser(db,"lili"); // 直接执行sql语句方式

此时代码应该是这样的

 step4 ctrl+r 运行程序

 以上只是简单的实现增删改查操作,实际开发应用的时候,会比这个复杂,但是基本的实现过程是一样的,想了解数据库的其他操作,可以找找数据库相关的文档看一下。

添附

myDataBaseDrivers 项目 widget.h 源码

 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3 
 4 #include <QWidget>
 5 #include <QtSql/QSqlDatabase>
 6 #include <QDebug>
 7 #include <QSqlQuery>
 8 
 9 QT_BEGIN_NAMESPACE
10 namespace Ui { class Widget; }
11 QT_END_NAMESPACE
12 
13 class Widget : public QWidget
14 {
15     Q_OBJECT
16 
17 public:
18     Widget(QWidget *parent = nullptr);
19     ~Widget();
20 
21 private:
22     void updateUser(QSqlDatabase db,const int &id,const QString &username);         // 更操作,修改数据
23     void queryAllUser(QSqlDatabase db);                                             // 查操作,查询所有数据记录
24     void selectQueryUser(QSqlDatabase db,const QString &username);                  // 查操作,直接执行SQL语句方式
25     void preparedQueryUser(QSqlDatabase db,const QString &username);                // 查操作,名称绑定方式
26     void deleteUser(QSqlDatabase db,const QString &username);                       // 删操作
27     void insertUserName(QSqlDatabase db,const int &userid, const QString &name);    // 增操作
28     void createConnectionByName(const QString &connectionName);                     //使用自定义 connectionName 创建连接
29     QSqlDatabase getConnectionByName(const QString &connectionName);                // 使用自定义 connectionName 获取连接
30 
31     Ui::Widget *ui;
32 
33 
34 };
35 #endif // WIDGET_H

myDataBaseDrivers 项目 widget.cpp 源码

  1 #include "widget.h"
  2 #include "ui_widget.h"
  3 
  4 Widget::Widget(QWidget *parent)
  5     : QWidget(parent)
  6     , ui(new Ui::Widget)
  7 {
  8     ui->setupUi(this);
  9 
 10     // 获取数据库驱动列表
 11     qDebug() << QSqlDatabase::drivers();
 12 
 13     // [1]创建名为 firstConnect 的数据库连接
 14     createConnectionByName("firstConnect");
 15     // 获取数据库
 16     QSqlDatabase db = getConnectionByName("firstConnect");
 17 
 18     // 实例化QSqlQuery,用于执行sql语句
 19     QSqlQuery query(db);
 20     // 创建一个表
 21     query.exec("create table newUser (id int primary key,username varchar(20))");
 22 
 23 
 24     // [2]增操作
 25     qDebug() << "---- insert operation start----";
 26     insertUserName(db,1,"xiaoqiao");
 27     insertUserName(db,2,"wang");
 28     query.exec("INSERT INTO newUser (id, username) VALUES (3, 'alex')");
 29     insertUserName(db,4,"lili");
 30 
 31     queryAllUser(db); // 查询增操作结果
 32     qDebug() << "---- insert operation end----- " << "\n ";
 33 
 34 
 35     // [3]查询操作
 36     qDebug() << "---- query operation start----- ";
 37     selectQueryUser(db,"lili"); // 直接执行sql语句方式
 38     preparedQueryUser(db,"wang");
 39     qDebug() << "---- query operation end----- " << "\n ";
 40 
 41     qDebug() << "---- query all data start----- ";
 42     queryAllUser(db); // 查询所有数据
 43     qDebug() << "---- query all data end----- " << "\n ";
 44 
 45 
 46     // [4]删操作
 47     qDebug() << "---- delete operation start----";
 48     deleteUser(db,"alex");
 49     query.exec(" DELETE FROM newUser WHERE username='wang' ");
 50 
 51     queryAllUser(db);
 52     qDebug() << "---- query operation end----" << "\n ";
 53 
 54 
 55     // [5]改操作,根据id修改数据
 56     qDebug() << "---- update operation start----";
 57     qDebug() << "---- before update id 1: ----";
 58     queryAllUser(db);
 59 
 60     updateUser(db,1,"yase");// ID为1,数据修改为 yase
 61     query.exec(" update newUser set username='newname' WHERE id=4");
 62 
 63     qDebug() << "---- after update id 1: ----";
 64     queryAllUser(db);
 65     qDebug() << "---- update operation end----" << "\n ";
 66 
 67 
 68     // 仅仅是测试需要,删除数据表中的所有数据,为了不影响下次运行程序观察结果
 69     query.exec(" DELETE FROM newUser");
 70 
 71 }
 72 
 73 
 74 /*
 75  * 功能描述:更新数据
 76  * 修改传入的 id 的 username
 77  * @param QSqlDatabase:数据库连接
 78  * @param id:用户id
 79  * @param username:用户名
 80  */
 81 void Widget::updateUser(QSqlDatabase db,const int &id,const QString &username) {
 82     QSqlQuery query(db);
 83     query.prepare("update newUser set username=:username WHERE id=:id");
 84     query.bindValue(":id", id);
 85     query.bindValue(":username", username);
 86     query.exec();
 87 }
 88 
 89 
 90 /*
 91  * 功能描述:数据查操作,查询所有数据
 92  * 执行SQL语句的方式,查询所有的用户数据记录
 93  * @param QSqlDatabase:数据库连接
 94  */
 95 void Widget::queryAllUser(QSqlDatabase db) {
 96     QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
 97     QSqlQuery query(db);                               // [1] 传入数据库连接
 98     query.exec(sql);                                   // [2] 执行sql语句
 99     while (query.next()) {                             // [3] 遍历查询结果
100         qDebug() << QString("Id: %1, Username: %2")
101                     .arg(query.value("id").toInt())
102                     .arg(query.value("username").toString());
103     }
104 }
105 
106 /*
107  * 功能描述:查询一条数据记录
108  * 数据查操作,SQL语句的方式实现
109  * @param QSqlDatabase:数据库连接
110  * @param username:用户名
111  */
112 void Widget::selectQueryUser(QSqlDatabase db,const QString &username) {
113     QString sql = "SELECT * FROM newUser WHERE username='" + username + "'";
114     QSqlQuery query(db);    // [1] 传入数据库连接
115     query.exec(sql);        // [2] 执行sql语句
116     while (query.next()) {  // [3] 遍历查询结果
117         qDebug() << QString("Id: %1, Username: %2")
118                     .arg(query.value("id").toInt())
119                     .arg(query.value("username").toString());
120 
121     }
122 }
123 
124 /*
125  * 功能描述:查询一条数据记录
126  * 数据查操作,名称绑定的方式实现
127  * @param QSqlDatabase:数据库连接
128  * @param username:用户名
129  */
130 void Widget::preparedQueryUser(QSqlDatabase db,const QString &username) {
131     QString sql = "SELECT * FROM newUser WHERE username=:username";
132     QSqlQuery query(db);                    // [1] 传入数据库连接
133     query.prepare(sql);                     // [2] 使用名称绑定的方式解析 SQL 语句
134     query.bindValue(":username", username); // [3] 把占位符替换为传入的参数
135     query.exec();                           // [4] 执行数据库操作
136     while (query.next()) {                  // [5] 遍历查询结果
137         qDebug() << QString("Id: %1, Username: %2")
138                     .arg(query.value("id").toInt())
139                     .arg(query.value("username").toString());
140 
141     }
142 }
143 
144 
145 
146 /*
147  * 功能描述:数据删操作
148  * 从数据库中删除一条数据,名称绑定的方式实现
149  * @param QSqlDatabase:数据库连接
150  * @param username:用户名
151  */
152 void Widget::deleteUser(QSqlDatabase db,const QString &username) {
153     QSqlQuery query(db);
154     query.prepare("DELETE FROM newUser WHERE username=:username");
155     query.bindValue(":username", username);
156     query.exec();
157 }
158 
159 
160 /*
161  * 功能描述:数据增操作
162  * 向数据库中插入一条数据记录,名称绑定的方式实现
163  * @param QSqlDatabase:数据库连接
164  * @param id:用户id
165  * @param username:用户名
166  */
167 void Widget::insertUserName(QSqlDatabase db,const int &userid, const QString &name) {
168     QSqlQuery query(db);
169     query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
170     query.bindValue(":id", userid);
171     query.bindValue(":username", name);
172     query.exec();
173 }
174 
175 
176 /*
177  * 功能描述:创建数据库连接
178  * 使用自定义 connectionName 创建连接
179  * @param connectionName:连接的名称
180  */
181 void Widget::createConnectionByName(const QString &connectionName){
182 
183     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", connectionName);
184     // 数据库连接需要设置的信息
185     db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
186     db.setDatabaseName("ceshi");// 数据库名
187     db.setUserName("root");// 用户名
188     db.setPassword("123456");// 密码
189     db.setPort(3306);// 端口号
190 
191     // 连接数据库判断
192     bool ok = db.open();
193 
194     if (ok){
195         qDebug() << "database connect is ok";
196     } else {
197         qDebug() << "database connect is fail";
198     }
199 
200 }
201 
202 /*
203  * 功能描述:获取数据库连接
204  * 使用自定义 connectionName 获取连接
205  * @param connectionName:连接的名称
206  * @return 返回一个数据库连接
207  */
208 QSqlDatabase Widget::getConnectionByName(const QString &connectionName) {
209     // 获取数据库连接
210     return QSqlDatabase::database(connectionName);
211 }
212 
213 
214 
215 Widget::~Widget()
216 {
217     delete ui;
218 }