Qt操作数据库详解

内容提要

介绍数据库相关内容,了解连接数据库方法,掌握数据库的4种基本操作

主要内容

  1. 如何连接数据库
  2. 数据库的4大基本操作

1.如何连接数据库

1.1 先了解数据库驱动的作用

Qt SQL模块是Qt提供的一个访问数据库的接口,支持多种平台下使用不同类型的数据库,在这个过程中,数据库驱动 起到了很大的作用,它负责与不同的数据库进行通信,有了数据库驱动,我们才能使用不同类型的数据库。

以下是Qt支持的数据库驱动

如何查看当前版本Qt支持的数据库驱动

step1 新建一个项目Qt widgets项目,名称为myDataBaseDrivers,基类为QWidget

step2 在项目的.pro文件中,增加一条语句

QT += sql

step3 在 widget.h 中,添加以下代码

#include <QtSql/QSqlDatabase>
#include <QDebug>

step4 在 widget.cpp 中,添加以下代码

qDebug() << QSqlDatabase::drivers();

此时程序应该是这样的

step5 Ctrl+r 运行程序,观察运行结果

从结果可以看出,没有MYSQL数据库的驱动,那我现在想使用这个数据库是不行的,需要添加这个驱动,详细的添加方法请看下面这个文章。

阿呆打瞌睡:Qt零基础系列10:windows 环境下如何编译MYSQL数据库驱动(补充内容)12 赞同 · 10 评论文章​编辑

1.2 连接数据库

要想连接数据库,我们可以通过QSqlDatabase类实现。连接的方法也很简单,参考下面的代码

// 创建一个数据库连接,指定数据库驱动
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

设置数据库信息

// 数据库连接需要设置的信息
    db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑  
    db.setDatabaseName("ceshi");// 数据库名    
    db.setUserName("root");// 用户名    
    db.setPassword("123456");// 密码
    db.setPort(3306);// 端口号

连接数据库

// 连接数据库
    bool ok = db.open();

    if (ok)
    {
        qDebug() << "database connect is ok";
    }
    else
    {
        qDebug() << "database connect is fail";
    }

此时程序应该是这样的

Ctrl+r的运行结果是这样的

另外需要注意的是,QSqlDatabase::​addDatabase()函数的第一个参数,是指定数据库的类型,如“QPSQL”,“QMYSQL”,第二个参数是 connectionName。如果在多线程里访问数据库,每个线程都需要使用不同的 connectionName,否则可能会出现错误。

为了便于使用,将上面的数据库连接封装成一个函数

widget.h文件修改,增加两个函数声明

private:
    void createConnectionByName(const QString &connectionName); //使用自定义 connectionName 创建连接
    QSqlDatabase getConnectionByName(const QString &connectionName);  // 使用自定义 connectionName 获取连接

widget.cpp文件修改,实现上述两个函数

//使用自定义 connectionName 创建连接
void Widget::createConnectionByName(const QString &connectionName){

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", connectionName);
    // 数据库连接需要设置的信息
    db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
    db.setDatabaseName("ceshi");// 数据库名
    db.setUserName("root");// 用户名
    db.setPassword("123456");// 密码
    db.setPort(3306);// 端口号

    // 连接数据库判断
    bool ok = db.open();

    if (ok){
        qDebug() << "database connect is ok";
    } else {
        qDebug() << "database connect is fail";
    }

}

// 使用自定义 connectionName 获取连接
QSqlDatabase Widget::getConnectionByName(const QString &connectionName) {
    // 获取数据库连接
    return QSqlDatabase::database(connectionName);
}

函数调用

// 创建名为 firstConnect 的数据库连接
    createConnectionByName("firstConnect");

修改后代码应该是这样的


2.数据库的4大基本操作

Qt里要执行SQL语句和浏览查询结果,通常使用QSqlQuery这个类来实现。

QSqlQuery常用函数整理

数据库SQL的几个常用的基本语法

2.1 增

 操作就是想数据库中插入输入,在做增操作前,我们需要先建立一个数据库表,用于做增删改查操作测试。核心SQL语句是

insert into 表名 (字段名1,字段名2,...字段名N) value (值1,值2,...值N)

step1 在前面代码的基础上,向 widget.h 文件中,增加一个头文件

#include <QSqlQuery>

step2 在 widget.cpp 中,增加创建数据库表的语句

// 实例化QSqlQuery,用于执行sql语句
    QSqlQuery query(db);
    // 创建一个表
    query.exec("create table newUser (id int primary key,username varchar(20))");

创建的这个表很简单,只有id和uername两项信息

step3 在 widget.h 增加函数声明

private:
    void insertUserName(QSqlDatabase db,const int &userid, const QString &name); // 增操作

step4 在 widget.cpp 实现增函数,用名称绑定的方式实现

