ZBLOG

qt单例模式封装一个链接 mysql 的类

在Qt中实现一个单例模式的MySQL连接类,可以确保在应用程序的整个生命周期中只有一个数据库连接实例。下面是一个简单的示例,展示如何封装这样的单例类。

1. 数据库管理类头文件 (DatabaseManager.h)

#ifndef DATABASEMANAGER_H
#define DATABASEMANAGER_H

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QString>
#include <QObject>

class DatabaseManager : public QObject {
    Q_OBJECT

public:
    static DatabaseManager& getInstance();
    bool open(const QString &host, const QString &databaseName, 
              const QString &user, const QString &password);
    void close();
    bool executeQuery(const QString &queryStr);

private:
    DatabaseManager(QObject *parent = nullptr);
    ~DatabaseManager();

    // 禁止拷贝构造和赋值
    DatabaseManager(const DatabaseManager&) = delete;
    DatabaseManager& operator=(const DatabaseManager&) = delete;

private:
    QSqlDatabase db;
};

#endif // DATABASEMANAGER_H

2. 数据库管理类实现文件 (DatabaseManager.cpp)

#include "DatabaseManager.h"

DatabaseManager::DatabaseManager(QObject *parent) : QObject(parent) {
}

DatabaseManager::~DatabaseManager() {
    close();
}

DatabaseManager& DatabaseManager::getInstance() {
    static DatabaseManager instance; // 懒汉式单例
    return instance;
}

bool DatabaseManager::open(const QString &host, const QString &databaseName, 
                           const QString &user, const QString &password) {
    
    if (db.isOpen()) { // 如果已打开,则直接返回true
        return true;
    }
    
    db = QSqlDatabase::addDatabase("QMYSQL");
    
    db.setHostName(host);
    db.setDatabaseName(databaseName);
    db.setUserName(user);
    db.setPassword(password);
    
    if (!db.open()) {
        qWarning() << "Cannot open database:" << db.lastError().text();
        return false;
    }
    
    return true;
}

void DatabaseManager::close() {
    if (db.isOpen()) {
        db.close();
        QSqlDatabase::removeDatabase(db.connectionName()); // 清理数据库连接
        db = QSqlDatabase(); // 重置数据库对象
     }
}

bool DatabaseManager::executeQuery(const QString &queryStr) {
   QSqlQuery query;

   if (!query.exec(queryStr)) {
       qWarning() << "Query execution error:" << query.lastError().text();
       return false;
   }

   return true;
}

3. 使用示例

#include <QCoreApplication>
#include "DatabaseManager.h"

int main(int argc, char *argv[]) {
   QCoreApplication a(argc, argv);

   // MySQL数据库信息
   QString host = "localhost";         // 数据库主机名或IP地址
   QString databaseName = "test_db";   // 数据库名称
   QString user = "root";               // 用户名
   QString password = "your_password";  // 密码

   DatabaseManager& dbManager = DatabaseManager::getInstance();

   if (dbManager.open(host, databaseName, user, password)) {
       // 执行创建表的 SQL 语句(如有需要)
       dbManager.executeQuery("CREATE TABLE IF NOT EXISTS test(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255))");

       // 插入数据示例
       dbManager.executeQuery("INSERT INTO test(name) VALUES('Alice')");

       // 查询数据示例(扩展这个方法来处理查询结果)
       // ...

       // 关闭数据库连接(可选,通常在程序结束时会自动调用析构函数)
       dbManager.close();
   }

   return a.exec();
}

注意事项:

  1. 确保安装了MySQL驱动:在你的Qt环境中,必须安装适用于Qt的MySQL驱动程序。如果没有,可以通过Qt的维护工具或手动编译驱动来获取。

  2. 项目文件 (.pro):在.pro文件中添加:

    QT += sql
    
  3. 根据需要扩展:可以增加更多功能,如事务处理、查询结果返回等,以满足实际需求。

  4. 线程安全:此实现并不是线程安全的,如果你的应用程序使用多线程访问数据库,你需要采取额外措施以保证线程安全。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20673

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?