第二章 把基本的数据结构具体为项目所需要的数据结构
https://gitee.com/mayonaka/LibraryManageSystem
百度云:https://pan.baidu.com/s/1G95yPyGG080b6yXcjc8B0g
提取码:4q8b
链表只是基本的数据结构,在项目中要使用的是储存书本信息的链表,储存用户信息的链表,储存用户的书的信息的链表,因此要对LinerList进一步具体实现才能得到项目所需要的数据结构。本项目要使用的三个数据结构
1. Book: 储存书本信息的链表。
2. User: 储存用户信息的链表
3. UserBook: 储存用户的书的链表
它们都是继承自LinerList基类,并具体实现了LinerList的Init方法,SaveAdd方法,SaveDelete方法。因为三个类基本类似,只是细节上的实现有稍微差别,本次就以User类为例,来介绍一下Init,SaveAdd,SaveDelete,三个方法的具体实现。
Init方法的具体实现:
1. 先用open函数打开数据库
2. 声明一个QSqlQuery类型的变量,该类可以执行MySql语句,同时会保存执行的结果。
3. 使用exec方法执行MySql语句,查询users表中的所有信息。
4. 使用next方法遍历查询结果,并把每一条记录转换成项目定义的数据结构储存起来。
5. 关闭数据库(用完数据库一定要关闭)。
SaveAdd方法的具体实现:
1. 使用open方法打开数据库
2. 遍历链表中的每一个节点,把节点信息转换成MySql的insert语句,并执行
3. 使用close方法关闭数据库
SaveDelete方法的具体实现:
1. 打开数据库
2. 遍历链表中的每一个节点,把节点信息转换成MySql的delete语句,并执行。
3. 关闭数据库
Book类,UserBook类的实现同上相类似。
User类的声明与实现:
#include "linerlist.h"
class User : public LinerList
{
public:
User();
virtual ~User();
virtual void Init();
virtual void SaveAdd();
virtual void SaveDelete();
};
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QDebug>
#include "user.h"
User::User()
{
}
User::~User()
{
}
void User::Init()
{
qDebug() << "Init User" << endl;
// 打开数据库,如果失败就退出
if (!this->db.open())
{
qDebug() << "Open User Database Error" << endl;
return;
}
qDebug() << "Open User Database Success" << endl;
// 该类提供了一些执行MySql语句函数
// 同时也保存了执行的结果
QSqlQuery query;
// 执行MySql语句,从查询users表中所有信息
query.exec("select * from users");
// 查询到多少条信息就表示有多少个用户
this->length = query.size();
// next函数使query指向下一条记录
// 成功返回true,失败返回false
while (query.next())
{
UserType* node = new UserType();
// value函数获得query指向的记录的第n个属性
node->SetId(query.value(0).toInt());
node->SetName(query.value(1).toString());
node->SetPassword(query.value(2).toString());
this->AddNode(node);
}
//关闭数据库
this->db.close();
}
void User::SaveAdd()
{
qDebug() << "Save Add User" << endl;
if (!this->db.open())
{
qDebug() << "Open User Database Error" << endl;
}
qDebug() << "Open User Database Success" << endl;
QString statement;
QSqlQuery query;
UserType* node = (UserType*)this->list->GetNext();
while (node != NULL)
{
// arg函数提供格式化字符串,用来代替字符串中的占位符%1,%2等等
statement = QString("insert into users (id, name, password) values "
"(%1, '%2', '%3');")
.arg(node->GetId()).arg(node->GetName()).arg(node->GetPassword());
qDebug() << statement << endl;
// 执行MySql语句,向users表中添加一条记录
query.exec(statement);
node = (UserType*)node->GetNext();
}
this->db.close();
}
void User::SaveDelete()
{
qDebug() << "Save Delete User" << endl;
if (!this->db.open())
{
qDebug() << "Open User Database Error" << endl;
}
qDebug() << "Open User Database Success" << endl;
QString statement;
QSqlQuery query;
UserType* node = (UserType*)this->list->GetNext();
while (node != NULL)
{
statement = QString("delete from users where id = %1;").arg(node->GetId());
qDebug() << statement << endl;
// 执行MySql语句,从users表中删除一条记录
query.exec(statement);
node = (UserType*)node->GetNext();
}
this->db.close();
}
Book类的声明与实现:
#include "linerlist.h"
class Book : public LinerList
{
public:
Book();
virtual ~Book();
virtual void Init();
virtual void SaveDelete();
virtual void SaveAdd();
};
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QDebug>
#include "book.h"
Book::Book()
{
}
Book::~Book()
{
}
void Book::SaveAdd()
{
qDebug() << "Save Add Book" << endl;
if (!this->db.open())
{
qDebug() << "Open Book Database Error" << endl;
}
qDebug() << "Open Book Database Success" << endl;
QString statement;
QSqlQuery query;
BookType* node = (BookType*)this->list->GetNext();
while (node != NULL)
{
statement = QString("insert into books (id, name, author, category,"
" introduction) values (%1, '%2', '%3', '%4','%5');")
.arg(node->GetId()).arg(node->GetName()).arg(node->GetAuthor())
.arg(node->GetCategory()).arg(node->GetIntroduction());
qDebug() << statement << endl;
query.exec(statement);
node = (BookType*)node->GetNext();
}
this->db.close();
}
void Book::SaveDelete()
{
qDebug() << "Save Delete Book" << endl;
if (!this->db.open())
{
qDebug() << "Open Book Database Error" << endl;
return;
}
qDebug() << "Open Book Database Success" << endl;
QString statement;
BookType* node = (BookType*)this->list->GetNext();
QSqlQuery query;
while (node != NULL)
{
statement = QString("delete from books where id = %1;").arg(node->GetId());
qDebug() << statement << endl;
query.exec(statement);
node = (BookType*)node->GetNext();
}
this->db.close();
}
void Book::Init()
{
qDebug() << "Init Book" << endl;
if (!this->db.open())
{
qDebug() << "Open Book Database Error" << endl;
return;
}
qDebug() << "Open Book Database Success" << endl;
QSqlQuery query;
query.exec("select * from books");
this->length = query.size();
while (query.next())
{
BookType* node = new BookType();
node->SetId(query.value(0).toInt());
node->SetName(query.value(1).toString());
node->SetAuthor(query.value(2).toString());
node->SetCategory(query.value(3).toString());
node->SetIntroduction(query.value(4).toString());
this->AddNode(node);
}
this->db.close();
}
UserBook类的声明与实现:
#include "linerlist.h"
class UserBook : public LinerList
{
public:
UserBook(int id);
virtual ~UserBook();
virtual void Init();
virtual void SaveAdd();
virtual void SaveDelete();
public:
int userId;
};
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QDebug>
#include "userbook.h"
UserBook::UserBook(int id)
{
this->userId = id;
}
UserBook::~UserBook()
{
}
void UserBook::Init()
{
qDebug() << "Init UserBook" << endl;
if (!this->db.open())
{
qDebug() << "Open Database UserBook Errors" << endl;
return;
}
qDebug() << "Open Database UserBook Success" << endl;
QSqlQuery query;
QString statement;
statement = QString("select * from userBooks where userId = %1;").arg(this->userId);
qDebug() << statement << endl;
query.exec(statement);
this->length = query.size();
while (query.next())
{
UserBookType* node = new UserBookType();
node->SetId(query.value(0).toInt());
node->SetBookId(query.value(1).toInt());
node->SetYear(query.value(2).toInt());
node->SetMonth(query.value(3).toInt());
node->SetDay(query.value(4).toInt());
this->AddNode(node);
}
this->db.close();
}
void UserBook::SaveAdd()
{
qDebug() << "Save Add UserBook" << endl;
if (!this->db.open())
{
qDebug() << "Open Database UserBook Errors" << endl;
return;
}
qDebug() << "Open Database UserBook Success" << endl;
UserBookType* node = (UserBookType*)this->list->GetNext();
QSqlQuery query;
QString statement;
while (node != NULL)
{
statement = QString("insert into userBooks (userId, bookId, year, mouth, day)"
" values (%1, %2, %3, %4, %5);")
.arg(node->GetId()).arg(node->GetBookId()).arg(node->GetYear())
.arg(node->GetMonth()).arg(node->GetDay());
qDebug() << statement << endl;
query.exec(statement);
node = (UserBookType*)node->GetNext();
}
this->db.close();
}
void UserBook::SaveDelete()
{
qDebug() << "Save Delete UserBook" << endl;
if (!this->db.open())
{
qDebug() << "Open Database UserBook Errors" << endl;
return;
}
qDebug() << "Open Database UserBook Success" << endl;
UserBookType* node = (UserBookType*)this->list->GetNext();
QSqlQuery query;
QString statement;
while (node != NULL)
{
statement = QString("delete from userBooks where userId = %1"
" and bookId = %2;")
.arg(node->GetId()).arg(node->GetBookId());
qDebug() << statement << endl;
query.exec(statement);
node = (UserBookType*)node->GetNext();
}
this->db.close();
}