QT基础篇(13)QT5数据库

1.数据库基本概念

数据库(Database)是指存储、管理和组织数据的集合。它是一个组织化的、可持久化的数据集合,用于支持数据的存储、检索、更新和管理。

数据库系统(Database System)是建立在计算机上的数据管理系统,由数据库、数据库管理系统(DBMS)和应用程序组成。它能够在计算机上创建、使用和维护数据库,提供数据的存储、检索和管理功能。

数据库管理系统(Database Management System,DBMS)是一种软件系统,用来管理数据库,提供对数据库的访问和操作接口,包括数据的存储、检索、更新、删除、查询等功能。常见的DBMS有MySQL、Oracle、SQL Server等。

数据库模型(Database Model)是数据库中数据的逻辑组织方式。常见的数据库模型有层次模型、网状模型、关系模型和面向对象模型。其中,关系模型是最常用的数据库模型,它将数据组织为表格(即关系),并使用关系代数和关系演算进行数据操作。

数据库管理系统通过SQL(Structured Query Language)语言来操作数据库。SQL是一种专门用来管理和操作关系型数据库的语言,它可以对数据库进行查询、更新、删除、插入等操作。

数据库的基本概念还包括数据模型、数据表、字段、记录、主键、外键、索引等。数据模型定义了数据库中数据的组织方式和关系;数据表是数据库中数据的逻辑结构,它由多个字段组成;字段是数据表中的一个属性,代表存储数据的最小单元;记录是数据表中的一行,代表一条具体的数据;主键是数据表中唯一标识记录的字段;外键是数据表中关联其他表的字段;索引是对数据库中某个字段或多个字段的值进行排序和存储,提高查询效率。

2.常用SQL语句
2.1 数据查询

常用的数据库查询SQL语句如下:

  1. SELECT: 用于查询数据库中的数据,可以选择要查询的字段、表格和条件。 例如:SELECT * FROM 表名; // 查询表中的所有字段和数据 SELECT 列名1, 列名2 FROM 表名; // 查询指定字段的数据 SELECT * FROM 表名 WHERE 条件; // 查询满足条件的数据

  2. INSERT INTO: 用于向数据库中插入新的数据。 例如:INSERT INTO 表名 (列名1, 列名2) VALUES (值1, 值2); // 插入指定字段的数据

  3. UPDATE: 用于更新数据库中的数据。 例如:UPDATE 表名 SET 列名1 = 新值1, 列名2 = 新值2 WHERE 条件; // 更新满足条件的数据

  4. DELETE: 用于删除数据库中的数据。 例如:DELETE FROM 表名 WHERE 条件; // 删除满足条件的数据

  5. WHERE: 用于筛选满足条件的数据。 例如:SELECT * FROM 表名 WHERE 列名 = 值; // 查询满足条件的数据

  6. ORDER BY: 用于对查询结果进行排序。 例如:SELECT * FROM 表名 ORDER BY 列名 ASC/DESC; // 按照指定列的升序/降序排序

  7. GROUP BY: 用于对查询结果进行分组。 例如:SELECT 列名1, 列名2 FROM 表名 GROUP BY 列名1; // 按照指定列进行分组

  8. JOIN: 用于将多个表格连接在一起进行查询。 例如:SELECT * FROM 表名1 JOIN 表名2 ON 表名1.列名 = 表名2.列名; // 连接两个表格查询数据

  9. HAVING: 用于在GROUP BY语句中对分组后的结果进行筛选。 例如:SELECT 列名1, COUNT(列名2) FROM 表名 GROUP BY 列名1 HAVING COUNT(列名2) > 值; // 筛选满足条件的分组结果

  10. DISTINCT: 用于去重查询结果。 例如:SELECT DISTINCT 列名 FROM 表名; // 查询指定字段的去重结果

以上是一些常用的数据库查询SQL语句,可以根据具体需求进行组合和扩展。

2.2 数据操作

