本篇总结一下一下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。文章来源:https://www.toymoban.com/news/detail-709222.html
文章来源地址https://www.toymoban.com/news/detail-709222.html
到了这里,关于Ubuntu下QT操作Mysql数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!