基于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://www.mzph.cn/news/702122.shtml

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

相关文章

Linux进程【补充】

文章目录 进程概念task_struct 进程创建forkvfork写时拷贝 进程状态僵尸进程孤儿进程守护进程 进程地址空间是什么为什么怎么做 进程概念 进程是一个程序的执行实例或者是担当系统资源分配的实体。当一个程序运行时&#xff0c;被从硬盘加载到内存中&#xff0c;操作系统为每个…

Python实战:爬取小红书——采集笔记详情

上一篇文章发出后&#xff0c;有读者问能不能爬到小红书笔记详情数据&#xff0c;今天他来了。 Python实战&#xff1a;爬取小红书 一、先看效果 程序输入&#xff1a;在一个txt文件内粘贴要爬取的笔记链接&#xff0c;每行放1个链接。 程序输出&#xff1a;输出是一个所有笔记…

docker-compose 搭建laravel环境

laravel环境包含nginx,mysql,php7.4,redis 一、安装好docker后pull镜像 1.nginx镜像 docker pull nginx:latest单独启动容器 docker run --name nginx -p 80:80 -d nginx 2.php镜像 docker pull php:7.4-fpm3.mysql镜像 docker pull mysql:5.74.redis镜像 docker pull r…

zabbix3.4.6 源码安装

Step1&#xff1a; 下载 https://www.zabbix.com/download 选中一下。download Zabbix Sources PackageReleaseDateRelease NotesZabbix ManualDownloadZabbix 3.4Server, Proxy, Agent, GUI3.4.615 January, 2018 Download step2 &#xff1a;拷贝在redhat 6.3_X86_86(192…

UE蓝图 序列(Sequence)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 UE蓝图 函数调用(CallFunction)节点和源码 UE蓝图 函数调用(CallFunction)…

springboot215基于springboot技术的美食烹饪互动平台的设计与实现

美食烹饪互动平台的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统美食信息管理难度大&…

MAC地址学习和老化

MAC地址学习过程 一般情况下&#xff0c;MAC地址表是设备根据收到的数据帧里的源MAC地址自动学习而建立的。 图1 MAC地址学习示意图 如图1&#xff0c;HostA向SwitchA发送数据时&#xff0c;SwitchA从数据帧中解析出源MAC地址&#xff08;即HostA的MAC地址&#xff09;和VLAN…

做接口测试的流程一般是怎么样的?UI功能6大流程、接口测试8大流程这些你真的全会了吗?

在讲接口流程测试之前&#xff0c;首先需要给大家申明下&#xff1a;接口测试对于测试人员而言&#xff0c;非常非常重要&#xff0c;懂功能测试接口测试&#xff0c;就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试&#xff0c;一般也是面试笔试必问。为方便大家更…

C++ //练习 8.13 重写本节的电话号码程序,从一个命名文件而非cin读取数据。

C Primer&#xff08;第5版&#xff09; 练习 8.13 练习 8.13 重写本节的电话号码程序&#xff0c;从一个命名文件而非cin读取数据。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /***************************************…

Unity(第四部)新手组件

暴力解释就是官方给你的功能&#xff1b;作用的对象上面如&#xff1a; 创建一个球体&#xff0c;给这个球体加上重力 所有物体都是一个空物体&#xff0c;加上一些组件才形成了所需要的GameObject。 这是一个空物体&#xff0c;在Scene场景中没有任何外在表现&#xff0c;因为…

公厕智慧化_智慧化的公厕

公厕智慧化是现代城市建设中的重要一环。通过信息化、数字化和智慧化技术手段&#xff0c;实现对公共厕所的高效管理和服务&#xff0c;不仅提升了城市环境质量&#xff0c;还改善了居民生活品质。智慧公厕的智慧化包括监测、管理、服务和设备的智慧化&#xff0c;利用先进科技…

1分钟带你学会Python的pass关键字和range函数

1.pass 关键字 pass关键字在 python 中没有任何实际意义&#xff0c;主要是用来完成占位的操作&#xff0c;保证语句的完整性 age int(input(请输入您的年龄&#xff1a;))if age > 18: pass # pass 在此处没有任何意义&#xff0c;只是占位 print(欢迎光临。。。…

常见的排序算法整理

1.冒泡排序 1.1 冒泡排序普通版 每次冒泡过程都是从数列的第一个元素开始&#xff0c;然后依次和剩余的元素进行比较&#xff0c;若小于相邻元素&#xff0c;则交换两者位置&#xff0c;同时将较大元素作为下一个比较的基准元素&#xff0c;继续将该元素与其相邻的元素进行比…

Spring 中 ApplicationContext 和 BeanFactory 的区别有哪些

先看一张类图&#xff1a; 区别&#xff1a; 1&#xff1a;包目录不同&#xff1a; spring-beans.jar 中 org.springframework.beans.factory.BeanFactory spring-context.jar 中 org.springframework.context.ApplicationContext 2&#xff1a;国际化&#xff1a; BeanFacto…

mysql的日志文件在哪?

阅读本文之前请参阅----MySQL 数据库安装教程详解&#xff08;linux系统和windows系统&#xff09; MySQL的日志文件通常包括错误日志、查询日志、慢查询日志和二进制日志等。这些日志文件的位置取决于MySQL的安装和配置。以下是一些常见的日志文件位置和如何找到它们&#xff…

PHP中的飞碟运算符、取反运算符、对比非ASCII字符串、对比浮点数操作

对比浮点数 在电脑里存储的浮点数可能会和输入的值有些许差异&#xff0c;比如输入的是10.0&#xff0c;但存储的是10.00001. 在比较两个浮点数是否相等时可以计算下两个数的差值&#xff0c;然后查看下两数之差是否小于可以接受的阈值&#xff0c;如果要求精度在小数点后5位的…

ubuntu 22.04LTS的一些使用心得

前言 笔者一直在折腾ubuntu作为开发的主力系统&#xff0c;尤其是最近微信和各种软件陆续支持Debian系列&#xff0c;很多软件都可以用了&#xff0c;当然开源的软件大部分是跨平台的&#xff0c;尤其是idea系列。 X11 OR Wayland 关于X11和wayland&#xff0c;笔者还是使用…

9.5K Star,又一款超棒开源轻量自动化运维平台

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 一个好的运维平台就变得非常重要了&#xff0c;可以节省大量的人力和物…

ElasticSearch索引数据备份与恢复

索引数据备份 在磁盘创建备份目录并授权 # 创建备份目录 /home/esbackup # 授权 chmod 777 /home/esbackup修改配置文件elasticsearch.yml echo path.repo: ["/home/esbackup"] >> /etc/elasticsearch/elasticsearch.yml重启elasticsearch(我是docker创建的…

c++ Qt 网络连接

1、基础概念 1.1 TCP/UDP TCP 是一种面向连接的传输层协议&#xff0c;它能提供高可靠性通信(即数据无误、数据无丢失、 数据无失序、数据无重复到达的通信) 适用情况&#xff1a; 1.SN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议 2、适合于对传输质量要求较…