基于qt的图书管理系统----04sql功能开发

参考b站:视频连接

源码github:github

目录

  • 1 封装一个全局的对象
  • 2 设计所有接口
    • 2.1 初始化数据库接口
    • 2.2 登陆接口
    • 2.3 条件查询用户接口

1 封装一个全局的对象

新建一个c++class,sqlmange,并且在.pro文件中添加上sql

在这里插入图片描述

使用c++单例模式:

它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。

在这里插入图片描述

该代码实现了 SQLManange 类,该类可以用于管理数据库连接和操作。代码使用了单例模式,确保只有一个 SQLManange 实例存在,并提供了一些基本功能,例如测试数据库连接和操作。我不是很懂这部分先更着敲

#ifndef SQLMANGE_H
#define SQLMANGE_H#include <QDebug>// sqlmange 类声明
class sqlmange
{
public:// 构造函数sqlmange();// 单例模式:获取类唯一实例static sqlmange* getInstance();// 测试函数void test();private:// 私有构造函数,禁止外部直接创建对象sqlmange(const sqlmange&) = delete;// 私有赋值运算符,禁止外部直接赋值sqlmange& operator=(const sqlmange&) = delete;// 单例模式:类唯一实例指针static sqlmange* instance;
};#endif // SQLMANGE_H#include "sqlmange.h"// sqlmange 类唯一实例指针初始化
sqlmange* sqlmange::instance = nullptr;// sqlmange 类构造函数实现
sqlmange::sqlmange() {}// sqlmange 类获取实例函数实现
// 如果实例不存在,则创建新实例并赋值给 instance 指针
// 然后返回 instance 指针
sqlmange* sqlmange::getInstance()
{if (nullptr == instance) {instance = new sqlmange();}return instance;
}// sqlmange 类测试函数实现
// 输出 "test" 到调试信息
void sqlmange::test()
{qDebug() << "test";
}

在main函数中使用sqlmange::getInstance()->test();调用写好的接口

2 设计所有接口

// 构造函数sqlmange();// 单例模式:获取类唯一实例static sqlmange* getInstance();//初始化数据库void init();//登陆bool login(QString strUsername ,QString strPassword);//获取所有用户QVector<QStringList> getUsers(QString strCondition = "");//添加用户void AddUser(QVector<QStringList>);//删除用户void DelUser(QString strID);//获取所有图书QVector<QStringList> getBooks(QString strCondition = "");//增加图书void AddBook(QVector<QStringList>);//修改图书void ModBook(QString strID);//删除图书void DelBook(QString strID);//图书归还,谁还的,还的什么书QString ReturnBook(QString strUserID, QString strBookID);//图书借阅,谁借的,借的什么书QString BorrowBook(QString strUserID, QString strBookID);//获取借阅记录QVector<QStringList> getRecords(QString strCondition = "");//清空记录QString clearRecord();

2.1 初始化数据库接口

使用QSqlDatabase库里的函数,官方给我们提供了参考

在这里插入图片描述

将之前写好的数据库放到应用程序所在目录下的db文件夹,编写代码

void sqlmange::init()
{// 打开数据库// 使用 QSQLITE 数据库驱动m_db = QSqlDatabase::addDatabase("QSQLITE");// 设置数据库名称// 数据库文件位于应用程序目录下的 db/book.db 文件m_db.setDatabaseName(QCoreApplication::applicationDirPath() + "/db/book.db");// 打开数据库// 并输出打开结果到调试信息qDebug() << m_db.open();
}

此时发现没有驱动,排查发现是此时程序运行在打包好的路径里了,没有把现在用到的数据库打包上,所以我们回到bin文件夹把之前打包的库都删了就能够运行。

找库的路径都是优先当前程序所在路径

在这里插入图片描述

在这里插入图片描述

2.2 登陆接口

使用查询语句查询用户名和密码是否对上即可