常用的数据库数据操作SQL语句如下:

  1. INSERT INTO: 用于向数据库中插入新的数据。 例如:INSERT INTO 表名 (列名1, 列名2) VALUES (值1, 值2); // 插入指定字段的数据

  2. UPDATE: 用于更新数据库中的数据。 例如:UPDATE 表名 SET 列名1 = 新值1, 列名2 = 新值2 WHERE 条件; // 更新满足条件的数据

  3. DELETE: 用于删除数据库中的数据。 例如:DELETE FROM 表名 WHERE 条件; // 删除满足条件的数据

  4. TRUNCATE TABLE: 用于快速清空表中的数据,但不会回滚事务。 例如:TRUNCATE TABLE 表名; // 清空表中的数据

  5. CREATE TABLE: 用于创建新的数据库表。 例如:CREATE TABLE 表名 (列名1 数据类型, 列名2 数据类型, ...); // 创建表结构

  6. ALTER TABLE: 用于修改数据库表的结构。 例如:ALTER TABLE 表名 ADD 列名 数据类型; // 添加新的列 ALTER TABLE 表名 MODIFY 列名 数据类型; // 修改列的数据类型 ALTER TABLE 表名 DROP 列名; // 删除列

  7. CREATE INDEX: 用于创建索引,加快查询速度。 例如:CREATE INDEX 索引名 ON 表名 (列名); // 在指定列上创建索引

  8. DROP INDEX: 用于删除索引。 例如:DROP INDEX 索引名 ON 表名; // 删除指定表的索引

  9. CREATE VIEW: 用于创建视图,可以将数据库中的数据以虚拟表的形式展现。 例如:CREATE VIEW 视图名 AS SELECT 列名1, 列名2 FROM 表名; // 创建视图

  10. DROP VIEW: 用于删除视图。 例如:DROP VIEW 视图名; // 删除视图

以上是一些常用的数据库数据操作SQL语句,可以根据具体需求进行组合和扩展。

3. QT操作数据库
3.1 QT操作SQLite数据库

在QT5中操作SQLite数据库需要使用QT的数据库模块,需要引入以下头文件:

#include <QtSql>

首先,需要创建一个Qt数据库连接对象,代码如下:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db");  // 数据库文件名,可以是绝对路径或相对路径if (!db.open()) {qDebug() << "Failed to open database!";return;
}

在数据库打开成功后,可以执行SQL语句进行数据操作。例如,创建一个表并插入数据:

QSqlQuery query;
query.exec("CREATE TABLE students (id INT PRIMARY KEY, name TEXT, age INT)");query.prepare("INSERT INTO students (id, name, age) VALUES (?, ?, ?)");
query.addBindValue(1);
query.addBindValue("John");
query.addBindValue(20);
query.exec();

注意,在执行SQL语句之前,需要创建一个QSqlQuery对象,用于执行和操作SQL语句。可以使用exec()函数执行SQL语句,或使用prepare()和bindValue()函数准备并执行参数化查询。

执行查询语句并获取结果:

if (query.exec("SELECT * FROM students")) {while (query.next()) {int id = query.value(0).toInt();QString name = query.value(1).toString();int age = query.value(2).toInt();qDebug() << "ID:" << id << "Name:" << name << "Age:" << age;}
}

以上代码演示了如何执行SELECT语句并获取查询结果。可以通过value()函数根据字段索引或字段名获取对应的值。

最后,关闭数据库连接:

db.close();

以上是简单的示例代码,通过QT的数据库模块可以实现更复杂的数据库操作,如更新、删除、事务处理等。详细的API文档可以参考QT官方文档。

3.2 QT操作主从视图及XML

在QT中,可以使用QTableView和QStandardItemModel来实现主从视图的操作。

首先,需要创建两个QTableView和对应的QStandardItemModel,一个是主视图,一个是从视图。代码如下:

QTableView* masterTableView = new QTableView;
QStandardItemModel* masterModel = new QStandardItemModel;QTableView* detailTableView = new QTableView;
QStandardItemModel* detailModel = new QStandardItemModel;

然后,将数据模型设置给相应的视图:

masterTableView->setModel(masterModel);
detailTableView->setModel(detailModel);

接下来,可以使用模型的方法来填充数据,例如:

QStandardItem* item1 = new QStandardItem("Item 1");
QStandardItem* item2 = new QStandardItem("Item 2");
QStandardItem* item3 = new QStandardItem("Item 3");masterModel->appendRow({ item1, item2, item3 });

在主视图中,可以监听当前选中的行,并根据选中的行来更新从视图的数据。代码如下:

