QT学习日记17——Qt数据库

学习视频链接

2021新版QT图形框架编程开发(层层到肉)_C++图形用户界面开发框架_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Wf4y1Y7uh?p=19&spm_id_from=pageDriver&vd_source=0471cde1c644648fafd07b54e303c9052021-sqlite3数据库快速入门_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rf4y187oC?p=7&spm_id_from=pageDriver&vd_source=0471cde1c644648fafd07b54e303c905

目录

一、数据库简介

1.1 概念

1.2 相关术语

1.3 常见的数据库

1.4 数据库操作语言 (SQL)

1.5 Sqlite 数据库

1.6 Sqlite 工作原理

1.7 Sqlite 主要特性

二、配置和安装

三、Sqlite 的操作指令

3.1 常用命令

3.2 操作指令

3.3 Sqlite 命令行程序 (SQL语句)

四、在 Qt 中使用 Sqlite 数据库

4.1 QSqlQuery 执行数据库操作的 SQL 语句

4.2 QSqlQueryModel 获取结果集

4.3 QSqlDatabase 建立 Qt 应用程序和数据库连接

4.4 搭建项目

4.5 生成槽函数、添加头文件、声明变量和函数

4.6 编写函数


一、数据库简介

1.1 概念

数据库是指以一定方式存储在一起,能为多个用户共享,具有尽可能小的冗余特性,是与应用
程序彼此独立的数据集合

1.2 相关术语

DB 数据库(database)

DBMS 数据库管理系统

DBA 数据库管理员

RDB 关系式数据库

1.3 常见的数据库

1、商业数据库

甲骨文 Oracle

微软的 Sqlserver

IBM 的 DB2

2、非商业数据库

Sun 公司的 Mysq|,2009 年 sun 公司被 Oracle 收购,所以 mysql 现在属于甲骨文旗下的产品

开源的 SQLite,轻量级嵌入式关系型数据库

1.4 数据库操作语言 (SQL)

1、SQL概念

SQL (Structured Query Language) 是一种针对数据库的结构化查询语言,用于实现数据库查询和程序设计,常用于关系数据库系统,实现数据存取、查询、更新等操作。

2、常用的 SQL 语句

数据操作语言 (DML) : SELECT、INSERT、DELETE、UPDATE

数据定义语言 (DDL) : CREATE TABLE

1.5 Sqlite 数据库

SQLite 是一个轻量级的开源数据库,源代码完全公开不受版权限制,实现了自给自足的、无服务器、零配置的 SQL 数据库引擎,也是最广泛使用关系式数据库

SQLite (www.sqlite.org) 提供 SQLite 的已编译版本和源程序

1.6 Sqlite 工作原理

SQLite 引擎不是程序与之通信的独立进程,而是以静态库或共享库的方式连接到程序中,而不同于客户 - 服务器数据库连接方式,所以主要的使用方法是在编程语言内的直接 API 调用,当前主流的编程语言,如 C/C+、java、 python 等都提供了 sqlite 操作的 API 接口

SQLite 在资源消耗、实时性和可操作性有着出色的表现,整个数据库 (定义、表、索引和数据本身) 都在宿主主机上存储在一个单一的文件中,通常 SQLite 的工作是在开始一个事务的时候锁定整个数据文件而实现

1.7 Sqlite 主要特性

SQLite 不需要一个单独的服务器进程或操作的系统 (无服务器的)

SQLite 可以不用配置,安装或管理十分简单

SQLite 数据库是存储在一个单一的跨平台的磁盘文件

SQLite 是非常小的,是轻量级的,完全配置时小于 400 KB,省略可选功能配置时小于 250 KB

SQLite 是自给自足的,开发者不需要任何外部的依赖

SQLite 支持 SQL92 标准的大多数查询语言的功能

SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问

二、配置和安装

Linux 可以看学习视频链接第一个链接中的安装方式

Windows 可以进入下载网址 SQLite Download Pagehttps://www.sqlite.org/download.html

下载对应的两个压缩包 

QT学习日记17——Qt数据库_第1张图片

然后解压

QT学习日记17——Qt数据库_第2张图片

 把这个文件夹配置到环境变量里面,就可以在任意的位置进入数据库管理系统里面

QT学习日记17——Qt数据库_第3张图片

三、Sqlite 的操作指令

3.1 常用命令

.database 查看数据库的名字
.table 查看数据表的名字
.schema 查看数据表创建时信息
.mode 设置显示模式,如 tab/list/column/csv
.nullvalue 设置空白字段显示的字符串
.header on 显示数据表的表头

QT学习日记17——Qt数据库_第4张图片

 QT学习日记17——Qt数据库_第5张图片

QT学习日记17——Qt数据库_第6张图片 QT学习日记17——Qt数据库_第7张图片

 QT学习日记17——Qt数据库_第8张图片

 QT学习日记17——Qt数据库_第9张图片

 QT学习日记17——Qt数据库_第10张图片

3.2 操作指令