bool sqlmange::login(QString strUsername, QString strPassword)
{// 创建 SQL 查询对象QSqlQuery q(m_db);// 构建 SQL 查询语句// 使用占位符防止 SQL 注入攻击QString strSql = QString("select * from user where username = '%1' and password = '%2'").arg(strUsername).arg(strPassword);// 执行 SQL 查询bool ret = q.exec(strSql);// 如果查询失败,输出错误信息if(!ret){qDebug()<<q.lastError().text();}// 返回查询结果return ret;
}// 使用单例实例执行登录操作,并输出登录结果到调试信息qDebug() <<"login:"<< sqlmange::getInstance()->login("xiaoming","123456");

2.3 条件查询用户接口

把 where后边的语句都用做条件,如where username like '%x' or nickname '小'

QVector<QStringList> sqlmange::getUsers(QString strCondition)
{// 创建 SQL 查询对象QSqlQuery q(m_db);// 构建 SQL 查询语句// 使用占位符防止 SQL 注入攻击// 使用 strCondition 作为查询条件QString strSql = QString("select * from user %1").arg(strCondition);// 存储查询结果的容器QVector<QStringList> vec;// 执行 SQL 查询bool ret = q.exec(strSql);// 如果查询失败,输出错误信息if(!ret){qDebug()<<q.lastError().text();}else{// 获取查询结果的列数int iCols = q.record().count();// 临时存储每行的查询结果QStringList l;// 遍历查询结果while(q.next()){// 遍历每一列for (int i = 0;i< iCols;i++){// 将当前列的值添加到临时列表中l<<q.value(i).toString();}// 将临时列表添加到最终结果容器中vec.push_back(l);// 清空临时列表l.clear();}}// 返回查询结果return vec;
}

在mian里使用qDebug() <<"getuser:"<< sqlmange::getInstance()->getUsers("where username like '%xiao%' or nickname like '%小%'");

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

软件运维维保服务方案-套用模板

软件运维维保方案-套用模板 项目情况 1.1 项目背景简述项目的来源、目的和重要性。说明项目的规模、预算和预期目标。 1.2 项目现状分析当前系统/软件的运行状态、存在的问题和潜在风险。提供最近一次的维护报告或相关统计数据。服务简述 2.1 服务内容明确运维服务的具体内容&…

华为 OD 一面算法原题

2.2 亿彩票公布调查结果 昨天&#xff0c;闹得沸沸扬扬的《10 万中 2.2 亿》的彩票事件&#xff0c;迎来了官方公告。 简单来说&#xff0c;调查结果就是&#xff1a;一切正常&#xff0c;合规合法。 关于福利彩票事件&#xff0c;之前的推文我们已经分析过。 甚至在后面出现《…

深度强化学习(DRL)算法 附录 6 —— NLP 回顾之预训练模型篇

Self-Attention 模型结构 上图架构以 batch_size 为 1&#xff0c;两个时间步的 X 为例子&#xff0c;计算过程如下&#xff1a; 位置编码 根据 self-attention 的模型结构&#xff0c;改变 X 的输入顺序&#xff0c;不影响 attention 的结果&#xff0c;所以还需要引入额…

FreeRTOS学习第8篇--同步和互斥操作引子

目录 FreeRTOS学习第8篇--同步和互斥操作引子同步和互斥概念实现同步和互斥的机制PrintTask_Task任务相关代码片段CalcTask_Task任务相关代码片段实验现象本文中使用的测试工程 FreeRTOS学习第8篇–同步和互斥操作引子 本文目标&#xff1a;学习与使用FreeRTOS中的同步和互斥操…

