Linux系统下安装MySQL及QT数据库编程

系统为Ubuntu16.04LTS,MySQL版本为5.7,QT版本为5.12.9

安装MySQL

sudo apt-get install mysql-server          //服务端
sudo apt-get install mysql-client          //客户端
sudo apt-get install libmysqlclient-dev    //程序编译时链接的库

安装过程中会弹出窗口,设置MySQL root密码,由于MySQL只有一个root用户,因此每次使用MySQL都需要输入这个root密码。
完成后dpkg -l | grep mysql查看安装状态
在这里插入图片描述
如果是这样的就是安装成功了

MySQL的一些基本操作

启动MySQL

service mysql start需要输入数据库root密码,MySQL只有一个用户root
启动后使用如下命令查看:sudo netstat -anp | grep mysql
在这里插入图片描述

使用命令行登录数据库

语法格式为
mysql -u用户名 -p密码 < 要导入的数据库数据(runoob.sql)
mysql -u root -p
需要输入root密码,启动成功后如下
Linux系统下安装MySQL及QT数据库编程_第1张图片

查看SQL对应端口

show global variables like ‘port‘;
Linux系统下安装MySQL及QT数据库编程_第2张图片

查看数据库

show databases;
Linux系统下安装MySQL及QT数据库编程_第3张图片

创建一个新的库

CREATE DATABASE test_db;
创建一个名为test_db的库
在这里插入图片描述
MySQL 不允许在同一系统下创建两个相同名称的数据库。
可以加上IF NOT EXISTS从句,就可以避免类似错误,如下所示:
mysql> CREATE DATABASE IF NOT EXISTS test_db;

设置数据库编码格式

选中数据库mysql> test_db
设置编码格式为UTF-8mysql> set names utf8;
在这里插入图片描述

导入原有的数据库

方法一:
mysql>source /home/abc/abc.sql;
方法二:
mysql -u用户名 -p密码 数据库名 < 数据库名.sql
#mysql -uabc_f -p abc < abc.sql

往数据库中插入表格

语法格式:
CREATE TABLE table_name (column_name column_type);

CREATE TABLE temperatureHumidityRecord(
    createtime DATE,
    temprature DOUBLE,
    humidity DOUBLE
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

查看当前数据库所有表格

show tables;
Linux系统下安装MySQL及QT数据库编程_第4张图片

往表格中插入数据

以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法:
INSERT INTO table_name ( field1, field2,…fieldN )
VALUES
( value1, value2,…valueN );
如果数据是字符型,必须使用单引号或者双引号,如:“value”。
例如:

 INSERT INTO temperatureHumidityRecord  
 (createtime,temprature,humidity) 
 VALUES 
 (NOW(),34.32,12.45);

在这里插入图片描述

读取表格内数据

例如:
select * from runoob_tbl;
Linux系统下安装MySQL及QT数据库编程_第5张图片

修改某字段数据类型

语法格式:
“ALTER TABLE <表名> MODIFY <字段名> <新数据类型>”。
在这里插入图片描述

删除数据

语法格式:
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
语法说明如下:
<表名>:指定要删除数据的表名。
ORDER BY 子句:可选项。表示删除时,表中各行将按照子句中指定的顺序进行删除。
WHERE 子句:可选项。表示为删除操作限定删除条件,若省略该子句,则代表删除该表中的所有行。
LIMIT 子句:可选项。用于告知服务器在控制命令被返回到客户端前被删除行的最大值
删除所有:
在这里插入图片描述

退出MySQL

使用quit
在这里插入图片描述

停止SQL服务

service mysql stop

查看MySQL工作状态

service mysqld status
MySQL未工作
在这里插入图片描述
运行中
Linux系统下安装MySQL及QT数据库编程_第6张图片

安装时未设置root无法登录SQL参考这篇博客
Linux下安装mysql及qt连接

MySQL数据类型

数值类型
Linux系统下安装MySQL及QT数据库编程_第7张图片
日期和时间类型
Linux系统下安装MySQL及QT数据库编程_第8张图片
字符串类型
Linux系统下安装MySQL及QT数据库编程_第9张图片

QT中使用MySQL

Qt 支持很多种常见的数据库,如 MySQL、Oracle、MS SQL Server、SQLite 等。Qt SQL 模块里包含了很多个类,可以轻松实现数据库的连接、执行 SQL 语句,获取数据库里的数据与界面显示等功能,一般数据与界面之间会采用 Model/View架构,从而很方便的显示数据界面和操作数据库。
在 QSqlDatabase 连接数据库后,用 QSqlTableModel 从数据库里读取出表格模型,然后通过 Qt 的 QTableView 类显示数据库的内容在我们面前。需要对数据库的数据进行修改可以使用 QSqlQuery,或者直接修改QSqlTableModel 对象,修改里面的模型数据即可,流程如下:
Linux系统下安装MySQL及QT数据库编程_第10张图片

连接测试程序

源代码如下,main.cpp

#include "mainwindow.h"

#include 

void loadMySqlDriver();

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

mainwindows.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    /*
    *链接mysql数据库
    */
    QSqlDatabase db(QSqlDatabase::addDatabase("QMYSQL"));
    db.setHostName("127.0.0.1");
    db.setDatabaseName("test");
    db.setUserName("root");
    db.setPassword("zjz123");
    db.setPort(3306);
    if(!db.open()){
        qDebug()<<db.lastError();
    }
    else
    {
        qDebug()<<"connect success";
    }
}


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

