QT连接mysql数据库的调试过程中遇到各种问题,最后终于调通。然后把代码封装成了类的形式,把现有代码进行了重构。在设计mysql连接类过程中,使用了分层设计的思想,尽量使类更加通用。
在头文件databasehelper中,定义DataBaseHelper,
#include <QSqlDatabase>
class DataBaseHelper
{
public:
DataBaseHelper();
static DataBaseHelper* get();
QSqlDatabase db;
private:
static DataBaseHelper* pBaseHelper;
};
DataBaseHelper();是构造函数,在该函数中实现数据库的连接。
db是连接实例,在类外可以通过类指针pBaseHelper的方式访问。
pBaseHelper是静态类指针,在类首次被实例化后被赋值,指向类本身。
static DataBaseHelper* get();是单例模式的关键函数,该函数内容为
DataBaseHelper* DataBaseHelper::get()
{
if (pBaseHelper == NULL) {
pBaseHelper = new DataBaseHelper();
}
return pBaseHelper;
}
在每次创建类对象时判定该指针是否为空,如果为空调用构造函数,并给这个变量赋值。如果不为空,则直接返回使用。
这样在需要使用类的地方不通过构造函数进行实例化,而是使用get函数获取类对象。
DataBaseHelper* mbh;
mbh = DataBaseHelper::get();
类的构造函数是实现数据库连接的关键,
DataBaseHelper::DataBaseHelper()
{
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setPort(3306);
db.setDatabaseName("csd"); //数据库名
db.setUserName("root"); //用户名
db.setPassword("12345678"); //密码
if (!db.open())
{
QMessageBox::critical(0, QObject::tr("can't open database"),
"can't connect to database! ", QMessageBox::Cancel);
return;
}
//这儿可以做一些表格的创建工作,或者一些表格的自动导入。
//如果程序需要使用的表不存在,则进行新建,比如如下例子:
//说明:在维护良好的项目中,创建表的任务不会也不能用代码去做,因为客户端没有创建表的权限。
QSqlQuery query(db);
query.exec("SELECT table_name FROM information_schema.TABLES WHERE table_name ='COLORSPACE'");
if(query.next()) //如果找不到指定的表COLORSPACE
{
QVariant var = query.value(0);
QString str = var.toString();
}
else
{
bool success = query.exec("CREATE TABLE COLORSPACE (_id int primary key AUTO_INCREMENT, uuid varchar(50), color_name varchar(20), l varchar(10), a varchar(10), b varchar(10))");
QMessageBox msgBox;
if(success)
msgBox.setText("The data table was created successfully.");
else
msgBox.setText("Cannot create data table");
msgBox.exec();
}
}
可以看到,DataBaseHelper类只有数据库连接的功能,要实现具体的任务,还需要在其上在封装一层与数据关联的类,我把它叫做数据绑定类。
数据绑定类也设计成单例模式,并在类的构造函数中使用DataBaseHelper::get()实例化数据库连接类。然后在数据绑定类中实现增删查改功能。相关的代码实现在原来的博客中进行过介绍
https://blog.csdn.net/iamqianrenzhan/article/details/84667926
刚打开这个链接博客看了看,发现上面的部分代码在原来的博客中出现过,不过这次是加了讲解和注释的版本,面向对设计模式不熟悉的初学者。
如果在连接数据库过程中出现
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL QMYSQL3 QODBC
一般是qt默认安装的数据库驱动版本有问题,需要自己编译。在
https://blog.csdn.net/iamqianrenzhan/article/details/84839477
中有在Ubuntu系统中的解决方案,在window系统中的解决方案类似,核心就是要重新编译数据库驱动。