ZBLOG

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

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

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

  1. #ifndef DATABASEMANAGER_H
  2. #define DATABASEMANAGER_H
  3. #include <QSqlDatabase>
  4. #include <QSqlQuery>
  5. #include <QSqlError>
  6. #include <QString>
  7. #include <QObject>
  8. class DatabaseManager : public QObject {
  9. Q_OBJECT
  10. public:
  11. static DatabaseManager& getInstance();
  12. bool open(const QString &host, const QString &databaseName,
  13. const QString &user, const QString &password);
  14. void close();
  15. bool executeQuery(const QString &queryStr);
  16. private:
  17. DatabaseManager(QObject *parent = nullptr);
  18. ~DatabaseManager();
  19. // 禁止拷贝构造和赋值
  20. DatabaseManager(const DatabaseManager&) = delete;
  21. DatabaseManager& operator=(const DatabaseManager&) = delete;
  22. private:
  23. QSqlDatabase db;
  24. };
  25. #endif // DATABASEMANAGER_H

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

  1. #include "DatabaseManager.h"
  2. DatabaseManager::DatabaseManager(QObject *parent) : QObject(parent) {
  3. }
  4. DatabaseManager::~DatabaseManager() {
  5. close();
  6. }
  7. DatabaseManager& DatabaseManager::getInstance() {
  8. static DatabaseManager instance; // 懒汉式单例
  9. return instance;
  10. }
  11. bool DatabaseManager::open(const QString &host, const QString &databaseName,
  12. const QString &user, const QString &password) {
  13. if (db.isOpen()) { // 如果已打开,则直接返回true
  14. return true;
  15. }
  16. db = QSqlDatabase::addDatabase("QMYSQL");
  17. db.setHostName(host);
  18. db.setDatabaseName(databaseName);
  19. db.setUserName(user);
  20. db.setPassword(password);
  21. if (!db.open()) {
  22. qWarning() << "Cannot open database:" << db.lastError().text();
  23. return false;
  24. }
  25. return true;
  26. }
  27. void DatabaseManager::close() {
  28. if (db.isOpen()) {
  29. db.close();
  30. QSqlDatabase::removeDatabase(db.connectionName()); // 清理数据库连接
  31. db = QSqlDatabase(); // 重置数据库对象
  32. }
  33. }
  34. bool DatabaseManager::executeQuery(const QString &queryStr) {
  35. QSqlQuery query;
  36. if (!query.exec(queryStr)) {
  37. qWarning() << "Query execution error:" << query.lastError().text();
  38. return false;
  39. }
  40. return true;
  41. }

3. 使用示例

  1. #include <QCoreApplication>
  2. #include "DatabaseManager.h"
  3. int main(int argc, char *argv[]) {
  4. QCoreApplication a(argc, argv);
  5. // MySQL数据库信息
  6. QString host = "localhost"; // 数据库主机名或IP地址
  7. QString databaseName = "test_db"; // 数据库名称
  8. QString user = "root"; // 用户名
  9. QString password = "your_password"; // 密码
  10. DatabaseManager& dbManager = DatabaseManager::getInstance();
  11. if (dbManager.open(host, databaseName, user, password)) {
  12. // 执行创建表的 SQL 语句(如有需要)
  13. dbManager.executeQuery("CREATE TABLE IF NOT EXISTS test(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255))");
  14. // 插入数据示例
  15. dbManager.executeQuery("INSERT INTO test(name) VALUES('Alice')");
  16. // 查询数据示例(扩展这个方法来处理查询结果)
  17. // ...
  18. // 关闭数据库连接(可选,通常在程序结束时会自动调用析构函数)
  19. dbManager.close();
  20. }
  21. return a.exec();
  22. }

注意事项:

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

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

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

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?