本篇总结一下一下Ubuntu下QT操作Mysql数据库。
目录
1. 启动Mysql数据库服务器
2.查看QT支持的数据库驱动
3.连接数据库
4. 增加表和记录
5. 删除记录
6. 修改记录
7. 查询记录
8.完整代码和运行效果
常见错误总结:
(1) 数据库服务没启动报错信息
(2) 有QMYSQL驱动,连接数据缺失败
// 启动
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
MainWindow
0
0
693
412
MainWindow
-
查看数据库驱动
-
连接mysql数据库
-
创建表
-
插入记录
-
删除记录
-
修改记录
-
查询记录
-
删除表中所有数据
0
0
693
39
TopToolBarArea
false
原因:Qt对Mysql进行了封装,库名为libqsqlmysql.so,但是其还需要调用Mysql的客户端库才能真正连接数据库,如下可以看到libqsqlmysql.so需要依赖libmysqlclient.so.18。