这个时候是无法连接的,会出现如下报错
在这里插入图片描述
Qt虽然支持直接连接MySQL,但是并没有将插件直接编译好,QT库对于MySQL的支持库的编译需要依赖MySQL安装时所生成的底层库,是因为MySQL版本不一样,安装时所产生的底层库也会有所区别,编译出来的插件也不一样,需要用户安装MySQL后手动编译。

编译依赖库

进入QT源码目录,找到mysql支持库源码
在这里插入图片描述
1、依赖包安装:

sudo apt-get install openssl
sudo apt-get install libssl-dev

2、修改.pro文件,路径为
/opt/Qt5.12.9/5.12.9/Src/qtbase/src/plugins/sqldrivers/mysql
在QT安装目录下的Src/qtbase/src/plugins/sqldrivers/mysql
打开pro文件,将QMAKE_USE注释掉

TARGET = qsqlmysql

HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp

#QMAKE_USE += mysql

OTHER_FILES += mysql.json

PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)

3、返回上一层目录,找到qsqldriverbase.pri文件,打开
将·nclude($$shadowed($$PWD)/qtsqldrivers-config.pri)
注释掉并添加include($$shadowed($$PWD)/configure.pri)

include($$shadowed($$PWD)/configure.pri)
QT  = core core-private sql-private

# For QMAKE_USE in the parent projects.
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include($$shadowed($$PWD)/configure.pri)

PLUGIN_TYPE = sqldrivers
load(qt_plugin)

DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII

4、进行qmkae生成makefile
sudo /opt/Qt5.12.9/5.12.9/gcc_64/bin/qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib/x86_64-linux-gnu/ -lmysqlclient" mysql.pro
在这里插入图片描述
5、编译依赖库
/opt/Qt5.12.9/5.12.9/Src/qtbase/src/plugins/sqldrivers/mysql$ sudo make
6、拷贝依赖库
编译完成后将生成的库重新拷贝覆盖原有的库:
/opt/Qt5.12.9/5.12.9/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers$ sudo cp * /opt/Qt5.12.9/5.12.9/gcc_64/plugins/sqldrivers/ -rf

这样就可以连接上MySQL了

支持库加载上了以后,如果出现了这个错误,是因为要连接的数据库不存在,需要先创建对应的数据库
在这里插入图片描述
如果连接成功,则会输出调试信息”connect success”
与MySQL的连接测试完成

数据添加、删除、修改功能实现

UI界面

Linux系统下安装MySQL及QT数据库编程_第11张图片

完善代码,实现数据操作功能:添加、删除、修改

mainwindows.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_pushButton_add_clicked();

    void on_pushButton_actSubmit_clicked();

    void on_pushButton_actRevert_clicked();

    void on_pushButton_delete_clicked();

