QT 6.5 连接MySQL数据库实现增删改查

一、环境及其版本

windows 10

mysql版本:8.4

qt版本:6.5.3

二、数据库连接

最开始遇到了没有MySQL驱动的问题,网上找了好久,终于找到了这篇qt6.5编译mysql驱动

终于是解决了连接问题

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QPSQL 

那现在我们开始连接,先创建了一个控制台项目用来测试

新建一个Mysql_manager类

定义了一个结构体来保存配置信息

// 连接数据库的一些必要信息
struct ConnectionInfo
{
    const QString database;        // 数据库驱动名
    const QString host;            // 主机地址
    const QString user;            // 用户名
    const QString password;        // 密码
    const QString database_name;   // 数据库名

    // 构造函数
    ConnectionInfo(const QString db, const QString h, const QString u, const QString p, const QString dn)
        : database(db), host(h), user(u), password(p), database_name(dn) {}
};

定义一个初始化函数 

public:
    // 连接数据库
    bool Init(ConnectionInfo& info);
    // 释放连接
    void Free_Connect();


private:
    QSqlDatabase qdb;

cpp实现:

bool Mysql_manager::Init(ConnectionInfo &info)
{
    qdb=QSqlDatabase::addDatabase(info.database);
    qdb.setHostName(info.host);
    qdb.setDatabaseName(info.database_name);
    qdb.setUserName(info.user);
    qdb.setPassword(info.password);
    return qdb.open();
}

void Mysql_manager::Free_Connect()
{
    qdb.close();
}

测试连接:

    //配置数据库
    Mysql_manager db_manager;
    ConnectionInfo connection_config("QMYSQL","localhost","root","root123456","qt_test_database");
    if(!db_manager.Init(connection_config))
        qDebug()<<"数据库打开失败";




db_manager.Free_Connect();//最后释放连接

三、增删改查

函数定义

    // // 增加数据
    bool Insert_Student(const QString &name, const QString &sex, int age);

    // // 删除数据
    bool Delete_Student(int studentId);

    // // 更新数据
    bool Update_Student(int studentId, const QString &newName, int newAge);

    // 查询数据
    QList<QVariantMap> Select_Students(const QString &whereClause = "");

函数实现

bool Mysql_manager::Insert_Student(const QString &name, const QString &sex, int age) {
    // QString sql = QString("INSERT INTO students (name, sex, age) VALUES ('%1', '%2', %3)")
    //                   .arg(name).arg(sex).arg(age);
    // return Execute_Sql(sql);
    QSqlQuery query;
    query.prepare("INSERT INTO students (name, sex, age) VALUES (:name, :sex, :age)");
    query.bindValue(":name", name);
    query.bindValue(":sex", sex);
    query.bindValue(":age", age);
    return query.exec();
}

bool Mysql_manager::Delete_Student(int studentId) {
    // QString sql = QString("DELETE FROM students WHERE id = %1").arg(studentId);
    // return Execute_Sql(sql);
    QSqlQuery query;
    query.prepare("DELETE FROM students WHERE id = :id");
    query.bindValue(":id", studentId);
    return query.exec();
}

bool Mysql_manager::Update_Student(int studentId, const QString &newName, int newAge) {
    // QString sql = QString("UPDATE students SET name = '%1', age = %2 WHERE id = %3")
    //                   .arg(newName).arg(newAge).arg(studentId);
    // return Execute_Sql(sql);
    QSqlQuery query;
    query.prepare("UPDATE students SET name = :name, age = :age WHERE id = :id");
    query.bindValue(":name", newName);
    query.bindValue(":age", newAge);
    query.bindValue(":id", studentId);
    return query.exec();

}

QList<QVariantMap> Mysql_manager::Select_Students(const QString &whereClause) {
    QList<QVariantMap> results;
    QString sql = QString("SELECT * FROM students %1").arg(whereClause.isEmpty() ? "" : "WHERE " + whereClause);
    QSqlQuery query(sql);
    if (!query.exec()) {
        // 查询失败,抛出异常
        throw std::runtime_error(query.lastError().text().toStdString());
    }
    while (query.next()) {
        QVariantMap row;
        row["id"] = query.value("id").toInt();
        row["name"] = query.value("name").toString();
        row["sex"] = query.value("sex").toString();
        row["age"] = query.value("age").toInt();
        results.append(row);
    }
    return results;
}

