QSqlDatabase QSqlQuery 构建数据库操作基本框架 数据库模块(一)

一、效果图
在这里插入图片描述
二、代码

#ifndef DATABASEACCESS_H
#define DATABASEACCESS_H

#include <QObject>
#include <QMutex>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QMap>
#include <QVector>
#include <QSqlDriver>
#include <QDebug>
#include <QSqlRecord>
#include <QSqlError>
#include <QSqlResult>
#include <QSqlQueryModel>
#include <QDateTime>
//提供数据库、表基本操作框架
class DataBaseAccess
{
public:
    explicit DataBaseAccess();
    ~DataBaseAccess();
    static DataBaseAccess* instance();
    //指定数据库,指定表 插入数据
    void insertData(const QString& db,const QString& table,const QVector<QStringList>& values);
    //指定数据库,指定表,指定表字段,提取指定条件数据
    void selectData(const QString& db,const QString& table,const QStringList& fields,const QString& filter);
    //指定数据库,指定表,指定表字段,依据指定条件,修改数据
    void updateData(const QString& db,const QString& table,const QStringList& fields,const QStringList& values, const QString& filter);
    //指定数据库,指定表,依据指定条件,删除记录
    void deleteData(const QString& db,const QString& table,const QString& filter);
public:
    void test();
private:
    void init();
    //统一维护数据库 数据表的创建
    void init_dbTableData();
    void init_dbTable();

private:
     static QMutex m_mutex;
     static DataBaseAccess *m_pDBaccess;
     QMap<QString,QStringList> m_dbTableMap;//映射数据库连接和对应的表
};

#endif // DATABASEACCESS_H

#include "databaseaccess.h"
QMutex DataBaseAccess::m_mutex;
DataBaseAccess *DataBaseAccess::m_pDBaccess;
DataBaseAccess::DataBaseAccess()
{
    init();
    test();
}

DataBaseAccess::~DataBaseAccess()
{

}

DataBaseAccess *DataBaseAccess::instance()
{
    if(m_pDBaccess == nullptr){
        m_mutex.lock();
        if(m_pDBaccess == nullptr){
            m_pDBaccess = new DataBaseAccess;
        }
        m_mutex.unlock();
    }
    return m_pDBaccess;
}

void DataBaseAccess::insertData(const QString &db, const QString &table, const QVector<QStringList> &values)
{
    QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE",db);
    database.setDatabaseName(db);
    if (!database.open()){
        qDebug() << "insertData" << database.lastError();
    }

    QSqlQuery query(database);
    QString sql_all = QString("SELECT * FROM %1").arg(table);
    query.exec(sql_all);
    int primary_key = 0;
    if(query.last())
        primary_key = query.value("id").toInt();
    qDebug() << "primary_key" << primary_key;

    bool query_succ = true;

    if(!database.transaction())
        qDebug() << "insertData transaction fail";

    foreach(auto var,values){
        QStringList list = var;
        QString sql;
        sql = "INSERT INTO %1 VALUES (" + QString::number(primary_key) + ", ";
        primary_key++;

        for(int i=0;i<list.size();i++){
            sql = sql + "\"" + list.value(i) + "\"";
            if(i != (list.size() - 1))
                sql = sql + ", ";
            else
                sql = sql + ")";
        }

        sql = sql.arg(table);
        qDebug() << "insertData sql" <<sql;

        if(!query.exec(sql)){
            query_succ = false;
            qDebug() << "insertData" << query.lastError();
        }
    }

    if(query_succ)
        database.commit();
    else
        database.rollback();

    database.close();
}

void DataBaseAccess::selectData(const QString &db, const QString &table, const QStringList &fields, const QString &filter)
{
    QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE",db);
    database.setDatabaseName(db);
    if (!database.open()){
        qDebug() << "selectData" << database.lastError();
    }

    QString sql = "SELECT ";
    for(int i=0;i<fields.size();i++){
        sql = sql + fields.value(i);
        if(i != (fields.size() - 1))
            sql = sql + ", ";
        else
            sql = sql + " ";
    }
    sql = sql + "FROM " + table + " WHERE " + filter;
    qDebug() << "selectData sql" << sql;

    if(!database.transaction())
        qDebug() << "selectData transaction fail";

    QSqlQuery query(database);
    bool query_succ = query.exec(sql);
    while (query.next()) {
        qDebug()<<query.value("account").toString()<<query.value("appID").toString()<<query.value("appName").toString();
    }
    if(query_succ)
        database.commit();
    else
        database.rollback();

    database.close();
}

void DataBaseAccess::updateData(const QString &db, const QString &table, const QStringList &fields, const QStringList &values, const QString &filter)
{
    QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE",db);
    database.setDatabaseName(db);
    if (!database.open()){
        qDebug() << "updateData" << database.lastError();
    }

    QString sql = "UPDATE " + table + " SET ";
    for(int i=0;i<fields.size();i++){
        sql = sql + fields.value(i) + "=" + values.value(i);
        if(i != (fields.size() - 1))
            sql = sql + ", ";
    }
    sql = sql + " WHERE " + filter;
    qDebug() << "updateData sql" << sql;

    if(!database.transaction())
        qDebug() << "updateData transaction fail";

    QSqlQuery query(database);
    bool query_succ = query.exec(sql);
    while (query.next()) {
        qDebug()<<query.value("account").toString()<<query.value("appID").toString()<<query.value("appName").toString();
    }
    if(query_succ)
        database.commit();
    else
        database.rollback();

    database.close();
}

