Ubuntu下QT操作Mysql数据库

news2025/1/11 8:00:30

本篇总结一下一下Ubuntu下QT操作Mysql数据库。

目录

1. 启动Mysql数据库服务器

2.查看QT支持的数据库驱动

3.连接数据库

4. 增加表和记录

5. 删除记录

6. 修改记录

7. 查询记录

8.完整代码和运行效果

常见错误总结:

(1) 数据库服务没启动报错信息

(2) 有QMYSQL驱动,连接数据缺失败


1. 启动Mysql数据库服务器

// 启动

sudo /etc/init.d/mysql start

// 重启

sudo /etc/init.d/mysql restart

// 关闭

sudo /etc/init.d/mysql stop

2.查看QT支持的数据库驱动

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

#include <QtSql/QSqlDatabase>

// 查看支持的数据库驱动
qDebug() << QSqlDatabase::drivers();

3.连接数据库

QSqlDatabase db;
if(QSqlDatabase::contains("qt_sql_default_connection")) {
	db = QSqlDatabase::database("qt_sql_default_connection");
}
else {
	// 创建一个数据库连接,指定数据库驱动
	db = QSqlDatabase::addDatabase("QMYSQL");
}

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

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

if (ok) {
	qDebug() << "连接成功";
}
else {
	qDebug() << "连接失败";
}

4. 增加表和记录

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

int userid = 2;
QString &&name = "张三";
query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
query.bindValue(":id", userid);
query.bindValue(":username", name);
query.exec();

query.exec("INSERT INTO newUser (id, username) VALUES (3, 'Andy')");
query.exec("INSERT INTO newUser (id, username) VALUES (4, '李四')");

5. 删除记录

QSqlQuery query(m_db);
query.prepare("DELETE FROM newUser WHERE username=:username");
query.bindValue(":username", "张三");
query.exec();

6. 修改记录

QSqlQuery query(m_db);
query.prepare("update newUser set username=:username WHERE id=:id");
query.bindValue(":id", 1);
query.bindValue(":username", "World");
query.exec();

7. 查询记录

  // 查询所有
  QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
    QSqlQuery query(m_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());
    }

    // 查询指定记录
    QString username = "李四";
    sql = "SELECT * FROM newUser WHERE username='" + username + "'";
    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());

    }

    // 绑定数据查询
    username = "张三";
    sql = "SELECT * FROM newUser WHERE username=:username";
    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());

    }

8.完整代码和运行效果

qt_mysql.pro

#-------------------------------------------------
#
# Project created by QtCreator 2023-09-05T23:12:20
#
#-------------------------------------------------

QT       += core gui
QT += sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = qt_mysql
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

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

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

    void on_pushButton_7_clicked();

    void on_pushButton_clear_table_clicked();

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

private:
    Ui::MainWindow *ui;
    QSqlDatabase m_db;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlQuery>

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

*/

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

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

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

void MainWindow::on_pushButton_clicked()
{
    // 查看支持的数据库驱动
    qDebug() << QSqlDatabase::drivers();
}

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

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

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

    if (ok){
        qDebug() << "连接成功";
    } else {
        qDebug() << "连接失败";
    }

}

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

void MainWindow::on_pushButton_2_clicked()
{
    QSqlDatabase db;
    if(QSqlDatabase::contains("qt_sql_default_connection")) {
        db = QSqlDatabase::database("qt_sql_default_connection");
    }
    else {
        // 创建一个数据库连接,指定数据库驱动
        db = QSqlDatabase::addDatabase("QMYSQL");
    }

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

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

    if (ok) {
        qDebug() << "连接成功";
    }
    else {
        qDebug() << "连接失败";
    }
}

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

void MainWindow::on_pushButton_4_clicked()
{
    QSqlQuery query(m_db);
    query.exec("INSERT INTO newUser (id, username) VALUES (1, 'Hello')");

    int userid = 2;
    QString &&name = "张三";
    query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
    query.bindValue(":id", userid);
    query.bindValue(":username", name);
    query.exec();

    query.exec("INSERT INTO newUser (id, username) VALUES (3, 'Andy')");
    query.exec("INSERT INTO newUser (id, username) VALUES (4, '李四')");
}

void MainWindow::on_pushButton_5_clicked()
{
    QSqlQuery query(m_db);
    query.prepare("DELETE FROM newUser WHERE username=:username");
    query.bindValue(":username", "张三");
    query.exec();
}