/*
 * 功能描述:数据增操作
 * 向数据库中插入一条数据记录,名称绑定的方式实现
 * @param QSqlDatabase:数据库连接
 * @param id:用户id
 * @param username:用户名
 */
void Widget::insertUserName(QSqlDatabase db,const int &userid, const QString &name) {
    QSqlQuery query(db);
    query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
    query.bindValue(":id", userid);
    query.bindValue(":username", name);
    query.exec();
}

step5 向数据库表中增加数据,实现增操作

// [2]增操作
    qDebug() << "---- insert operation start----";
    insertUserName(db,1,"xiaoqiao");
    insertUserName(db,2,"wang");
    query.exec("INSERT INTO newUser (id, username) VALUES (3, 'alex')");
    insertUserName(db,4,"lili");

    queryAllUser(db); // 查询增操作结果
    qDebug() << "---- insert operation end----- " << "\n ";

插入一条数据记录可以使用名称绑定的方式,也是可以直接使用一条SQL语句的方式,当需要插入多条数据时,可以考虑用名称绑定的方式,这样不需要每次都写非常长的数据库指令,相对来说方便一些。

此是代码应该是这样的

step6 ctrl+r 运行程序 使用后面查操作,可以看到增加到数据库的新数据记录


2.2 删

删操作就是从数据库中删除数据记录,核心SQL语句是

delete from 表名 where 删除条件

step1 在 widget.h 增加函数声明

private:
    void deleteUser(QSqlDatabase db,const QString &username);// 删操作

step2 在 widget.cpp 实现删函数,用名称绑定的方式实现

/*
 * 功能描述:数据删操作
 * 从数据库中删除一条数据,名称绑定的方式实现
 * @param QSqlDatabase:数据库连接
 * @param username:用户名
 */
void Widget::deleteUser(QSqlDatabase db,const QString &username) {
    QSqlQuery query(db);
    query.prepare("DELETE FROM newUser WHERE username=:username");
    query.bindValue(":username", username);
    query.exec();
}

step3 调用刚才写的代码,实现删除记录操作

// [4]删操作
    qDebug() << "---- delete operation start----";
    deleteUser(db,"alex");
    query.exec(" DELETE FROM newUser WHERE username='wang' ");

    queryAllUser(db);
    qDebug() << "---- query operation end----" << "\n ";

两种方式删除记录,名称绑定的方式和直接使用SQL语句的方式

此时代码应该是这样的

step4 ctrl+r 运行程序

使用后面查操作,可以看到删操作后,数据库的记录变化

2.3 改

改操作就是修改数据库记录,核心SQL语句是

update 表名 set 字段名1=新值1,字段名2=新值2 where 条件语句

step1 在 widget.h 增加函数声明

private:
      void updateUser(QSqlDatabase db,const int &id,const QString &username); // 更操作,修改数据

step2 在 widget.cpp 实现该操作函数

/*
 * 功能描述:更新数据
 * 修改传入的 id 的 username
 * @param QSqlDatabase:数据库连接
 * @param id:用户id
 * @param username:用户名
 */
void Widget::updateUser(QSqlDatabase db,const int &id,const QString &username) {
    QSqlQuery query(db);
    query.prepare("update newUser set username=:username WHERE id=:id");
    query.bindValue(":id", id);
    query.bindValue(":username", username);
    query.exec();
}

step3 调用刚才写的代码,实现查询记录操作

// [5]改操作,根据id修改数据
    qDebug() << "---- update operation start----";
    qDebug() << "---- before update id 1: ----";
    queryAllUser(db);

    updateUser(db,1,"yase");// ID为1,数据修改为 yase
    query.exec(" update newUser set username='newname' WHERE id=4");

    qDebug() << "---- after update id 1: ----";
    queryAllUser(db);
    qDebug() << "---- update operation end----" << "\n ";

此时代码应该是这样的

step4 ctrl+r 运行程序,查看结果

2.4 查

查操作就是查询数据库记录,核心SQL语句是

select * from 表名
select 字段名1,字段名2 from 表名 where 查询条件

step1 在 widget.h 增加函数声明

private:
    void queryAllUser(QSqlDatabase db);    // 查操作,查询所有数据记录
    void selectQueryUser(QSqlDatabase db,const QString &username);  // 查操作,直接执行SQL语句方式
    void preparedQueryUser(QSqlDatabase db,const QString &username);// 查操作,名称绑定方式

step2 在 widget.cpp 实现查询函数

查询所有数据

/*
 * 功能描述:数据查操作,查询所有数据
 * 执行SQL语句的方式,查询所有的用户数据记录
 * @param QSqlDatabase:数据库连接
 */