void DataBaseAccess::deleteData(const QString &db, const QString &table, const QString &filter)
{
    QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE",db);
    database.setDatabaseName(db);
    if (!database.open()){
        qDebug() << "deleteData" << database.lastError();
    }

    QString sql = "DELETE FROM " + table;
    sql = sql + " WHERE " + filter;
    qDebug() << "deleteData sql" << sql;

    if(!database.transaction())
        qDebug() << "deleteData transaction fail";

    QSqlQuery query(database);
    bool query_succ = query.exec(sql);

    if(query_succ)
        database.commit();
    else
        database.rollback();

    database.close();
}

void DataBaseAccess::test()
{

    QStringList list0;
    list0<<"pre1"<<"20202020202020"<<"baidu"<<"starttime"<<"endtime"<<"1"<<"0"<<"百度"<<"baidu.png"<<"F/img/tx";
    QStringList list1;
    list1<<"pre1"<<"20202020202020"<<"baidu"<<"starttime"<<"endtime"<<"1"<<"0"<<"百度"<<"baidu.png"<<"F/img/tx";
    QStringList list2;
    list2<<"pre1"<<"20202020202020"<<"baidu"<<"starttime"<<"endtime"<<"1"<<"0"<<"百度"<<"baidu.png"<<"F/img/tx";
    QStringList list3;
    list3<<"pre1"<<"20202020202020"<<"baidu"<<"starttime"<<"endtime"<<"1"<<"0"<<"百度"<<"baidu.png"<<"F/img/tx";
    QStringList list4;
    list4<<"pre1"<<"20202020202020"<<"baidu"<<"starttime"<<"endtime"<<"1"<<"0"<<"百度"<<"baidu.png"<<"F/img/tx";
    QVector<QStringList> vfields;
    vfields.append(list0);
    vfields.append(list1);
    vfields.append(list2);
    vfields.append(list3);
    vfields.append(list4);
    insertData("TaskMgr.db","TaskMgrList0",vfields);
    selectData("TaskMgr.db","TaskMgrList0",QStringList()<<"account"<<"appID"<<"appName",QString("id=2"));
    updateData("TaskMgr.db","TaskMgrList0",QStringList()<<"account"<<"appID"<<"appName",QStringList()<<"111"<<"111"<<"111",QString("id=2"));
    deleteData("TaskMgr.db","TaskMgrList0",QString("id=2"));
}

void DataBaseAccess::init()
{
    init_dbTableData();
    init_dbTable();
}

void DataBaseAccess::init_dbTableData()
{
    QString db0 = "TaskMgr.db";
    QStringList db0_tables;
    QString create_sql0 = "CREATE TABLE TaskMgrList0("
                          "id          INTEGER PRIMARY KEY AUTOINCREMENT  NOT NULL,"
                          "account     varchar(255)  NOT NULL ,"
                          "appID       varchar(255)  NOT NULL ,"
                          "appName     varchar(255)           ,"
                          "startTime   varchar(255)           ,"
                          "endTime     varchar(255)           ,"
                          "bOrder      varchar(255)           ,"
                          "status      INTEGER       NOT NULL ,"
                          "desc        TEXT                   ,"
                          "fileName    varchar(255)           ,"
                          "filePath    varchar(255)            "
                          ");";
    QString create_sql1 = "CREATE TABLE TaskMgrList1("
                          "id          INTEGER PRIMARY KEY AUTOINCREMENT  NOT NULL,"
                          "account     varchar(255)  NOT NULL ,"
                          "appID       varchar(255)  NOT NULL ,"
                          "appName     varchar(255)           ,"
                          "startTime   varchar(255)           ,"
                          "endTime     varchar(255)           ,"
                          "bOrder      varchar(255)           ,"
                          "status      INTEGER       NOT NULL ,"
                          "desc        TEXT                   ,"
                          "fileName    varchar(255)           ,"
                          "filePath    varchar(255)            "
                          ");";
    db0_tables.append(create_sql0);
    db0_tables.append(create_sql1);


    m_dbTableMap.insert(db0,db0_tables);
}

void DataBaseAccess::init_dbTable()
{
    qDebug()<<"init_db:"<<QSqlDatabase::drivers();
    QMap<QString,QStringList>::iterator iter;
    for(iter = m_dbTableMap.begin();iter!=m_dbTableMap.end();iter++) {
        QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE",iter.key());
        database.setDatabaseName(iter.key());
        if (!database.open()){
            qDebug() << "Error: Failed to connect database." << database.lastError();
        }
        database.transaction();
        QSqlQuery query(database);
        foreach(auto var,iter.value()){
            if(!query.exec(var)){
                qDebug() << "Error: Failed to create table." << query.lastError();
            }
        }
        database.commit();
        database.close();
    }
}

三、总结
1.封装DataBaseAccess数据库操作类,对外屏蔽sql语句具体实现细节
2.注意数据库驱动QSQLITE的选择
3.注意sql语句的格式,否者产生的问题比较多。

发布了30 篇原创文章 · 获赞 1 · 访问量 1139

猜你喜欢

转载自blog.csdn.net/u010906468/article/details/104911749