一、环境及其版本
windows 10
mysql版本:8.4
qt版本:6.5.3
二、数据库连接
最开始遇到了没有MySQL驱动的问题,网上找了好久,终于找到了这篇qt6.5编译mysql驱动
终于是解决了连接问题
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QPSQL
那现在我们开始连接,先创建了一个控制台项目用来测试
新建一个Mysql_manager类
定义了一个结构体来保存配置信息
// 连接数据库的一些必要信息
struct ConnectionInfo
{
const QString database; // 数据库驱动名
const QString host; // 主机地址
const QString user; // 用户名
const QString password; // 密码
const QString database_name; // 数据库名
// 构造函数
ConnectionInfo(const QString db, const QString h, const QString u, const QString p, const QString dn)
: database(db), host(h), user(u), password(p), database_name(dn) {}
};
定义一个初始化函数
public:
// 连接数据库
bool Init(ConnectionInfo& info);
// 释放连接
void Free_Connect();
private:
QSqlDatabase qdb;
cpp实现:
bool Mysql_manager::Init(ConnectionInfo &info)
{
qdb=QSqlDatabase::addDatabase(info.database);
qdb.setHostName(info.host);
qdb.setDatabaseName(info.database_name);
qdb.setUserName(info.user);
qdb.setPassword(info.password);
return qdb.open();
}
void Mysql_manager::Free_Connect()
{
qdb.close();
}
测试连接:
//配置数据库
Mysql_manager db_manager;
ConnectionInfo connection_config("QMYSQL","localhost","root","root123456","qt_test_database");
if(!db_manager.Init(connection_config))
qDebug()<<"数据库打开失败";
db_manager.Free_Connect();//最后释放连接
三、增删改查
函数定义
// // 增加数据
bool Insert_Student(const QString &name, const QString &sex, int age);
// // 删除数据
bool Delete_Student(int studentId);
// // 更新数据
bool Update_Student(int studentId, const QString &newName, int newAge);
// 查询数据
QList<QVariantMap> Select_Students(const QString &whereClause = "");
函数实现
bool Mysql_manager::Insert_Student(const QString &name, const QString &sex, int age) {
// QString sql = QString("INSERT INTO students (name, sex, age) VALUES ('%1', '%2', %3)")
// .arg(name).arg(sex).arg(age);
// return Execute_Sql(sql);
QSqlQuery query;
query.prepare("INSERT INTO students (name, sex, age) VALUES (:name, :sex, :age)");
query.bindValue(":name", name);
query.bindValue(":sex", sex);
query.bindValue(":age", age);
return query.exec();
}
bool Mysql_manager::Delete_Student(int studentId) {
// QString sql = QString("DELETE FROM students WHERE id = %1").arg(studentId);
// return Execute_Sql(sql);
QSqlQuery query;
query.prepare("DELETE FROM students WHERE id = :id");
query.bindValue(":id", studentId);
return query.exec();
}
bool Mysql_manager::Update_Student(int studentId, const QString &newName, int newAge) {
// QString sql = QString("UPDATE students SET name = '%1', age = %2 WHERE id = %3")
// .arg(newName).arg(newAge).arg(studentId);
// return Execute_Sql(sql);
QSqlQuery query;
query.prepare("UPDATE students SET name = :name, age = :age WHERE id = :id");
query.bindValue(":name", newName);
query.bindValue(":age", newAge);
query.bindValue(":id", studentId);
return query.exec();
}
QList<QVariantMap> Mysql_manager::Select_Students(const QString &whereClause) {
QList<QVariantMap> results;
QString sql = QString("SELECT * FROM students %1").arg(whereClause.isEmpty() ? "" : "WHERE " + whereClause);
QSqlQuery query(sql);
if (!query.exec()) {
// 查询失败,抛出异常
throw std::runtime_error(query.lastError().text().toStdString());
}
while (query.next()) {
QVariantMap row;
row["id"] = query.value("id").toInt();
row["name"] = query.value("name").toString();
row["sex"] = query.value("sex").toString();
row["age"] = query.value("age").toInt();
results.append(row);
}
return results;
}
测试案例
//增加一条记录
if(!db_manager.Insert_Student("钱一","F",34)){
qDebug()<<"数据插入失败";
}
//删除一条记录
if(!db_manager.Delete_Student(6)){
qDebug()<<"数据更改失败";
}
//更改一条记录
if(!db_manager.Update_Student(6,"钱七",24)){
qDebug()<<"数据更改失败";
}
//数据库查询
try {
// QList<QVariantMap> students = db_manager.Select_Students("id=1");
QList<QVariantMap> students = db_manager.Select_Students();
foreach (const QVariantMap &student, students) {
qDebug() << "ID:" << student["id"].toInt()
<< "Name:" << student["name"].toString()
<< "Sex:" << student["sex"].toString()
<< "Age:" << student["age"].toInt();
}
// 处理查询结果
} catch (const std::runtime_error& e) {
// 处理查询失败的情况
qDebug() << "查询失败:" << e.what();
}
四、头文件,cpp文件
main.cpp
#include <QCoreApplication>
#include <QDebug>
#include <QtSql/QSqlQuery>
#include <mysql_manager.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//配置数据库
Mysql_manager db_manager;
ConnectionInfo connection_config("QMYSQL","localhost","root","root123456","qt_test_database");
if(!db_manager.Init(connection_config))
qDebug()<<"数据库打开失败";
//数据库查询
try {
// QList<QVariantMap> students = db_manager.Select_Students("id=1");
QList<QVariantMap> students = db_manager.Select_Students();
foreach (const QVariantMap &student, students) {
qDebug() << "ID:" << student["id"].toInt()
<< "Name:" << student["name"].toString()
<< "Sex:" << student["sex"].toString()
<< "Age:" << student["age"].toInt();
}
// 处理查询结果
} catch (const std::runtime_error& e) {
// 处理查询失败的情况
qDebug() << "查询失败:" << e.what();
}
//增加一条记录
if(!db_manager.Insert_Student("钱一","F",34)){
qDebug()<<"数据插入失败";
}
//更改一条记录
if(!db_manager.Update_Student(6,"钱七",24)){
qDebug()<<"数据更改失败";
}
//删除一条记录
if(!db_manager.Delete_Student(6)){
qDebug()<<"数据更改失败";
}
//数据库查询
try {
// QList<QVariantMap> students = db_manager.Select_Students("id=1");
QList<QVariantMap> students = db_manager.Select_Students();
foreach (const QVariantMap &student, students) {
qDebug() << "ID:" << student["id"].toInt()
<< "Name:" << student["name"].toString()
<< "Sex:" << student["sex"].toString()
<< "Age:" << student["age"].toInt();
}
// 处理查询结果
} catch (const std::runtime_error& e) {
// 处理查询失败的情况
qDebug();
qDebug() << "查询失败:" << e.what();
}
db_manager.Free_Connect();
return a.exec();
}
mysql_manager.h
#ifndef MYSQL_MANAGER_H
#define MYSQL_MANAGER_H
#include <QSqlDatabase>
#include <QSqlError>
/*
*函数描述:无
*参数: 无
*返回值: 无
*注意: 无
*/
// 连接数据库的一些必要信息
struct ConnectionInfo
{
const QString database; // 数据库驱动名
const QString host; // 主机地址
const QString user; // 用户名
const QString password; // 密码
const QString database_name; // 数据库名
// 构造函数
ConnectionInfo(const QString db, const QString h, const QString u, const QString p, const QString dn)
: database(db), host(h), user(u), password(p), database_name(dn) {}
};
class Mysql_manager
{
public:
// 连接数据库
bool Init(ConnectionInfo& info);
// 释放连接
void Free_Connect();
// // 增加数据
bool Insert_Student(const QString &name, const QString &sex, int age);
// // 删除数据
bool Delete_Student(int studentId);
// // 更新数据
bool Update_Student(int studentId, const QString &newName, int newAge);
// 查询数据
QList<QVariantMap> Select_Students(const QString &whereClause = "");
private:
QSqlDatabase qdb;
};//class Mysql_manager end
#endif // MYSQL_MANAGER_H
mysql_manager.cpp
#include "mysql_manager.h"
#include <QSqlQuery>
/**
*函数描述: 连接初始化
*参数: ConnectionInfo 结构体,存有连接数据库相关信息
*返回值: true 连接成功,false 连接失败(可能数据库配置错误);
*注意: 无
*/
bool Mysql_manager::Init(ConnectionInfo &info)
{
qdb=QSqlDatabase::addDatabase(info.database);
qdb.setHostName(info.host);
qdb.setDatabaseName(info.database_name);
qdb.setUserName(info.user);
qdb.setPassword(info.password);
return qdb.open();
}
/**
*函数描述: 释放连接
*参数: 无
*返回值: 无
*注意: 无
*/
void Mysql_manager::Free_Connect()
{
qdb.close();
}
/**
*函数描述: 插入记录
*参数: const QString &name, const QString &sex, int age
*返回值: true 连接成功,false 连接失败;
*注意: 无
*/
bool Mysql_manager::Insert_Student(const QString &name, const QString &sex, int age) {
// QString sql = QString("INSERT INTO students (name, sex, age) VALUES ('%1', '%2', %3)")
// .arg(name).arg(sex).arg(age);
// return Execute_Sql(sql);
QSqlQuery query;
query.prepare("INSERT INTO students (name, sex, age) VALUES (:name, :sex, :age)");
query.bindValue(":name", name);
query.bindValue(":sex", sex);
query.bindValue(":age", age);
return query.exec();
}
/**
*函数描述: 删除记录
*参数: int id
*返回值: true 连接成功,false 连接失败;
*注意: 无
*/
bool Mysql_manager::Delete_Student(int studentId) {
// QString sql = QString("DELETE FROM students WHERE id = %1").arg(studentId);
// return Execute_Sql(sql);
QSqlQuery query;
query.prepare("DELETE FROM students WHERE id = :id");
query.bindValue(":id", studentId);
return query.exec();
}
/**
*函数描述: 更新记录
*参数: int studentId, const QString &newName, int newAge
*返回值: true 连接成功,false 连接失败;
*注意: 无
*/
bool Mysql_manager::Update_Student(int studentId, const QString &newName, int newAge) {
// QString sql = QString("UPDATE students SET name = '%1', age = %2 WHERE id = %3")
// .arg(newName).arg(newAge).arg(studentId);
// return Execute_Sql(sql);
QSqlQuery query;
query.prepare("UPDATE students SET name = :name, age = :age WHERE id = :id");
query.bindValue(":name", newName);
query.bindValue(":age", newAge);
query.bindValue(":id", studentId);
return query.exec();
}
/**
* 函数描述: 查询所有学生记录,
* 参数: 无
* 返回值: QList<QVariantMap>,包含查询到的学生记录。如果查询失败,则返回一个空的列表
* 注意: 无
*/
QList<QVariantMap> Mysql_manager::Select_Students(const QString &whereClause) {
QList<QVariantMap> results;
QString sql = QString("SELECT * FROM students %1").arg(whereClause.isEmpty() ? "" : "WHERE " + whereClause);
QSqlQuery query(sql);
if (!query.exec()) {
// 查询失败,抛出异常
throw std::runtime_error(query.lastError().text().toStdString());
}
while (query.next()) {
QVariantMap row;
row["id"] = query.value("id").toInt();
row["name"] = query.value("name").toString();
row["sex"] = query.value("sex").toString();
row["age"] = query.value("age").toInt();
results.append(row);
}
return results;
}