Ubuntu下QT操作Mysql数据库

本篇总结一下一下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

Ubuntu下QT操作Mysql数据库_第1张图片

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

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

#include 

// 查看支持的数据库驱动
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 
#include 
#include 

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 

/*
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 

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

    return a.exec();
}

mainwindow.ui



 MainWindow
 
  
   
    0
    0
    693
    412
   
  
  
   MainWindow
  
  
   
    
     
      
       查看数据库驱动
      
     
    
    
     
      
       连接mysql数据库
      
     
    
    
     
      
       创建表
      
     
    
    
     
      
       插入记录
      
     
    
    
     
      
       删除记录
      
     
    
    
     
      
       修改记录
      
     
    
    
     
      
       查询记录
      
     
    
    
     
      
       删除表中所有数据
      
     
    
   
  
  
   
    
     0
     0
     693
     39
    
   
  
  
   
    TopToolBarArea
   
   
    false
   
  
  
 
 
 
 

Ubuntu下QT操作Mysql数据库_第2张图片

Ubuntu下QT操作Mysql数据库_第3张图片

常见错误总结:

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

Ubuntu下QT操作Mysql数据库_第4张图片

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

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

Ubuntu下QT操作Mysql数据库_第5张图片Ubuntu下QT操作Mysql数据库_第6张图片

你可能感兴趣的:(QT,mysql,qt,mysql)