参考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 '%小%'");