数据库简介
关于数据库的基础知识这里就不做介绍了,相关博客可以查看:
上面博客都写的比较详细,本文主要介绍如何使用Qt进行数据库相关操作,数据库分为关系型数据库和非关系型数据,关系型数据库主要有Sqlite、MySQL、Oracle、SQLServer、PostgreSQL等,非关系型数据库主要有Redis、Cassandra、MongoDB等。这次主要介绍Qt使用SQlite数据库。
基础SQL操作
Qt使用数据库工程文件记得引入sql模块:
QT += sql
数据库初始化:
//查看支持的数据库驱动
for (const QString &driver : QSqlDatabase::drivers()) {
qDebug() << driver;
}
//建立数据库连接
m_Db = QSqlDatabase::addDatabase("QSQLITE");
//设置本地数据库文件
m_Db.setDatabaseName("test.db");
//打开数据库
if (!m_Db.open()) { qDebug() << "open db fail"; }
//创建表
QString execSql =
QString("create table if not exists testinfo(name varchar(64),id "
"varchar(64),createdate varchar(64))");
//遍历输出该数据库中所有表名
for (const QString &table : m_Db.tables()) { qDebug() << table; }
QSqlQuery query;
if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
上述代码中先查看数据库驱动,数据库驱动是应用程序和数据库之间的桥梁,提供访问数据库所需的工具和 API(应用程序编程接口)。查看程序输出打印:
Qt默认支持一些驱动,可以看到有SQlite,但是没有MySQL,如若要用Qt进行MySQL相关数据库操作则需额外安装相关驱动(本文不作介绍)。然后查看生成了对应的数据库文件test.db。
如何查看这个数据库文件了,我推荐使用DB browser for SQLite,使用比较简单,使用该软件打开对应数据库文件:
可以看到我们在代码中创建的表,点击"浏览数据":
数据库表数据相关操作,无非增删查改四种,界面添加对应按钮,编写对应槽函数代码。
增:
void MainWindow::on_insert_clicked() {
if (ui->name->text().isEmpty() || ui->id->text().isEmpty()) { return; }
if (!m_Db.isOpen()) { return; }
QString name = ui->name->text().trimmed();
QString id = ui->id->text().trimmed();
QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
QString execSql = QString("insert into testinfo (name,id, createdate) "
"values('%1', '%2', '%3')")
.arg(name)
.arg(id)
.arg(date);
QSqlQuery query;
if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}
输入数据点击添加按钮:
查看数据表内容:
可以看到一条数据已经成功添加。
删:
void MainWindow::on_delete_2_clicked() {
if (ui->name->text().isEmpty()) { return; }
if (!m_Db.isOpen()) { return; }
QString name = ui->name->text().trimmed();
QString execSql =
QString("delete from testinfo where name = '%1';").arg(name);
QSqlQuery query;
if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}
我在数据库中添加了一条数据,然后点击按钮删除对应指定name的数据
点击按钮后数据已删除:
查:
void MainWindow::on_select_clicked() {
QString name = ui->name->text();
QString id = ui->id->text();
QString execSql = QString();
if (name.isEmpty() && id.isEmpty()) {
execSql = QString("select * from testinfo");
} else if (!name.isEmpty() && id.isEmpty()) {
execSql = QString("select * from testinfo where name = '%1'").arg(name);
} else if (name.isEmpty() && !id.isEmpty()) {
execSql = QString("select * from testinfo where id = '%1'").arg(id);
} else {
execSql =
QString("select * from testinfo where name = '%1' and id = '%2'")
.arg(name)
.arg(id);
}
QSqlQuery query;
if (!query.exec(execSql)) {
qDebug() << query.lastError().text();
} else {
while (query.next()) {
QSqlRecord rec = query.record(); //获取列
QStringList vals;
for (int i = 0; i < rec.count(); ++i) {
vals.append(rec.value(i).toString());
}
ui->textEdit->append(vals.join(","));
}
}
}
执行效果不作演示。(select的where用法比较多,详细可以查看文章开头推荐的第一篇博客)
改:
void MainWindow::on_update_clicked() {
//修改指定name的id值
if (ui->name->text().isEmpty() || ui->id->text().isEmpty()) { return; }
if (!m_Db.isOpen()) { return; }
QString name = ui->name->text().trimmed();
QString id = ui->id->text().trimmed();
QString execSql = QString("update testinfo set id = '%1' where name = '%2'")
.arg(id)
.arg(name);
QSqlQuery query;
if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}
根据界面输入的name和id,将指定name的数据id改为指定值:
额外补充:删除表为:drop+表名,该操作会将表中所有数据以及表结果删除,如果只是想删除所有数据则为: truncate+表名。
事务
事务是一组操作的集合,这些操作被视为一个单一的工作单元。事务要么完成所有操作,要么取消所有操作,保持数据库在良好的状态下。
比如我现在要一次性插入多条数据,用事务如下编写:
void MainWindow::on_test_clicked() {
//使用事务添加100条数据
QStringList sqlList;
for (int i = 0; i < 100; ++i) {
QString execSql = QString("insert into testinfo (name,id, createdate) "
"values('%1', '%2', '%3')")
.arg(i)
.arg(i)
.arg(QDateTime::currentDateTime().toString(
"yyyy-MM-dd hh:mm:ss"));
sqlList.append(execSql);
}
if (!m_Db.isOpen()) { return; }
m_Db.transaction(); //开启事务
for (const QString &execSql : sqlList) {
QSqlQuery query(m_Db);
bool b = query.exec(execSql);
if (!b) {
m_Db.rollback(); //失败进行回滚
return;
}
}
m_Db.commit(); //事务提交
}
点击按钮后查看数据内容:
内容已添加。