测试案例

    //增加一条记录
    if(!db_manager.Insert_Student("钱一","F",34)){
        qDebug()<<"数据插入失败";
    }

    //删除一条记录
    if(!db_manager.Delete_Student(6)){
        qDebug()<<"数据更改失败";
    }

    //更改一条记录
    if(!db_manager.Update_Student(6,"钱七",24)){
        qDebug()<<"数据更改失败";
    }

    //数据库查询
    try {
        // QList<QVariantMap> students = db_manager.Select_Students("id=1");
        QList<QVariantMap> students = db_manager.Select_Students();
        foreach (const QVariantMap &student, students) {
            qDebug() << "ID:" << student["id"].toInt()
                     << "Name:" << student["name"].toString()
                     << "Sex:" << student["sex"].toString()
                     << "Age:" << student["age"].toInt();
        }
        // 处理查询结果
    } catch (const std::runtime_error& e) {
        // 处理查询失败的情况
        qDebug() << "查询失败:" << e.what();
    }

四、头文件,cpp文件

main.cpp

#include <QCoreApplication>
#include <QDebug>
#include <QtSql/QSqlQuery>
#include <mysql_manager.h>


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

    //配置数据库
    Mysql_manager db_manager;
    ConnectionInfo connection_config("QMYSQL","localhost","root","root123456","qt_test_database");
    if(!db_manager.Init(connection_config))
        qDebug()<<"数据库打开失败";

    //数据库查询
    try {
        // QList<QVariantMap> students = db_manager.Select_Students("id=1");
        QList<QVariantMap> students = db_manager.Select_Students();
        foreach (const QVariantMap &student, students) {
            qDebug() << "ID:" << student["id"].toInt()
                     << "Name:" << student["name"].toString()
                     << "Sex:" << student["sex"].toString()
                     << "Age:" << student["age"].toInt();
        }
        // 处理查询结果
    } catch (const std::runtime_error& e) {
        // 处理查询失败的情况
        qDebug() << "查询失败:" << e.what();
    }
    //增加一条记录
    if(!db_manager.Insert_Student("钱一","F",34)){
        qDebug()<<"数据插入失败";
    }

    //更改一条记录
    if(!db_manager.Update_Student(6,"钱七",24)){
        qDebug()<<"数据更改失败";
    }

    //删除一条记录
    if(!db_manager.Delete_Student(6)){
        qDebug()<<"数据更改失败";
    }



    //数据库查询
    try {
        // QList<QVariantMap> students = db_manager.Select_Students("id=1");
        QList<QVariantMap> students = db_manager.Select_Students();
        foreach (const QVariantMap &student, students) {
            qDebug() << "ID:" << student["id"].toInt()
                     << "Name:" << student["name"].toString()
                     << "Sex:" << student["sex"].toString()
                     << "Age:" << student["age"].toInt();
        }
        // 处理查询结果
    } catch (const std::runtime_error& e) {
        // 处理查询失败的情况
        qDebug();
        qDebug() << "查询失败:" << e.what();
    }


    db_manager.Free_Connect();
    return a.exec();
}

mysql_manager.h

#ifndef MYSQL_MANAGER_H
#define MYSQL_MANAGER_H

#include <QSqlDatabase>
#include <QSqlError>
/*
 *函数描述:无
 *参数:   无
 *返回值: 无
 *注意:   无
*/

// 连接数据库的一些必要信息
struct ConnectionInfo
{
    const QString database;        // 数据库驱动名
    const QString host;            // 主机地址
    const QString user;            // 用户名
    const QString password;        // 密码
    const QString database_name;   // 数据库名

    // 构造函数
    ConnectionInfo(const QString db, const QString h, const QString u, const QString p, const QString dn)
        : database(db), host(h), user(u), password(p), database_name(dn) {}
};

class Mysql_manager
{

public:
    // 连接数据库
    bool Init(ConnectionInfo& info);

    // 释放连接
    void Free_Connect();

    // // 增加数据
    bool Insert_Student(const QString &name, const QString &sex, int age);

    // // 删除数据
    bool Delete_Student(int studentId);

    // // 更新数据
    bool Update_Student(int studentId, const QString &newName, int newAge);

    // 查询数据
    QList<QVariantMap> Select_Students(const QString &whereClause = "");

private:
    QSqlDatabase qdb;

};//class Mysql_manager end



#endif // MYSQL_MANAGER_H

mysql_manager.cpp

#include "mysql_manager.h"

#include <QSqlQuery>
/**
 *函数描述: 连接初始化
 *参数:     ConnectionInfo 结构体,存有连接数据库相关信息
 *返回值:   true 连接成功,false 连接失败(可能数据库配置错误);
 *注意:     无
*/
bool Mysql_manager::Init(ConnectionInfo &info)
{
    qdb=QSqlDatabase::addDatabase(info.database);
    qdb.setHostName(info.host);
    qdb.setDatabaseName(info.database_name);
    qdb.setUserName(info.user);
    qdb.setPassword(info.password);
    return qdb.open();
}