1、SQLite 命令行界面可以输入两种指令,一种是自身配置和格式控制相关指令,这些指令以 . 开头,另一种是 SQL 指令,以 ; 结束

2、输入 .help 获取 . 指令的帮助,输入 .exit 或者 .quit 退出命令界面,回到系统控制终端

3.3 Sqlite 命令行程序 (SQL语句)

1、创建数据表

CREATE TABLE 表名(列名1 类型[约束], 列名2 类型[约束], ...);

2、常用的类型

INT(整型)、 TEXT(字符串)、REAL(浮点数)

3、常用的约束

PRIMARYKEY (主键):表示该列数据唯一,可以加快数据访问

NOT NULL (非空):该列数据不能为空

实例

QT学习日记17——Qt数据库_第11张图片

4、删除数据表

DROP TABLE 表名;

注:慎用,数据表一旦删除里面数据也将随之消失.

实例

QT学习日记17——Qt数据库_第12张图片

5、向数据表中插入数据

INSERT INTO 表名(列名1, 列名2, ...) VALUES(数值1, 数值2, ...);

如果要为表中的所有列添加值,并且插入列的顺序和创建表的顺序相同,可以不需要在 Sqlite 查询中指定列名

INSERT INTO 表名 VALUES(数值1, 数值2, ...);

插入数据实例

INSERT INTO company (id, name, age, salary) VALUES(10021, '小乔', 24, 11000);

INSERT INTO company VALUES(10022, 大乔', 29, '江西', 13000);

6、从数据表删除数据

DELETE FROM 表名 WHERE 条件表达式;

注: 可以没有 WHERE 子句,但数据表的所有数据都将被删除

注: 如果有多个条件可以使用逻辑与 (and) 或逻辑或 (or) 连接

删除数据实例

DELETE FROM company WHERE id = 10029;

DELETE FROM company WHERE address = '成都’ and salary < 1000;

7、修改数据表中的数据

UPDATE 表名 SET 列名1 = 新数值, 列名2 = 新数值 ... WHERE 条件表达式;

注: 可以没有 WHERE 子句,但数据表的所有数据都将被修改

注: ”新数值” 可以是一个常数,也可以是一个表达式

修改数据实例 

UPDATE company SET age = 45 WHERE id = 10011;

UPDATE company SET salary = salary + 2000 WHERE age >= 30 and age <= 35;

8、查询数据表中的数据

SELECT 列名1, 列名2, ... FROM 表名;

SELECT 列名1, 列名2 ... FROM 表名 WHERE 条件表达式;

SELECT 列名1, 列名2 ... FROM 表名 WHERE 条件表达式 ORDER BY 列名排序方式;

注: ORDER BY 子句可以和 WHERE 子句配合使用,也可以独立使用

查看操作实例

SELECT * FROM company WHERE salary>10000 or salary<3500;

SELECT * FROM company ORDER BY id ASC;

9、模糊查询

SELECT 列名1, 列名2 ... FROM 表名 WHERE 列名 LIKE 模糊匹配条件;

注: ORDER BY 子句可以和 WHERE 子句配合使用,也可以独立使用

模糊匹配通配符

百分号 (%) : 代表零个、一个或多个数字或字符

下划线 (_) : 代表一个单一的数字或字符

注:它们可以被组合使用

模糊查询实例

// 根据工资匹配,查找工资数包含 ‘8’ 的数据

SELECT * FROM company WHERE salary LIKE '%8%'; 

// 根据姓名匹配,查找姓 “关”,名字是两个字的数据

SELECT * FROM company WHERE name LIKE 关_;

// 根据工资匹配,查找工资第二位是 2 并以 3 结尾的任意值

SELECT * FROM company WHERE salary WHERE SALARY LIKE '_2%3'

四、在 Qt 中使用 Sqlite 数据库

4.1 QSqlQuery 执行数据库操作的 SQL 语句

QSqlQuery query;

query.exec("SELECT、DELETE、INSERT、UPDATE 等 SQL 语句");

4.2 QSqlQueryModel 获取结果集

QString str = QString("SELECT * FROM 表名"); 

QSqlQueryModel * model = new QSqlQueryModel;

model->setQueryl(tr);  //执行查询操作,并将结果集保存到 model 对象中

ui->menuTableView->setModel(model);  // 显示查询结果

4.3 QSqlDatabase 建立 Qt 应用程序和数据库连接

// 添加数 据库驱动

db = QSqlDatabase::addDatabase("QSQLITE");

// 设置数据库名字

db.setDatabaseName("menu.db");

// 打开数据库

db.open();

注: 使用Qt数据库模块需要在工程文件中添加 “QT+=sql”

4.4 搭建项目

QT学习日记17——Qt数据库_第13张图片

QT学习日记17——Qt数据库_第14张图片

QT学习日记17——Qt数据库_第15张图片

 添加对应的库

QT学习日记17——Qt数据库_第16张图片

制作界面

QT学习日记17——Qt数据库_第17张图片

QT学习日记17——Qt数据库_第18张图片 QT学习日记17——Qt数据库_第19张图片

 其他常规设置

QT学习日记17——Qt数据库_第20张图片

4.5 生成槽函数、添加头文件、声明变量和函数

1、槽函数生成

QT学习日记17——Qt数据库_第21张图片

QT学习日记17——Qt数据库_第22张图片

QT学习日记17——Qt数据库_第23张图片

 

2、头文件

QT学习日记17——Qt数据库_第24张图片

3、声明变量和函数

QT学习日记17——Qt数据库_第25张图片

QT学习日记17——Qt数据库_第26张图片

4.6 编写函数

1、创建或建立连接 和 创建或寻找表

#include "studialog.h"
#include "ui_studialog.h"

StuDialog::StuDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::StuDialog)
{
    ui->setupUi(this);
    createDB();
    createTable();
    queryTable();
}

