用Qt搭建图书管理系统(二)

 

第二章 把基本的数据结构具体为项目所需要的数据结构

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();
}

猜你喜欢

转载自blog.csdn.net/hq_cjj/article/details/79468322