/**
 *函数描述: 释放连接
 *参数:     无
 *返回值:   无
 *注意:     无
*/
void Mysql_manager::Free_Connect()
{
    qdb.close();
}

/**
 *函数描述: 插入记录
 *参数:     const QString &name, const QString &sex, int age
 *返回值:   true 连接成功,false 连接失败;
 *注意:     无
*/
bool Mysql_manager::Insert_Student(const QString &name, const QString &sex, int age) {
    // QString sql = QString("INSERT INTO students (name, sex, age) VALUES ('%1', '%2', %3)")
    //                   .arg(name).arg(sex).arg(age);
    // return Execute_Sql(sql);
    QSqlQuery query;
    query.prepare("INSERT INTO students (name, sex, age) VALUES (:name, :sex, :age)");
    query.bindValue(":name", name);
    query.bindValue(":sex", sex);
    query.bindValue(":age", age);
    return query.exec();
}

/**
 *函数描述: 删除记录
 *参数:     int id
 *返回值:   true 连接成功,false 连接失败;
 *注意:     无
*/
bool Mysql_manager::Delete_Student(int studentId) {
    // QString sql = QString("DELETE FROM students WHERE id = %1").arg(studentId);
    // return Execute_Sql(sql);
    QSqlQuery query;
    query.prepare("DELETE FROM students WHERE id = :id");
    query.bindValue(":id", studentId);
    return query.exec();
}
/**
 *函数描述: 更新记录
 *参数:     int studentId, const QString &newName, int newAge
 *返回值:   true 连接成功,false 连接失败;
 *注意:     无
*/
bool Mysql_manager::Update_Student(int studentId, const QString &newName, int newAge) {
    // QString sql = QString("UPDATE students SET name = '%1', age = %2 WHERE id = %3")
    //                   .arg(newName).arg(newAge).arg(studentId);
    // return Execute_Sql(sql);
    QSqlQuery query;
    query.prepare("UPDATE students SET name = :name, age = :age WHERE id = :id");
    query.bindValue(":name", newName);
    query.bindValue(":age", newAge);
    query.bindValue(":id", studentId);
    return query.exec();

}
/**
 * 函数描述: 查询所有学生记录,
 * 参数:   无
 * 返回值: QList<QVariantMap>,包含查询到的学生记录。如果查询失败,则返回一个空的列表
 * 注意:   无
 */
QList<QVariantMap> Mysql_manager::Select_Students(const QString &whereClause) {
    QList<QVariantMap> results;
    QString sql = QString("SELECT * FROM students %1").arg(whereClause.isEmpty() ? "" : "WHERE " + whereClause);
    QSqlQuery query(sql);
    if (!query.exec()) {
        // 查询失败,抛出异常
        throw std::runtime_error(query.lastError().text().toStdString());
    }
    while (query.next()) {
        QVariantMap row;
        row["id"] = query.value("id").toInt();
        row["name"] = query.value("name").toString();
        row["sex"] = query.value("sex").toString();
        row["age"] = query.value("age").toInt();
        results.append(row);
    }
    return results;
}

QT连接MySQL数据库实现增删改查操作,可以按照以下步骤进行: 1. 首先,确保已经正确安装了MySQL数据库QT开发环境(如VS2015)。 2. 在QT中,使用QSqlDatabase类连接MySQL数据库。可以通过以下代码初始化数据库连接: QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); // 主机名 db.setDatabaseName("database_name"); // 数据库名 db.setUserName("username"); // 用户名 db.setPassword("password"); // 密码 3. 使用QSqlQuery类执行数据库操作。比如,可以使用以下代码实现查询操作: QSqlQuery query; query.exec("SELECT * FROM table_name"); while (query.next()) { QString column1 = query.value(0).toString(); QString column2 = query.value(1).toString(); // 处理查询结果 } 4. 实现插入操作可以使用以下代码: QSqlQuery query; query.prepare("INSERT INTO table_name (column1, column2) VALUES (:column1, :column2)"); query.bindValue(":column1", value1); query.bindValue(":column2", value2); query.exec(); 5. 实现删除操作可以使用以下代码: QSqlQuery query; query.prepare("DELETE FROM table_name WHERE column = :column"); query.bindValue(":column", value); query.exec(); 6. 实现更新操作可以使用以下代码: QSqlQuery query; query.prepare("UPDATE table_name SET column = :new_value WHERE column = :old_value"); query.bindValue(":new_value", new_value); query.bindValue(":old_value", old_value); query.exec(); 7. 最后,在完成数据库操作后,要记得关闭连接: db.close(); 以上是使用QT和VS2015连接MySQL数据库实现增删改查的基本步骤与代码示例。根据实际需求和表结构,可以对以上代码进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值