StuDialog::~StuDialog()
{
    delete ui;
}

// 创建数据库
void StuDialog::createDB()
{
    // 添加数据库驱动库
    db = QSqlDatabase::addDatabase("QSQLITE");
    // 设置数据库名字(文件名)
    db.setDatabaseName("student.db");
    // 打开数据库
    if (db.open() == true) {
        qDebug() << "创建/打开数据库成功!";
    }
    else {
        qDebug() << "创建/打开数据库失败!";
    }
}

// 创建数据表
void StuDialog::createTable()
{
    QSqlQuery query;
    QString str = QString("CREATE TABLE stucent ("
                          "id INT PRIMARY KEY NOT NULL,"
                          "name TEXT NOT NULL,"
                          "score REAL NOT NULL)");
    // 执行sql语句失败后打印失败语句,成功则不作处理
    if(query.exec(str) == false) {
        qDebug() << str;
    }
}

// 查询
void StuDialog::queryTable()
{

}

// 插入操作对应的槽函数
void StuDialog::on_insert_button_2_clicked()
{

}

// 删除操作对应的槽函数
void StuDialog::on_delete_button_clicked()
{

}

// 修改操作对应的槽函数
void StuDialog::on_update_button_clicked()
{

}

// 排序操作对应的槽函数
void StuDialog::on_sort_button_clicked()
{

}

现在运行一下程序,会生成一个 .db 文件,用 sqlite 打开 .sql

 

2、把数据库获取到的数据放到控件里面

// 查询
void StuDialog::queryTable()
{
    QString str = QString("SELECT * FROM student");
    model.setQuery(str);
    ui->tableView->setModel(&model);
}

QT学习日记17——Qt数据库_第27张图片

目前没有数据,只有一个表格的格式

 

3、增加数据

// 插入操作对应的槽函数
void StuDialog::on_insert_button_2_clicked()
{
    QSqlQuery query;
    int id = ui->id_edit->text().toInt();
    QString name = ui->name_edit->text();
    double score = ui->score_edit->text().toDouble();
    QString str = QString("INSERT INTO student VALUES(%1, '%2', %3)").arg(id).arg(name).arg(score);
    if(query.exec(str) == false) {
        qDebug() << str;
    }
    else {
        qDebug() << "插入数据成功!";
        queryTable();
    }
}

QT学习日记17——Qt数据库_第28张图片

QT学习日记17——Qt数据库_第29张图片

QT学习日记17——Qt数据库_第30张图片

 

4、删除、修改

// 删除操作对应的槽函数:根据ID删除一条数据
void StuDialog::on_delete_button_clicked()
{
    QSqlQuery query;
    int id = ui->id_edit->text().toInt();
    QString str = QString("DELETE FROM student WHERE id = %1").arg(id);
    if(query.exec(str) == false) {
        qDebug() << str;
    }
    else {
        qDebug() << "删除数据成功!";
        queryTable();
    }
}

// 修改操作对应的槽函数:根据ID修改成绩
void StuDialog::on_update_button_clicked()
{
    QSqlQuery query;
    int id = ui->id_edit->text().toInt();
    double score = ui->score_edit->text().toDouble();
    QString str = QString("UPDATE student SET score = %1 WHERE id = %2").arg(score).arg(id);
    if(query.exec(str) == false) {
        qDebug() << str;
    }
    else {
        qDebug() << "修改数据成功!";
        queryTable();
    }
}

5、排序

// 排序操作对应的槽函数
void StuDialog::on_sort_button_clicked()
{
    // 获取排序列名
    QString value = ui->value_comboBox->currentText();
    // 获取排序方式
    QString condition;
    if(ui->cond_comboBox->currentIndex() == 0) {
        condition = "ASC";  // 升序
    }
    else {
        condition = "DESC";  // 降序
    }
    QString str = QString("SELECT * FROM student ORDER BY %1 %2").arg(value).arg(condition);

    // 查询和显示
    model.setQuery(str);
    ui->tableView->setModel(&model);
}

 

你可能感兴趣的:(QT,数据库,qt,学习)