connect(masterTableView->selectionModel(), &QItemSelectionModel::currentRowChanged, [=](const QModelIndex& current, const QModelIndex& previous) {if (current.isValid()) {int row = current.row();// 根据选中的行更新从视图的数据// ...}
});

以上代码演示了如何根据主视图的选中行来更新从视图的数据。你可以根据实际需求来获取选中行的数据,并更新从视图的模型。

关于XML的操作,QT提供了QXmlStreamReader和QXmlStreamWriter两个类来读取和写入XML数据。

例如,读取XML文件并解析数据:

QFile file("data.xml");
if (file.open(QIODevice::ReadOnly)) {QXmlStreamReader reader(&file);while (!reader.atEnd()) {if (reader.isStartElement()) {if (reader.name() == "name") {QString name = reader.readElementText();qDebug() << "Name:" << name;}}reader.readNext();}if (reader.hasError()) {qDebug() << "XML Error:" << reader.errorString();}file.close();
}

以上代码演示了如何逐行读取XML文件中的数据。你可以根据标签名来获取相应的数据。

写入XML数据的过程与读取类似,首先创建QXmlStreamWriter对象,并调用相应的方法来写入数据:

QFile file("data.xml");
if (file.open(QIODevice::WriteOnly)) {QXmlStreamWriter writer(&file);writer.setAutoFormatting(true);writer.writeStartDocument();writer.writeStartElement("root");writer.writeTextElement("name", "Name 1");writer.writeEndElement();writer.writeEndDocument();file.close();
}

以上代码演示了如何创建一个XML文件,并写入一些简单的数据。你可以根据实际需求来添加更多的标签和数据。

QT提供了丰富的API来处理主从视图和XML数据操作,上述代码只是简单示例,具体的使用方式可以参考QT官方文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eclipses安装教程

一、下载开发工具包 1、开发工具包JDK 下载地址链接&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/ 下载教程&#xff1a; 1&#xff09;点击链接&#xff0c;可以跳转到页面 2&#xff09;下滑页面&#xff0c;找到开发工具包 3&#xff09; 记住下载之…

初识C语言·自定义类型(1)

目录 1 联合体类型的声明 2 联合体的特点 3 联合体的大小计算 4 枚举类型类型的声明 5 枚举的优点 1 联合体类型的声明 联合体&#xff0c;顾名思义&#xff0c;是多个对象连在一起的&#xff0c;即联合体的成员都是共用空间的&#xff0c;所以联合体也叫做共用体&#xf…

Java开发分析工具 JProfiler的详细使用方法解析(附 JProfiler for Mac许可证秘钥)

JProfiler 是一款功能强大的Java代码分析工具&#xff0c;JProfiler的直观UI可帮助您解决性能瓶颈&#xff0c;确定内存泄漏并了解线程问题且JProfiler Mac破解版配置会话非常简单&#xff0c;第三方集成使得入门变得轻而易举&#xff0c;并且以自然的方式呈现数据分析。 解…

万物简单AIoT 端云一体实战案例学习 之 快速开始

学物联网,来万物简单IoT物联网!! 下图是本案的3步导学,每个步骤中实现的功能请参考图中的说明。 1、简介 物联网具有场景多且复杂、链路长且开发门槛高等特点,让很多想学习或正在学习物联网的学生或开发者有点不知所措,甚至直接就放弃了。    万物简单AIoT物联网教育…

72.批量执行Redis命令的4种方式!

文章目录 前言一、Redis命令执行过程二、原生批量命令三、pipeline(管道)四、Lua脚本五、Redis事务六、Redis Cluster模式下该如何正确使用批量命令操作&#xff1f; 前言 在我们的印象中Redis命令好像都是一个个单条进行执行的&#xff0c;但实际上我们是可以批量执行Redis命…

二层交换机和三层交换机

二层交换机&#xff1a;将源mac和端口进行转发&#xff0c;是同一个网段进行通信的&#xff0c;不能实现路由转发&#xff0c;若想跨网段则需要接入一个路由器 如&#xff1a;pc1 192.168.1.1 与 pc2 192.168.1.2通信需要经过二层交换机&#xff0c;二层交换机不能配置ip的&am…

【前端设计】输入框

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 html <!DOCTYPE html> <html lang"en"> <head><meta charset"…

聊聊PowerJob的UserService

序 本文主要研究一下PowerJob的UserService UserService tech/powerjob/server/core/service/UserService.java Service public class UserService {Resourceprivate UserInfoRepository userInfoRepository;/*** 保存/修改 用户* param userInfoDO user*/public void save…

RHCE上课笔记(前半部分)

第一部分 网络服务 第一章 例行性工作 1.单一执行的例行性工作 单一执行的例行性工作&#xff08;就像某一个时间点 的闹钟&#xff09;&#xff1a;仅处理执行一次 1.1 at命令&#xff1a;定时任务信息 [rhellocalhost ~]$ rpm -qa |grep -w at at-spi2-core-2.40.3-1.el9.x…

【leetcode题解C++】541.反转字符串II

541. 反转字符串II 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c…

Nacos 在云原生架构下的演进

作者&#xff1a;之卫 背景 Nacos 提供的最核心能力是动态服务发现与动态配置管理能力&#xff0c;在云原生环境下&#xff0c;借助云产品&#xff0c;如 EDAS&#xff08;企业级分布式应用服务&#xff09;平台中&#xff0c;我们可以很轻松地使用 K8s 来托管 Nacos 体系的微…

《WebKit 技术内幕》之六(1): CSS解释器和样式布局

《WebKit 技术内幕》之六&#xff08;1&#xff09;&#xff1a;CSS解释器和样式布局 CSS解释器和规则匹配处于DOM树建立之后&#xff0c;RenderObject树之前&#xff0c;CSS解释器解释后的结果会保存起来&#xff0c;然后RenderObject树基于该结果来进行规范匹配和布局计算。当…

基于 GPT 和 Qdrant DB 向量数据库, 我构建了一个电影推荐系统

电影推荐系统自从机器学习时代开始以来就不断发展&#xff0c;逐步演进到当前的 transformers 和向量数据库的时代。 在本文中&#xff0c;我们将探讨如何在向量数据库中高效存储数千个视频文件&#xff0c;以构建最佳的推荐引擎。 在众多可用的向量数据库中&#xff0c;我们将…

Tomcat的maxParameterCountmaxPostSize参数

Tomcat的maxParameterCount&maxPostSize参数 Tomcat的maxParameterCount&maxPostSize参数1.问题1.1问题现象1.2 参数总结1.3 问题总结 2 Tomcat官网的解释2.1 到https://tomcat.apache.org/找到文档入口2.2 找到文档的Reference2.3 查看配置文件的参数 3 文档看不明白&…

GIS项目实战08:JetBrains IntelliJ IDEA 2022 激活

为什么选择 IntelliJ IDEA 使用编码辅助功能更快地编写高质量代码&#xff0c;这些功能可在您键入时搜索可能的错误并提供改进建议&#xff0c;同时无缝地向您介绍编码、新语言功能等方面的社区最佳实践。 IntelliJ IDEA 了解您的代码&#xff0c;并利用这些知识通过在每种上…

Istio

1、Istio介绍 Istio 是由 Google、IBM 和 Lyft 开源的微服务管理、保护和监控框架。 官网&#xff1a;https://istio.io/latest/zh/ 官方文档&#xff1a;https://istio.io/docs/ 中文官方文档&#xff1a;https://istio.io/zh/docs Github地址&#xff1a;https://github.com…

vectorCast添加边界值分析测试用例

1.1创建项目成功后会自动生成封装好的函数,在这些封装好的函数上点击右键,添加边界值分析测试用例,如下图所示。 1.2生成的用例模版是不可以直接运行的,需要我们分别点击它们,让它们自动生成相应测试用例。如下图所示,分别为变化前和变化后。 1.3点击选中生成的测试用例,…

SpringBoot 源码解析5:ConfigurationClassPostProcessor整体流程和@ComponentScan源码分析

SpringBoot 源码解析5&#xff1a;ConfigurationClassPostProcessor整体流程和ComponentScan源码分析 1. 知道以下几点&#xff0c;读ConfigurationClassPostProcessor源码会更轻松2. 源码解析 ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry2.1 Configur…

100天精通Python(实用脚本篇)——第113天:基于Tesseract-OCR实现OCR图片文字识别实战

文章目录 专栏导读1. OCR技术介绍2. 模块介绍3. 模块安装4. 代码实战4.1 英文图片测试4.2 数字图片测试4.3 中文图片识别书籍分享专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不…

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列…