【MySQL】学习和总结联合查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-OPj5g6evbkm5ol0U {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

从零实现一套低代码(保姆级教程)【后端服务】 --- 【22】实现数据库管理的前端页面

摘要 在上一篇中&#xff0c;我们实现了三个接口&#xff1a; 新增实体的接口删除实体的接口获取实体列表的接口 其实复杂的地方在于&#xff0c;我们创建一个实体&#xff0c;是在数据库中创建了一张表。而这张表中的数据&#xff0c;是要根据低代码平台中的操作进行更改。…

嵌入式学习-qt-Day1

嵌入式学习-qt-Day1 一、思维导图 二、作业 1.自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//字体设置QFont font1;//创建字体对象1font1.setWeight(QFont::Bold);//字体…

魔改Mac OS渗透测试工具箱!

简介 本工具箱为v1版本&#xff0c;由"森然"师傅进行二开。 通过Python进行调用&#xff0c;并实现图形化界面。 参考&#xff1a;狐狸工具箱&#xff0c;闲客工具箱 环境以及工具 综合了常用的几个工具 适配Mac、Windos、Linux用户 注意&#xff1a;自带的jav…

HTTP 与HTTPS笔记

HTTP 80 HTTP是一个在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的约定和规范。 HTTP状态码 1xx 提示信息&#xff0c;表示目前是协议处理的中间状态&#xff0c;还需要后续的操作&#xff1b;2xx 200 204 026 成功3xx 重定向&#xff…

仿12306校招项目业务二(列车检索)

目录 验证数据 加载城市数据 查询列车站点信息 查询列车余票信息 构建列车返回数据 12306 项目中列车数据检索接口路径 &#xfeff; TicketController的pageListTicketQuery&#xfeff;。 GetMapping("/api/ticket-service/ticket/query")public Result<T…

带使能控制的锂电池充放电解决方案

一、产品概述 TP4594R 是一款集成线性充电管理、同步升压转换、电池电量指示和多种保护功能的单芯片电源管理 SOC&#xff0c;为锂电池的充放电提供完整的单芯片电源解决方案。 TP4594R 内部集成了线性充电管理模块、同步升压放电管理模块、电量检测与 LED 指示模块、保护模块…

Rust升级慢,使用国内镜像进行加速

背景 rustup 是 Rust 官方的跨平台 Rust 安装工具&#xff0c;国内用户使用rustup update的时候&#xff0c;网速非常慢&#xff0c;可以使用国内的阿里云镜像源来进行加速 0x01 配置方法 1. Linux与Mac OS用户配置环境变量 修改~/.bash_profile文件添加如下内容&#xff1…

【服务发现--ingress】

1、ingress介绍 Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。 Ingress 是对集群中服务的外部访问进行管理的 API 对象&#xff0c;典型的访问方式是 HTTP。 Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟…

if语句test

import com.sun.jdi.PathSearchingVirtualMachine;import java.sql.SQLOutput; import java.util.Scanner;public class Test5 {public static void main(String[] args) {//在电影院检查票据&#xff0c;票据在1-100之间才是真实有效的票据&#xff0c;且奇数做左边&#xff0…

2.25基础会计学

资本公积是指由股东投入、但不能构成“股本”或“实收资本”的资金部分。 盈余公积是指公司按照规定从净利润中提取的各种积累资金。 所以区别在于盈余公积来自净利润。 借贷其实就是钱从哪来和到哪去的问题&#xff0c;来源是贷&#xff0c;流向是借。比如购入9w原材料&…

Vue事件处理之v-on

1. 使用及定义 定义方法 function 方法名称(接受的event或是什么都不写) {//不管方法后括号内写与不写event,都可以接受到方法内表达式 }//定义一个接受参数的方法,此时也会在传入event function 方法名称(传入参数) {//可接受传入参数与event方法内表达式 } //定义一个接受参…

Cover和contain属性

一.背景的盒子 代码&#xff1a; <body><div class"box"></div><style>.box {width: 500px;height: 500px;border: 1px solid #ccc;background: url(./20191017095131790.png) no-repeat;}</style></body> 盒子的宽度和高度是…

软件游戏显示d3dx9_42.dll丢失的5种解决方法,快速解决dll问题

当计算机系统中d3dx9_42.dll文件丢失时&#xff0c;可能会引发一系列运行问题和功能异常&#xff0c;具体表现形式多样且影响范围较广。首先&#xff0c;对于依赖于DirectX 9.0c版本的各类应用程序&#xff0c;尤其是部分经典的老款游戏&#xff0c;由于d3dx9_42.dll是其中不可…

2024年危险化学品经营单位主要负责人证考试题库及危险化学品经营单位主要负责人试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年危险化学品经营单位主要负责人证考试题库及危险化学品经营单位主要负责人试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特…

Sentinel 动态规则扩展

一、规则 Sentinel 的理念是开发者只需要关注资源的定义&#xff0c;当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则&#xff1a; 通过 API 直接修改 (loadRules)通过 DataSource 适配不同数据源修改 手动通过 API 修改比较直观&#xff0c;…