内容提要
介绍数据库相关内容,了解连接数据库方法,掌握数据库的4种基本操作
主要内容
- 如何连接数据库
- 数据库的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 }