void Widget::queryAllUser(QSqlDatabase db) {
    QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
    QSqlQuery query(db);                               // [1] 传入数据库连接
    query.exec(sql);                                   // [2] 执行sql语句
    while (query.next()) {                             // [3] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());
    }
}

查询一条数据,直接用sql的方式

/*
 * 功能描述:查询一条数据记录
 * 数据查操作,SQL语句的方式实现
 * @param QSqlDatabase:数据库连接
 * @param username:用户名
 */
void Widget::selectQueryUser(QSqlDatabase db,const QString &username) {
    QString sql = "SELECT * FROM newUser WHERE username='" + username + "'";
    QSqlQuery query(db);    // [1] 传入数据库连接
    query.exec(sql);        // [2] 执行sql语句
    while (query.next()) {  // [3] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());

    }
}

查询一条数据,名称绑定的方式

/*
 * 功能描述:查询一条数据记录
 * 数据查操作,名称绑定的方式实现
 * @param QSqlDatabase:数据库连接
 * @param username:用户名
 */
void Widget::preparedQueryUser(QSqlDatabase db,const QString &username) {
    QString sql = "SELECT * FROM newUser WHERE username=:username";
    QSqlQuery query(db);                    // [1] 传入数据库连接
    query.prepare(sql);                     // [2] 使用名称绑定的方式解析 SQL 语句
    query.bindValue(":username", username); // [3] 把占位符替换为传入的参数
    query.exec();                           // [4] 执行数据库操作
    while (query.next()) {                  // [5] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());

    }
}

step3 调用刚才写的代码,实现查询记录操作

查询所有数据

qDebug() << "---- query all data start----- ";
    queryAllUser(db); // 查询所有数据
    qDebug() << "---- query all data end----- " << "\n ";

名称绑定的方式查询一条数据记录

preparedQueryUser(db,"wang");

直接用SQL语句的方式查询一条数据记录

selectQueryUser(db,"lili"); // 直接执行sql语句方式

此时代码应该是这样的

step4 ctrl+r 运行程序

以上只是简单的实现增删改查操作,实际开发应用的时候,会比这个复杂,但是基本的实现过程是一样的,想了解数据库的其他操作,可以找找数据库相关的文档看一下。


添附

myDataBaseDrivers 项目 widget.h 源码

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtSql/QSqlDatabase>
#include <QDebug>
#include <QSqlQuery>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    void updateUser(QSqlDatabase db,const int &id,const QString &username);         // 更操作,修改数据
    void queryAllUser(QSqlDatabase db);                                             // 查操作,查询所有数据记录
    void selectQueryUser(QSqlDatabase db,const QString &username);                  // 查操作,直接执行SQL语句方式
    void preparedQueryUser(QSqlDatabase db,const QString &username);                // 查操作,名称绑定方式
    void deleteUser(QSqlDatabase db,const QString &username);                       // 删操作
    void insertUserName(QSqlDatabase db,const int &userid, const QString &name);    // 增操作
    void createConnectionByName(const QString &connectionName);                     //使用自定义 connectionName 创建连接
    QSqlDatabase getConnectionByName(const QString &connectionName);                // 使用自定义 connectionName 获取连接

    Ui::Widget *ui;


};
#endif // WIDGET_H

myDataBaseDrivers 项目 widget.cpp 源码

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 获取数据库驱动列表
    qDebug() << QSqlDatabase::drivers();

    // [1]创建名为 firstConnect 的数据库连接
    createConnectionByName("firstConnect");
    // 获取数据库
    QSqlDatabase db = getConnectionByName("firstConnect");

    // 实例化QSqlQuery,用于执行sql语句
    QSqlQuery query(db);
    // 创建一个表
    query.exec("create table newUser (id int primary key,username varchar(20))");


    // [2]增操作
    qDebug() << "---- insert operation start----";
    insertUserName(db,1,"xiaoqiao");
    insertUserName(db,2,"wang");
    query.exec("INSERT INTO newUser (id, username) VALUES (3, 'alex')");
    insertUserName(db,4,"lili");

    queryAllUser(db); // 查询增操作结果
    qDebug() << "---- insert operation end----- " << "\n ";


    // [3]查询操作
    qDebug() << "---- query operation start----- ";
    selectQueryUser(db,"lili"); // 直接执行sql语句方式
    preparedQueryUser(db,"wang");
    qDebug() << "---- query operation end----- " << "\n ";

    qDebug() << "---- query all data start----- ";
    queryAllUser(db); // 查询所有数据
    qDebug() << "---- query all data end----- " << "\n ";


    // [4]删操作
    qDebug() << "---- delete operation start----";
    deleteUser(db,"alex");
    query.exec(" DELETE FROM newUser WHERE username='wang' ");

    queryAllUser(db);
    qDebug() << "---- query operation end----" << "\n ";


    // [5]改操作,根据id修改数据
    qDebug() << "---- update operation start----";
    qDebug() << "---- before update id 1: ----";
    queryAllUser(db);

    updateUser(db,1,"yase");// ID为1,数据修改为 yase
    query.exec(" update newUser set username='newname' WHERE id=4");

    qDebug() << "---- after update id 1: ----";
    queryAllUser(db);
    qDebug() << "---- update operation end----" << "\n ";


    // 仅仅是测试需要,删除数据表中的所有数据,为了不影响下次运行程序观察结果
    query.exec(" DELETE FROM newUser");

}