private:
    Ui::MainWindow *ui;
    QSqlDatabase db;//数据库连接
    QSqlTableModel *tabModel;//数据模型
    QItemSelectionModel *theSelection; //选择模型
    QDataWidgetMapper *dataMapper;//数据映射

private:
    void openDataBase();
    void openTable();
};
#endif // MAINWINDOW_H

mainwindows.cpp:
需要注意的是,程序中将数据的提交策略使用setSubmitPolicy()设置为ManualSubmit(手动提交),数据的修改会暂时缓存,等待用户调用submitAll()保存所有修改,或是调用revertAll()取消所有未保存修改

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 

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

    openDataBase();
}

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

void MainWindow::openDataBase()
{
    /*链接mysql数据库*/
    //QSqlDatabase db(QSqlDatabase::addDatabase("QMYSQL"));
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");
    db.setDatabaseName("test_db");
    db.setUserName("root");
    db.setPassword("123456");
    db.setPort(3306);
    if(!db.open()){
        qDebug()<<QString("connect database error")<<db.lastError();
    }
    else
    {
        qDebug()<<"connect success";
    }
    openTable();
}

void MainWindow::openTable()
{
    /*打开数据表*/
    tabModel = new QSqlTableModel(this,db);
    tabModel->setTable("temperatureHumidityRecord");
    tabModel->setSort(tabModel->fieldIndex("createtime"),Qt::AscendingOrder);
    tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);//所有修改暂时缓存,不立刻更新到数据库内
    if(!(tabModel->select())){
        qDebug()<<"open table error"<<tabModel->lastError();
        return;
    }else{
        qDebug()<<"open table success";
    }
    /*设置字段显示*/
    tabModel->setHeaderData(tabModel->fieldIndex("createtime"),Qt::Horizontal,"时间");
    tabModel->setHeaderData(tabModel->fieldIndex("temprature"),Qt::Horizontal,"温度");
    tabModel->setHeaderData(tabModel->fieldIndex("humidity"),Qt::Horizontal,"湿度");
    /*选择模型*/
    theSelection = new QItemSelectionModel(tabModel);
    /*tableView控件设置*/
    ui->tableView->setModel(tabModel);//设置数据模型
    ui->tableView->setSelectionModel(theSelection);//设置选择模型
    /*创建界面组件与数据模型字段之间的数据映射*/
    dataMapper = new QDataWidgetMapper();
    dataMapper->setModel(tabModel);
    dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
}
/*
 * 添加
*/
void MainWindow::on_pushButton_add_clicked()
{
    tabModel->insertRows(tabModel->rowCount(),1);
    QModelIndex curIndex = tabModel->index(tabModel->rowCount()-1,1);
    theSelection->clear();
    theSelection->setCurrentIndex(curIndex,QItemSelectionModel::Select);
    int curRow = curIndex.row();
    if(ui->textEdit_humidity->toPlainText().isNull() ||
            ui->textEdit_temprature->toPlainText().isNull()){
        QMessageBox::information(this,"","添加失败");
        return;
    }
    //当前时间
    tabModel->setData(tabModel->index(curRow,tabModel->fieldIndex("createtime")),
                      QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
    tabModel->setData(tabModel->index(curRow,tabModel->fieldIndex("temprature")),
                      ui->textEdit_temprature->toPlainText().toDouble());
    tabModel->setData(tabModel->index(curRow,tabModel->fieldIndex("humidity")),
                      ui->textEdit_humidity->toPlainText().toDouble());
}
/*
 * 确认修改
*/
void MainWindow::on_pushButton_actSubmit_clicked()
{
    bool res = tabModel->submitAll();
    if(!res){
        QMessageBox::information(this,"","修改失败");
    }
}
/*
 * 取消修改
*/
void MainWindow::on_pushButton_actRevert_clicked()
{
    tabModel->revertAll();
}

/*
 * 删除
*/
void MainWindow::on_pushButton_delete_clicked()
{
    QModelIndex curIndex = theSelection->currentIndex();
    tabModel->removeRows(curIndex.row(),1);
}

你可能感兴趣的:(嵌入式\linux\QT,linux,qt,mysql)