百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Qt数据库

mhr18 2024-12-15 11:53 24 浏览 0 评论

目录

一、数据库简介

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 的,允许从多个进程或线程安全访问

领Qt学习资料→Qt开发(视频教程+文档+代码+项目实战)

二、配置和安装

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

Windows 可以进入下载网址

https://www.sqlite.org/download.html

下载对应的两个压缩包


然后解压

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

三、Sqlite 的操作指令

3.1 常用命令

.database

查看数据库的名字

.table

查看数据表的名字

.schema

查看数据表创建时信息

.mode

设置显示模式,如 tab/list/column/csv

.nullvalue

设置空白字段显示的字符串

.header on

显示数据表的表头


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 (非空):该列数据不能为空

实例

4、删除数据表

DROP TABLE 表名;

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

实例

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 搭建项目

添加对应的库

制作界面

其他常规设置

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

1、槽函数生成

2、头文件

3、声明变量和函数

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);
}


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

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();
    }
}

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开发(视频教程+文档+代码+项目实战)

相关推荐

Java面试题及答案总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Redis、Linux、SpringBoot、Spring、MySQ...

Java面试题及答案最全总结(2025春招版)

大家好,我是Java面试分享最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Spring...

Java面试题及答案最全总结(2025版持续更新)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

蚂蚁金服面试题(附答案)建议收藏:经典面试题解析

前言最近编程讨论群有位小伙伴去蚂蚁金服面试了,以下是面试的真题,跟大家一起来讨论怎么回答。点击上方“捡田螺的小男孩”,选择“设为星标”,干货不断满满1.用到分布式事务嘛?为什么用这种方案,有其他方案...

测试工程师面试必问的十道题目!全答上来的直接免试

最近参加运维工程师岗位的面试,笔者把自己遇到的和网友分享的一些常见的面试问答收集整理出来了,希望能对自己和对正在准备面试的同学提供一些参考。一、Mongodb熟悉吗,一般部署几台?部署过,没有深入研究...

10次面试9次被刷?吃透这500道大厂Java高频面试题后,怒斩offer

很多Java工程师的技术不错,但是一面试就头疼,10次面试9次都是被刷,过的那次还是去了家不知名的小公司。问题就在于:面试有技巧,而你不会把自己的能力表达给面试官。应届生:你该如何准备简历,面试项目和...

java高频面试题整理

【高频常见问题】1、事务的特性原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。一致性或可串性:事务的执行使得数据库从一种正确状态转换成另一种正确状态隔离性:在事务正确提交之前,不允许把该...

2025 年最全 Java 面试题,京东后端面试面经合集,答案整理

最近京东搞了个TGT计划,针对顶尖青年技术天才,直接宣布不设薪资上限。TGT计划面向范围包括2023年10月1日到2026年9月30日毕业的海内外本硕博毕业生。时间范围还...

idGenerator测评

工作中遇到需要生成随机数的需求,看了一个个人开发的基于雪花算法的工具,今天进行了一下测评(测试)。idGenerator项目地址见:https://github.com/yitter/IdGenera...

2024年开发者必备:MacBook Pro M1 Max深度体验与高效工作流

工作机器我使用的是一台16英寸的MacBookProM1Max。这台电脑的表现堪称惊人!它是我用过的最好的MacBook,短期内我不打算更换它。性能依然出色,即使在执行任务时也几乎听不到风扇的...

StackOverflow 2022 年度调查报告

一个月前,StackOverflow开启了2022年度开发者调查,历时一个半月,在6月22日,StackOverflow正式发布了2022年度开发者调查报告。本次报告StackO...

这可能是最全面的SpringDataMongoDB开发笔记

MongoDB数据库,在最近使用越来越广泛,在这里和Java的开发者一起分享一下在Java中使用Mongodb的相关笔记。希望大家喜欢。关于MongoDB查询指令,请看我的上一篇文章。SpringD...

Mac M2 本地部署ragflow

修改配置文件Dockerfile文件ARGNEED_MIRROR=1//开启国内镜像代理docker/.envREDIS_PORT=6380//本地redis端口冲突RAGFLOW_IMA...

别再傻傻分不清!localhost、127.0.0.1、本机IP,原来大有讲究!

调试接口死活连不上?部署服务队友访问不了?八成是localhost、127.0.0.1、本机IP用混了!这三个看似都指向“自己”的东西,差之毫厘谬以千里。搞不清它们,轻则调试抓狂,重则服务裸奔。loc...

我把 Mac mini 托管到机房了:一套打败云服务器的终极方案

我把我积灰的Macmini托管到机房了,有图有真相。没想到吧?一台在家吃灰的苹果电脑,帮我省了大钱!对,就是控制了自己的服务器,省了租用云服务器的钱,重要数据还全捏在自己手里,这感觉真爽。你可...

取消回复欢迎 发表评论: