1、mysql安装以及使用

安装教程
mysql使用说明(菜鸟教程)

2、qt使用mysql

我觉得下面这篇文章很有参考价值
qt使用mysql.

对qt使用mysql的安装过程做一个简单的总结吧,以免以后踩坑

在安装数据库时首先要看一下qt的编译版本是32位还是64位,Qt5.6的话只有32位的,所以这时候就要安装32位的数据库了,否则qt是无法操作64位的数据库的。

装完之后要把数据库的 libmysql.ddl 放到qt的编译的使用的mingw的目录的bin下面

看的时候如下请添加图片描述
我是Qt5.6.2 MinGW 32bit

然后找到Qt的安装路径,把32位的数据库 的libmysql.ddl 放到目录下
在这里插入图片描述

3、一个测试Qt是否能打开数据库的例子

第一步,正常创建一个widget项目

然后给项目文件也就是.pro文件添加QT += sql,如下图
在这里插入图片描述
然后保存

第二步,使用 QSqlDatabase

代码如下

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlDatabase>
#include <QDebug>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    QSqlDatabase db;
};

#endif // WIDGET_H


Widget::~Widget()
{
    delete ui;
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //使用mysql
    db = QSqlDatabase::addDatabase("QMYSQL");
    //设置ip、端口、名字、密码
    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("123456");
    //打开数据库
    bool res = db.open();
    if(res){
        qDebug()<<"数据库连接成功";
    }else{
        qDebug()<<"数据库连接失败";
    }
    //关闭数据库
    db.close();
}

Widget::~Widget()
{
    delete ui;
}


第三步、运行程序

输出数据库连接成功说明qt可以使用数据库了
请添加图片描述
如果不行的话,就要看一下是哪里出现问题了,到时候就只能复制错误代码自己百度了,查找解决问题是每个程序员必须具备的能力!!!!!!

4、一个使用实例(仅仅是后面用来参考使用步骤)

本实例仅仅是用来参考使用步骤

例子说明:
提供一个用户界面,可以输入用户名和密码,提供两个按键,登录和注册,点击注册,把用户名和密码存入数据库,点击登录,对用户名和密码进行验证。
利用关闭事件关闭数据库

代码部分:

 .pro文件记得加“QT+=sql”

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlDatabase>
#include <QDebug>
#include <QCloseEvent>
#include <QSqlQuery>
#include <QSqlError>
#include <QMessageBox>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
   Q_OBJECT

public:
   explicit Widget(QWidget *parent = 0);
   ~Widget();

private slots:
   void on_pushreg_clicked();

   void on_pushlogic_clicked();

private:
   Ui::Widget *ui;
   QSqlDatabase db;
   QSqlQuery *query;
   QMessageBox box;

protected:
   virtual void closeEvent(QCloseEvent * ev);
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //初始化数据库描述符
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1"); //本地数据库
    db.setPort(3306);//端口号
    db.setUserName("root"); //登录用户
    db.setPassword("123456");//登录密码
    db.setDatabaseName("1030_test");//使用的数据库的table
    bool res = db.open(); //打开数据库
    if(!res){
        qDebug()<<"数据库打开失败";
    }
    //该变量必须在打开数据库之后进行操作,否则无法操作数据库
    query = new QSqlQuery;
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushreg_clicked()
{
    QString name = ui->lineuser_name->text();
    QString pswd = ui->linepassword->text();
    //占位符的格式为 :+name
    query->prepare("insert into tb2 (name,pswd) values (:name,:pswd)");
    //用来绑定值
    query->bindValue(":name",name);
    query->bindValue(":pswd",pswd);
    bool res = query->exec();
    if(!res){
        //用来打印错误信息
        qDebug()<<query->lastError().text();
    }
}

void Widget::closeEvent(QCloseEvent *ev)
{
    Q_UNUSED(ev);
    db.close();//关闭数据库
    delete query;
}

void Widget::on_pushlogic_clicked()
{
    QString name = ui->lineuser_name->text();
    QString pswd = ui->linepassword->text();
    QString _name;
    QString _pswd;
    query->prepare("select * from tb2 where name = :name");
    query->bindValue(":name",name);
    bool res = query->exec();
    if(!res){
        qDebug()<<query->lastQuery();
    }
    while(query->next()){
        _name = query->value("name").toString();
        _pswd = query->value("pswd").toString();
        if(_name == name){
            if(pswd == _pswd){
                box.setText("登录成功");
                box.show();
                return;
            }else{
                box.setText("密码错误");
                box.show();
                return;
            }
        }
    }
    box.setText("未注册");
    box.show();
    return;
}

