本篇总结一下一下Ubuntu下QT操作Mysql数据库。
目录
// 启动
sudo /etc/init.d/mysql start
// 重启
sudo /etc/init.d/mysql restart
// 关闭
sudo /etc/init.d/mysql stop


Qt SQL模块是Qt提供的一个访问数据库的接口,支持多种平台下使用不同类型的数据库,在这个过程中,数据库驱动起到了很大的作用,它负责与不同的数据库进行通信,有了数据库驱动,我们才能使用不同类型的数据库。
#include// 查看支持的数据库驱动 qDebug() << QSqlDatabase::drivers();
- 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() << "连接失败";
- }
- // 实例化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, '李四')");
- QSqlQuery query(m_db);
- query.prepare("DELETE FROM newUser WHERE username=:username");
- query.bindValue(":username", "张三");
- query.exec();
- QSqlQuery query(m_db);
- query.prepare("update newUser set username=:username WHERE id=:id");
- query.bindValue(":id", 1);
- query.bindValue(":username", "World");
- query.exec();
- // 查询所有
- 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());
-
- }
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
- "1.0" encoding="UTF-8"?>
- <ui version="4.0">
- <class>MainWindowclass>
- <widget class="QMainWindow" name="MainWindow">
- <property name="geometry">
- <rect>
- <x>0x>
- <y>0y>
- <width>693width>
- <height>412height>
- rect>
- property>
- <property name="windowTitle">
- <string>MainWindowstring>
- 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>0x>
- <y>0y>
- <width>693width>
- <height>39height>
- rect>
- property>
- widget>
- <widget class="QToolBar" name="mainToolBar">
- <attribute name="toolBarArea">
- <enum>TopToolBarAreaenum>
- attribute>
- <attribute name="toolBarBreak">
- <bool>falsebool>
- attribute>
- widget>
- <widget class="QStatusBar" name="statusBar"/>
- widget>
- <layoutdefault spacing="6" margin="11"/>
- <resources/>
- <connections/>
- ui>





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

