内容提要
介绍数据库相关内容,了解连接数据库方法,掌握数据库的4种基本操作
主要内容
Qt SQL模块是Qt提供的一个访问数据库的接口,支持多种平台下使用不同类型的数据库,在这个过程中,数据库驱动 起到了很大的作用,它负责与不同的数据库进行通信,有了数据库驱动,我们才能使用不同类型的数据库。
以下是Qt支持的数据库驱动
如何查看当前版本Qt支持的数据库驱动
step1 新建一个项目Qt widgets项目,名称为myDataBaseDrivers,基类为QWidget
step2 在项目的.pro文件中,增加一条语句
QT += sql
step3 在 widget.h 中,添加以下代码
#include
#include
step4 在 widget.cpp 中,添加以下代码
qDebug() << QSqlDatabase::drivers();
此时程序应该是这样的
step5 Ctrl+r 运行程序,观察运行结果
从结果可以看出,没有MYSQL数据库的驱动,那我现在想使用这个数据库是不行的,需要添加这个驱动,详细的添加方法请看下面这个文章。
阿呆打瞌睡:Qt零基础系列10:windows 环境下如何编译MYSQL数据库驱动(补充内容)12 赞同 · 10 评论文章编辑
要想连接数据库,我们可以通过QSqlDatabase类实现。连接的方法也很简单,参考下面的代码
// 创建一个数据库连接,指定数据库驱动
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
设置数据库信息
// 数据库连接需要设置的信息
db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
db.setDatabaseName("ceshi");// 数据库名
db.setUserName("root");// 用户名
db.setPassword("123456");// 密码
db.setPort(3306);// 端口号
连接数据库
// 连接数据库
bool ok = db.open();
if (ok)
{
qDebug() << "database connect is ok";
}
else
{
qDebug() << "database connect is fail";
}
此时程序应该是这样的
Ctrl+r的运行结果是这样的
另外需要注意的是,QSqlDatabase::addDatabase()函数的第一个参数,是指定数据库的类型,如“QPSQL”,“QMYSQL”,第二个参数是 connectionName。如果在多线程里访问数据库,每个线程都需要使用不同的 connectionName,否则可能会出现错误。
为了便于使用,将上面的数据库连接封装成一个函数
widget.h文件修改,增加两个函数声明
private:
void createConnectionByName(const QString &connectionName); //使用自定义 connectionName 创建连接
QSqlDatabase getConnectionByName(const QString &connectionName); // 使用自定义 connectionName 获取连接
widget.cpp文件修改,实现上述两个函数
//使用自定义 connectionName 创建连接
void Widget::createConnectionByName(const QString &connectionName){
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", connectionName);
// 数据库连接需要设置的信息
db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
db.setDatabaseName("ceshi");// 数据库名
db.setUserName("root");// 用户名
db.setPassword("123456");// 密码
db.setPort(3306);// 端口号
// 连接数据库判断
bool ok = db.open();
if (ok){
qDebug() << "database connect is ok";
} else {
qDebug() << "database connect is fail";
}
}
// 使用自定义 connectionName 获取连接
QSqlDatabase Widget::getConnectionByName(const QString &connectionName) {
// 获取数据库连接
return QSqlDatabase::database(connectionName);
}
函数调用
// 创建名为 firstConnect 的数据库连接
createConnectionByName("firstConnect");
修改后代码应该是这样的
Qt里要执行SQL语句和浏览查询结果,通常使用QSqlQuery这个类来实现。
QSqlQuery常用函数整理
数据库SQL的几个常用的基本语法
增 操作就是想数据库中插入输入,在做增操作前,我们需要先建立一个数据库表,用于做增删改查操作测试。核心SQL语句是
insert into 表名 (字段名1,字段名2,...字段名N) value (值1,值2,...值N)
step1 在前面代码的基础上,向 widget.h 文件中,增加一个头文件
#include
step2 在 widget.cpp 中,增加创建数据库表的语句
// 实例化QSqlQuery,用于执行sql语句
QSqlQuery query(db);
// 创建一个表
query.exec("create table newUser (id int primary key,username varchar(20))");
创建的这个表很简单,只有id和uername两项信息
step3 在 widget.h 增加函数声明
private:
void insertUserName(QSqlDatabase db,const int &userid, const QString &name); // 增操作
step4 在 widget.cpp 实现增函数,用名称绑定的方式实现
/*
* 功能描述:数据增操作
* 向数据库中插入一条数据记录,名称绑定的方式实现
* @param QSqlDatabase:数据库连接
* @param id:用户id
* @param username:用户名
*/
void Widget::insertUserName(QSqlDatabase db,const int &userid, const QString &name) {
QSqlQuery query(db);
query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
query.bindValue(":id", userid);
query.bindValue(":username", name);
query.exec();
}
step5 向数据库表中增加数据,实现增操作
// [2]增操作
qDebug() << "---- insert operation start----";
insertUserName(db,1,"xiaoqiao");
insertUserName(db,2,"wang");
query.exec("INSERT INTO newUser (id, username) VALUES (3, 'alex')");
insertUserName(db,4,"lili");
queryAllUser(db); // 查询增操作结果
qDebug() << "---- insert operation end----- " << "\n ";
插入一条数据记录可以使用名称绑定的方式,也是可以直接使用一条SQL语句的方式,当需要插入多条数据时,可以考虑用名称绑定的方式,这样不需要每次都写非常长的数据库指令,相对来说方便一些。
此是代码应该是这样的
step6 ctrl+r 运行程序 使用后面查操作,可以看到增加到数据库的新数据记录
删操作就是从数据库中删除数据记录,核心SQL语句是
delete from 表名 where 删除条件
step1 在 widget.h 增加函数声明
private:
void deleteUser(QSqlDatabase db,const QString &username);// 删操作
step2 在 widget.cpp 实现删函数,用名称绑定的方式实现
/*
* 功能描述:数据删操作
* 从数据库中删除一条数据,名称绑定的方式实现
* @param QSqlDatabase:数据库连接
* @param username:用户名
*/
void Widget::deleteUser(QSqlDatabase db,const QString &username) {
QSqlQuery query(db);
query.prepare("DELETE FROM newUser WHERE username=:username");
query.bindValue(":username", username);
query.exec();
}
step3 调用刚才写的代码,实现删除记录操作
// [4]删操作
qDebug() << "---- delete operation start----";
deleteUser(db,"alex");
query.exec(" DELETE FROM newUser WHERE username='wang' ");
queryAllUser(db);
qDebug() << "---- query operation end----" << "\n ";
两种方式删除记录,名称绑定的方式和直接使用SQL语句的方式
此时代码应该是这样的
step4 ctrl+r 运行程序
使用后面查操作,可以看到删操作后,数据库的记录变化
改操作就是修改数据库记录,核心SQL语句是
update 表名 set 字段名1=新值1,字段名2=新值2 where 条件语句
step1 在 widget.h 增加函数声明
private:
void updateUser(QSqlDatabase db,const int &id,const QString &username); // 更操作,修改数据
step2 在 widget.cpp 实现该操作函数
/*
* 功能描述:更新数据
* 修改传入的 id 的 username
* @param QSqlDatabase:数据库连接
* @param id:用户id
* @param username:用户名
*/
void Widget::updateUser(QSqlDatabase db,const int &id,const QString &username) {
QSqlQuery query(db);
query.prepare("update newUser set username=:username WHERE id=:id");
query.bindValue(":id", id);
query.bindValue(":username", username);
query.exec();
}
step3 调用刚才写的代码,实现查询记录操作
// [5]改操作,根据id修改数据
qDebug() << "---- update operation start----";
qDebug() << "---- before update id 1: ----";
queryAllUser(db);
updateUser(db,1,"yase");// ID为1,数据修改为 yase
query.exec(" update newUser set username='newname' WHERE id=4");
qDebug() << "---- after update id 1: ----";
queryAllUser(db);
qDebug() << "---- update operation end----" << "\n ";
此时代码应该是这样的
step4 ctrl+r 运行程序,查看结果
查操作就是查询数据库记录,核心SQL语句是
select * from 表名
select 字段名1,字段名2 from 表名 where 查询条件
step1 在 widget.h 增加函数声明
private:
void queryAllUser(QSqlDatabase db); // 查操作,查询所有数据记录
void selectQueryUser(QSqlDatabase db,const QString &username); // 查操作,直接执行SQL语句方式
void preparedQueryUser(QSqlDatabase db,const QString &username);// 查操作,名称绑定方式
step2 在 widget.cpp 实现查询函数
查询所有数据
/*
* 功能描述:数据查操作,查询所有数据
* 执行SQL语句的方式,查询所有的用户数据记录
* @param QSqlDatabase:数据库连接
*/
void Widget::queryAllUser(QSqlDatabase db) {
QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
QSqlQuery query(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());
}
}
查询一条数据,直接用sql的方式
/*
* 功能描述:查询一条数据记录
* 数据查操作,SQL语句的方式实现
* @param QSqlDatabase:数据库连接
* @param username:用户名
*/
void Widget::selectQueryUser(QSqlDatabase db,const QString &username) {
QString sql = "SELECT * FROM newUser WHERE username='" + username + "'";
QSqlQuery query(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());
}
}
查询一条数据,名称绑定的方式
/*
* 功能描述:查询一条数据记录
* 数据查操作,名称绑定的方式实现
* @param QSqlDatabase:数据库连接
* @param username:用户名
*/
void Widget::preparedQueryUser(QSqlDatabase db,const QString &username) {
QString sql = "SELECT * FROM newUser WHERE username=:username";
QSqlQuery query(db); // [1] 传入数据库连接
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());
}
}
step3 调用刚才写的代码,实现查询记录操作
查询所有数据
qDebug() << "---- query all data start----- ";
queryAllUser(db); // 查询所有数据
qDebug() << "---- query all data end----- " << "\n ";
名称绑定的方式查询一条数据记录
preparedQueryUser(db,"wang");
直接用SQL语句的方式查询一条数据记录
selectQueryUser(db,"lili"); // 直接执行sql语句方式
此时代码应该是这样的
step4 ctrl+r 运行程序
以上只是简单的实现增删改查操作,实际开发应用的时候,会比这个复杂,但是基本的实现过程是一样的,想了解数据库的其他操作,可以找找数据库相关的文档看一下。
myDataBaseDrivers 项目 widget.h 源码
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
void updateUser(QSqlDatabase db,const int &id,const QString &username); // 更操作,修改数据
void queryAllUser(QSqlDatabase db); // 查操作,查询所有数据记录
void selectQueryUser(QSqlDatabase db,const QString &username); // 查操作,直接执行SQL语句方式
void preparedQueryUser(QSqlDatabase db,const QString &username); // 查操作,名称绑定方式
void deleteUser(QSqlDatabase db,const QString &username); // 删操作
void insertUserName(QSqlDatabase db,const int &userid, const QString &name); // 增操作
void createConnectionByName(const QString &connectionName); //使用自定义 connectionName 创建连接
QSqlDatabase getConnectionByName(const QString &connectionName); // 使用自定义 connectionName 获取连接
Ui::Widget *ui;
};
#endif // WIDGET_H
myDataBaseDrivers 项目 widget.cpp 源码
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 获取数据库驱动列表
qDebug() << QSqlDatabase::drivers();
// [1]创建名为 firstConnect 的数据库连接
createConnectionByName("firstConnect");
// 获取数据库
QSqlDatabase db = getConnectionByName("firstConnect");
// 实例化QSqlQuery,用于执行sql语句
QSqlQuery query(db);
// 创建一个表
query.exec("create table newUser (id int primary key,username varchar(20))");
// [2]增操作
qDebug() << "---- insert operation start----";
insertUserName(db,1,"xiaoqiao");
insertUserName(db,2,"wang");
query.exec("INSERT INTO newUser (id, username) VALUES (3, 'alex')");
insertUserName(db,4,"lili");
queryAllUser(db); // 查询增操作结果
qDebug() << "---- insert operation end----- " << "\n ";
// [3]查询操作
qDebug() << "---- query operation start----- ";
selectQueryUser(db,"lili"); // 直接执行sql语句方式
preparedQueryUser(db,"wang");
qDebug() << "---- query operation end----- " << "\n ";
qDebug() << "---- query all data start----- ";
queryAllUser(db); // 查询所有数据
qDebug() << "---- query all data end----- " << "\n ";
// [4]删操作
qDebug() << "---- delete operation start----";
deleteUser(db,"alex");
query.exec(" DELETE FROM newUser WHERE username='wang' ");
queryAllUser(db);
qDebug() << "---- query operation end----" << "\n ";
// [5]改操作,根据id修改数据
qDebug() << "---- update operation start----";
qDebug() << "---- before update id 1: ----";
queryAllUser(db);
updateUser(db,1,"yase");// ID为1,数据修改为 yase
query.exec(" update newUser set username='newname' WHERE id=4");
qDebug() << "---- after update id 1: ----";
queryAllUser(db);
qDebug() << "---- update operation end----" << "\n ";
// 仅仅是测试需要,删除数据表中的所有数据,为了不影响下次运行程序观察结果
query.exec(" DELETE FROM newUser");
}
/*
* 功能描述:更新数据
* 修改传入的 id 的 username
* @param QSqlDatabase:数据库连接
* @param id:用户id
* @param username:用户名
*/
void Widget::updateUser(QSqlDatabase db,const int &id,const QString &username) {
QSqlQuery query(db);
query.prepare("update newUser set username=:username WHERE id=:id");
query.bindValue(":id", id);
query.bindValue(":username", username);
query.exec();
}
/*
* 功能描述:数据查操作,查询所有数据
* 执行SQL语句的方式,查询所有的用户数据记录
* @param QSqlDatabase:数据库连接
*/
void Widget::queryAllUser(QSqlDatabase db) {
QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
QSqlQuery query(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());
}
}
/*
* 功能描述:查询一条数据记录
* 数据查操作,SQL语句的方式实现
* @param QSqlDatabase:数据库连接
* @param username:用户名
*/
void Widget::selectQueryUser(QSqlDatabase db,const QString &username) {
QString sql = "SELECT * FROM newUser WHERE username='" + username + "'";
QSqlQuery query(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());
}
}
/*
* 功能描述:查询一条数据记录
* 数据查操作,名称绑定的方式实现
* @param QSqlDatabase:数据库连接
* @param username:用户名
*/
void Widget::preparedQueryUser(QSqlDatabase db,const QString &username) {
QString sql = "SELECT * FROM newUser WHERE username=:username";
QSqlQuery query(db); // [1] 传入数据库连接
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());
}
}
/*
* 功能描述:数据删操作
* 从数据库中删除一条数据,名称绑定的方式实现
* @param QSqlDatabase:数据库连接
* @param username:用户名
*/
void Widget::deleteUser(QSqlDatabase db,const QString &username) {
QSqlQuery query(db);
query.prepare("DELETE FROM newUser WHERE username=:username");
query.bindValue(":username", username);
query.exec();
}
/*
* 功能描述:数据增操作
* 向数据库中插入一条数据记录,名称绑定的方式实现
* @param QSqlDatabase:数据库连接
* @param id:用户id
* @param username:用户名
*/
void Widget::insertUserName(QSqlDatabase db,const int &userid, const QString &name) {
QSqlQuery query(db);
query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
query.bindValue(":id", userid);
query.bindValue(":username", name);
query.exec();
}
/*
* 功能描述:创建数据库连接
* 使用自定义 connectionName 创建连接
* @param connectionName:连接的名称
*/
void Widget::createConnectionByName(const QString &connectionName){
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", connectionName);
// 数据库连接需要设置的信息
db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
db.setDatabaseName("ceshi");// 数据库名
db.setUserName("root");// 用户名
db.setPassword("123456");// 密码
db.setPort(3306);// 端口号
// 连接数据库判断
bool ok = db.open();
if (ok){
qDebug() << "database connect is ok";
} else {
qDebug() << "database connect is fail";
}
}
/*
* 功能描述:获取数据库连接
* 使用自定义 connectionName 获取连接
* @param connectionName:连接的名称
* @return 返回一个数据库连接
*/
QSqlDatabase Widget::getConnectionByName(const QString &connectionName) {
// 获取数据库连接
return QSqlDatabase::database(connectionName);
}
Widget::~Widget()
{
delete ui;
}