/*
 * 功能描述:更新数据
 * 修改传入的 id 的 username
 * @param QSqlDatabase:数据库连接
 * @param id:用户id
 * @param username:用户名
 */
void Widget::updateUser(QSqlDatabase db,const int &id,const QString &username) {
    QSqlQuery query(db);
    query.prepare("update newUser set username=:username WHERE id=:id");
    query.bindValue(":id", id);
    query.bindValue(":username", username);
    query.exec();
}


/*
 * 功能描述:数据查操作,查询所有数据
 * 执行SQL语句的方式,查询所有的用户数据记录
 * @param QSqlDatabase:数据库连接
 */
void Widget::queryAllUser(QSqlDatabase db) {
    QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
    QSqlQuery query(db);                               // [1] 传入数据库连接
    query.exec(sql);                                   // [2] 执行sql语句
    while (query.next()) {                             // [3] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());
    }
}

/*
 * 功能描述:查询一条数据记录
 * 数据查操作,SQL语句的方式实现
 * @param QSqlDatabase:数据库连接
 * @param username:用户名
 */
void Widget::selectQueryUser(QSqlDatabase db,const QString &username) {
    QString sql = "SELECT * FROM newUser WHERE username='" + username + "'";
    QSqlQuery query(db);    // [1] 传入数据库连接
    query.exec(sql);        // [2] 执行sql语句
    while (query.next()) {  // [3] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());

    }
}

/*
 * 功能描述:查询一条数据记录
 * 数据查操作,名称绑定的方式实现
 * @param QSqlDatabase:数据库连接
 * @param username:用户名
 */
void Widget::preparedQueryUser(QSqlDatabase db,const QString &username) {
    QString sql = "SELECT * FROM newUser WHERE username=:username";
    QSqlQuery query(db);                    // [1] 传入数据库连接
    query.prepare(sql);                     // [2] 使用名称绑定的方式解析 SQL 语句
    query.bindValue(":username", username); // [3] 把占位符替换为传入的参数
    query.exec();                           // [4] 执行数据库操作
    while (query.next()) {                  // [5] 遍历查询结果
        qDebug() << QString("Id: %1, Username: %2")
                    .arg(query.value("id").toInt())
                    .arg(query.value("username").toString());

    }
}



/*
 * 功能描述:数据删操作
 * 从数据库中删除一条数据,名称绑定的方式实现
 * @param QSqlDatabase:数据库连接
 * @param username:用户名
 */
void Widget::deleteUser(QSqlDatabase db,const QString &username) {
    QSqlQuery query(db);
    query.prepare("DELETE FROM newUser WHERE username=:username");
    query.bindValue(":username", username);
    query.exec();
}


/*
 * 功能描述:数据增操作
 * 向数据库中插入一条数据记录,名称绑定的方式实现
 * @param QSqlDatabase:数据库连接
 * @param id:用户id
 * @param username:用户名
 */
void Widget::insertUserName(QSqlDatabase db,const int &userid, const QString &name) {
    QSqlQuery query(db);
    query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
    query.bindValue(":id", userid);
    query.bindValue(":username", name);
    query.exec();
}


/*
 * 功能描述:创建数据库连接
 * 使用自定义 connectionName 创建连接
 * @param connectionName:连接的名称
 */
void Widget::createConnectionByName(const QString &connectionName){

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", connectionName);
    // 数据库连接需要设置的信息
    db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
    db.setDatabaseName("ceshi");// 数据库名
    db.setUserName("root");// 用户名
    db.setPassword("123456");// 密码
    db.setPort(3306);// 端口号

    // 连接数据库判断
    bool ok = db.open();

    if (ok){
        qDebug() << "database connect is ok";
    } else {
        qDebug() << "database connect is fail";
    }

}

/*
 * 功能描述:获取数据库连接
 * 使用自定义 connectionName 获取连接
 * @param connectionName:连接的名称
 * @return 返回一个数据库连接
 */
QSqlDatabase Widget::getConnectionByName(const QString &connectionName) {
    // 获取数据库连接
    return QSqlDatabase::database(connectionName);
}



Widget::~Widget()
{
    delete ui;
}
  • 24
    点赞
  • 227
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值