创建的数据库表格内容如下
在这里插入图片描述
功能验证
请添加图片描述

5、把数据库的调用封装成一个单例

目录

在这里插入图片描述

代码(内函注释)

dbhelper.h
#ifndef DBHELPER_H
#define DBHELPER_H

#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QVariant>

class dbhelper
{
public:
    dbhelper();
    static dbhelper *getIntance(QString);
    void setHostName(QString hostname);
    void setPort(int port);
    void setUserName(QString name);
    void setPassword(QString pswd);
    void setDatabaseName(QString name);
    void open();
    void close();
    bool exec(QString cmd);
    bool prepare(const QString &cmd);
    void bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In);
    bool exec();
    bool next();
    QVariant value(int index);
    QVariant value(const QString &name);


private:
    dbhelper(QString driver);
    static dbhelper* instance;
    QSqlDatabase *db;
    QSqlQuery *query;

};

#endif // DBHELPER_H

widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QCloseEvent>
#include "dbhelper.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
protected:
    virtual void closeEvent(QCloseEvent *ev);
private slots:
    void on_pushButton_clicked();
};

#endif // WIDGET_H

dbhelper.cpp
#include "dbhelper.h"


dbhelper *dbhelper::getIntance(QString driver)
{
    if(instance == NULL){
        instance = new dbhelper(driver);
    }
    return instance;
}

void dbhelper::setHostName(QString hostname)
{
    db->setHostName(hostname);
}

void dbhelper::setPort(int port)
{
    db->setPort(port);
}

void dbhelper::setUserName(QString name)
{
    db->setUserName(name);
}

void dbhelper::setPassword(QString pswd)
{
    db->setPassword(pswd);
}

void dbhelper::setDatabaseName(QString name)
{
    db->setDatabaseName(name);
}

void dbhelper::open()
{
    bool res = db->open();
    if(!res){
        qDebug()<<"数据库打开失败";
    }
    query = new QSqlQuery;
}

void dbhelper::close()
{
    return db->close();
    delete query;
}

bool dbhelper::exec(QString cmd)
{
    bool res = query->exec(cmd);
    if(!res){
        qDebug()<<query->lastError().text();
    }
    return res;
}

bool dbhelper::prepare(const QString &cmd)
{
    bool res = query->prepare(cmd);
    if(!res){
        qDebug()<<query->lastError().text();
    }
    return res;
}

void dbhelper::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType)
{
    query->bindValue(placeholder,val);
}

bool dbhelper::exec()
{
    bool res = query->exec();
    if(!res){
        qDebug()<<query->lastError().text();
    }
    return res;
}

bool dbhelper::next()
{
    return query->next();
}

QVariant dbhelper::value(int index)
{
    return query->value(index);
}

QVariant dbhelper::value(const QString &name)
{
    return query->value(name);
}


dbhelper::dbhelper(QString driver)
{
    db = new QSqlDatabase;
    *db = QSqlDatabase::addDatabase(driver);
}

widget.cpp
#include "widget.h"
#include "ui_widget.h"

dbhelper * dbhelper::instance = NULL;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    dbhelper *db = dbhelper::getIntance("QMYSQL");
    db->setHostName("localhost");
    db->setPort(3306);
    db->setUserName("root");
    db->setPassword("123456");
    db->setDatabaseName("1030_test");
    db->open();
}

Widget::~Widget()
{
    delete ui;
}


void Widget::closeEvent(QCloseEvent *ev)
{
    Q_UNUSED(ev);
    //因为是单例模式所以两次获取的db也肯定是一模一样的
    dbhelper *db = dbhelper::getIntance("QMYSQL");
    db->close();
}

void Widget::on_pushButton_clicked()
{
    QString show;
    dbhelper *db = dbhelper::getIntance("QMYSQL");
    bool res = db->prepare("select * from tb2");
    if(!res){
        qDebug()<<"查询数据库失败";
    }
    db->exec();
    while(db->next()){
        QString name = db->value("name").toString();
        QString pswd = db->value(1).toString();
        show += name+" "+pswd+"\n";
    }
    ui->label->setText(show);
}

运行效果

请添加图片描述
记录完毕,收工!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