void MainWindow::on_pushButton_6_clicked()
{
    QSqlQuery query(m_db);
    query.prepare("update newUser set username=:username WHERE id=:id");
    query.bindValue(":id", 1);
    query.bindValue(":username", "World");
    query.exec();
}

void MainWindow::on_pushButton_7_clicked()
{
    // 查询所有
    QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
    QSqlQuery query(m_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());
    }

    // 查询指定记录
    QString username = "李四";
    sql = "SELECT * FROM newUser WHERE username='" + username + "'";
    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());

    }

    // 绑定数据查询
    username = "张三";
    sql = "SELECT * FROM newUser WHERE username=:username";
    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());

    }
}

void MainWindow::on_pushButton_clear_table_clicked()
{
    QSqlQuery query(m_db);
    query.exec("DELETE FROM newUser");
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>693</width>
    <height>412</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QPushButton" name="pushButton">
      <property name="text">
       <string>查看数据库驱动</string>
      </property>
     </widget>
    </item>
    <item row="0" column="1">
     <widget class="QPushButton" name="pushButton_2">
      <property name="text">
       <string>连接mysql数据库</string>
      </property>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QPushButton" name="pushButton_3">
      <property name="text">
       <string>创建表</string>
      </property>
     </widget>
    </item>
    <item row="1" column="1">
     <widget class="QPushButton" name="pushButton_4">
      <property name="text">
       <string>插入记录</string>
      </property>
     </widget>
    </item>
    <item row="2" column="0">
     <widget class="QPushButton" name="pushButton_5">
      <property name="text">
       <string>删除记录</string>
      </property>
     </widget>
    </item>
    <item row="2" column="1">
     <widget class="QPushButton" name="pushButton_6">
      <property name="text">
       <string>修改记录</string>
      </property>
     </widget>
    </item>
    <item row="3" column="0">
     <widget class="QPushButton" name="pushButton_7">
      <property name="text">
       <string>查询记录</string>
      </property>
     </widget>
    </item>
    <item row="3" column="1">
     <widget class="QPushButton" name="pushButton_clear_table">
      <property name="text">
       <string>删除表中所有数据</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>693</width>
     <height>39</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

常见错误总结:

(1) 数据库服务没启动报错信息

(2) 有QMYSQL驱动,连接数据缺失败

原因:Qt对Mysql进行了封装,库名为libqsqlmysql.so,但是其还需要调用Mysql的客户端库才能真正连接数据库,如下可以看到libqsqlmysql.so需要依赖libmysqlclient.so.18。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/981690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java实现WebSocket客户端和服务端(简单版)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

自动驾驶(apollo)

&#x1f493;博主csdn个人主页&#xff1a;小小unicorn &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 自动驾驶技术 引言自动驾驶的基本原理自动驾驶的技术挑战自动驾驶的潜在影响结…

[BSidesCF 2019]Futurella 1

外星语&#xff1f; 看到这个&#xff0c;我第一时间就是想复制百度一下看是不是什么新编码 结果… 你会发现你粘贴的时候出现的是英文&#xff0c;里面还带着flag 破案 查看源代码 发现根本就没有什么外星语&#xff0c;可能就是style.css在作祟 完整复制内容 Resistanc…

蓝牙协议栈BLE

前言 这阵子用到蓝牙比较多&#xff0c;想写一个专栏专门讲解蓝牙协议及其应用&#xff0c;本篇是第一篇文章&#xff0c;讲解低功耗蓝牙和蓝牙协议栈。 参考网上各大神文章&#xff0c;及瑞萨的文章&#xff0c;参考GPT&#xff0c;并且加入了一些本人的理解。 图片部分源自…

国内的几款强大的智能—AI语言模型

1、Tomchat &#xff1a;Tomchat https://www.tomchat.uk 支持gp4 支持 midjourny绘画 AI绘画功能&#xff1a;点我 介绍 1、4聊天 2、AI绘画 3、头像制作 1、国内百度研发的&#xff0c;文心一言&#xff1a; https://yiyan.baidu.com/welcome 大家如果像我的界面一样有【…

基于SSM的校园驿站管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Nebula数据库安装

1、什么是nebula NebulaGraph是一款开源的、分布式的、易扩展的原生图数据库&#xff0c;能够承载包含数千亿个点和数万亿条边的超大规模数据集&#xff0c;并且提供毫秒级查询。 2、利用docker-compose安装Nebula数据库 1、前提条件 主机中安装了docker主机中安装了Docke…

opencv旋转图像

0 、使用旋转矩阵旋转 import cv2img cv2.imread(img.jpg, 1) (h, w) img.shape[:2] # 获取图像的宽和高# 定义旋转中心坐标 center (w / 2, h / 2)# 定义旋转角度 angle 90# 定义缩放比例 scale 1# 获得旋转矩阵 M cv2.getRotationMatrix2D(center, angle, scale)# 进行…

STM32使用FAT文件系统-常见概念、代码走读

fat文件系统的所有外部接口都在ff.h中 格式化 挂载 使用文件系统的第一步&#xff0c;就是挂载。 函数原型&#xff1a;FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */ static FATFS fs; FRESULT fres f_mo…

Lenovo联想拯救者笔记本Legion Y7000P IRH8 2023款(82YA)原装出厂Win11系统镜像

自带硬件设备的所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件大小&#xff1a;12.5GB 链接&#xff1a;https://pan.baidu.com/s/1a2lpGlwiJvCF7e0feN2QbA?pwdn4n6 提取码&a…

ELK集群搭建流程(实践可用)

一、概述 ELK 是一个由三个开源软件工具组成的数据处理和可视化平台&#xff0c;包括 Elasticsearch、Logstash 和 Kibana。这些工具都是由 Elastic 公司创建和维护的。 Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;可以将大量数据存储在一个或多个节点上&#xf…

日常开发小点汇总(2)之防止网络不佳,获取不到css,页面logo做法

防止网络不佳&#xff0c;获取不到css&#xff0c;页面logo做法 <div><a href"//www.baidu.com" class"logo">百度</a></div>.logo {display: inline-block;width: 256px;height: 0;background: url(./logobai.png);background-r…

AndroidStudio最下方显示不出来Terminal等插件

File->Settings->Plugins 然后在上面的输入框中输入Terminal&#xff0c;并将最右侧的对勾打上即可。 安装即可

【快应用】二级页面如何携带参数返回一级页面?

【关键词】 快应用、router、onBackPress 【问题背景】 页面栈有A、B两个页面&#xff0c;怎么在B页面中调A页面的方法或传参&#xff1f;场景是&#xff1a;A页面是列表页&#xff0c;B页面是详情页&#xff0c;B页面状态改变后返回A页面状态也要改变。 【解决方法】 在onB…

ABB 3BHB003688R0101接口模块

通信接口&#xff1a;3BHB003688R0101 接口模块通常具有各种通信接口&#xff0c;例如以太网、串口、CAN总线等&#xff0c;以便与其他设备和系统进行数据交换和通信。 数据传输&#xff1a;它通常用于将数据、信号或控制命令从一个设备传输到另一个设备&#xff0c;以实现设备…

电商系统架构设计系列(十一):在电商的交易类系统中,如何正确地使用 Redis 这样的缓存系统呢?需要考虑哪些问题?

上篇文章中&#xff0c;我给你留了一个思考题&#xff1a;在电商的交易类系统中&#xff0c;如何正确地使用 Redis 这样的缓存系统呢&#xff1f;需要考虑哪些问题&#xff1f; 这篇文章&#xff0c;我们来聊聊。 引言 我们知道&#xff0c;大部分面向公众用户的互联网系统&a…

LeetCode 202 快乐数

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 法一&#xff1a;哈希 使用哈希表循环判断每次经过平方和的数&#xff0c;如果为1则直接返回true&#xff0c;若之前存在过但不为1则直接返回false 代码 class Solution { public:// 计算…

如何消除误差?室内定位中的关键技术

1、互相关干扰消除技术 在室内复杂的定位环境中&#xff0c;接收机很有可能接收到定位源直射的强信号和经过反射、折射的弱信号&#xff0c;强信号和弱信号的功率差可以达到20&#xff5e;30dB。此时在弱信号的相关解算中&#xff0c;强信号产生的互相关峰与弱信号产生的自相关…

基于session实现发送短信和验证码登录注册功能

&#xff08;笔记总结自《黑马点评》项目&#xff09; 实现短信验证码登录流程&#xff1a; 一、发送短信 Controller层&#xff1a; PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {// TODO 发…

检测摄像头的fps

需求 项目中经常遇到不是摄像头就是网线的问题&#xff0c;曾经遇到一个项目算法日志一直报 warning&#xff0c;经过好几个小时的远程排查&#xff0c;发现是摄像头的 fps 不稳定&#xff0c;而且出现 fps 逐渐降低的情况&#xff0c;所以算法跑着跑着就挂了。 于是就需要开…