在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();
}
注意事项:
确保安装了MySQL驱动:在你的Qt环境中,必须安装适用于Qt的MySQL驱动程序。如果没有,可以通过Qt的维护工具或手动编译驱动来获取。
项目文件 (.pro):在
.pro
文件中添加:QT += sql
根据需要扩展:可以增加更多功能,如事务处理、查询结果返回等,以满足实际需求。
线程安全:此实现并不是线程安全的,如果你的应用程序使用多线程访问数据库,你需要采取额外措施以保证线程安全。
内容由零声教学AI助手提供,问题来源于学员提问