數據庫簡介
關于數據庫的基礎知識這里就不做介紹了,相關博客可以查看:
SQL基礎知識
數據庫學霸筆記
上面博客都寫的比較詳細,本文主要介紹如何使用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(); //事務提交
}
點擊按鈕后查看數據內容:
?
內容已添加。?