将mysql文件lib目录下的libmysql.dll
和libmysql.lib
复制到Qt中的bin目录文件下
添加头文件:
#include // 连接数据库
#include // 数据库连接失败打印报错语句
#include // 数据库操作(增删改查)
#include
#include // 泛型链表,可以存储任何类型的数据
#include
进行数据库的连接:
//addDatabase() 创建一个连接,调用这个函数时,我们可以传递我们要访问哪种类型的数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //驱动
db.setHostName("localhost"); // 数据库地址,一般都是本地,填localhost就可以(或者填写127.0.0.1)
db.setDatabaseName("dbtest"); // 数据库名,根据你Mysql里面的数据库名称来填写,比如我的Mysql里面有个数据库叫school
db.setUserName("root"); // 登录用户名,一般是本地用户,填root就可以
db.setPassword("root"); // 登录密码,填写你自己Mysql登陆密码
db.setPort(3306); // 端口,默认是3306
// 打开数据库
if (!db.open()) { // 数据库打开失败
QMessageBox::warning(this, "警报", db.lastError().text()); // 显示错误信息
return;
} else {
QMessageBox::information(this, "提示", "数据库连接成功");
}
特别注意:
操作数据库增删改查时,需要用到QSqlQuery query;
;当每次需要操作时,最好都是定义一个新的去操作,避免不必要的操作失败!
1、创建表
create table 表名(列名 类型, …, 列名 类型);
// 创建表
QSqlQuery query; // *对数据进行操作所需要使用到的对象*
QString sql = "";
// 定义sql语句
sql = "create table qt_test_table(id int PRIMARY KEY AUTO_INCREMENT, name varchar(32), age int, score int);";
// 执行sql语句
query.exec(sql);
2、插入单条数据
insert into 表名 values(数据1, 数据2, …, 数据n);
// 插入数据
sql = "insert into qt_test_table values(1, '小明', 00, 59);";
query.exec(sql); // 执行sql语句
3、批量插入数据
// 创建预处理语句:?相当于 占位符
query.exec("insert into qt_test_table(name, age, score) values(?, ?, ?);");
// 给字段设置内容
QVariantList nameList;
nameList << "小红" << "小黄" << "小蓝" << "小紫";
QVariantList ageList;
ageList << 11 << 22 << 33 << 44;
QVariantList scoreList;
scoreList << 69 << 79 << 89 << 99;
// 给字段绑定相应的值,按顺序绑定
query.addBindValue(nameList);
query.addBindValue(ageList);
query.addBindValue(scoreList);
// 执行预处理命令
query.execBatch();
// 创建预处理语句:占位符 : + 自定义名字(一般写跟字段名一致)
query.prepare("insert into qt_test_table(name, age, score) values(:name, :age, :score);");
// 给字段设置内容
QVariantList _nameList;
_nameList << "小绿" << "小黑" << "小白" << "小橙";
QVariantList _ageList;
_ageList << 55 << 66 << 77 << 88;
QVariantList _scoreList;
_scoreList << 19 << 29 << 39 << 49;
// 给字段绑定相应的值,不局限于顺序
query.bindValue(":name", _nameList);
query.bindValue(":score", _scoreList);
query.bindValue(":age", _ageList);
// 执行预处理命令
query.execBatch();
4、删除数据
delete from 表名 where 条件;
// 删除数据
sql = QString("delete from qt_test_table where name = '小明';");
query.exec(sql);
5、更新数据
update 表名 set 列名 = ***, …, 列名 = *** where 条件;
// 更新数据
sql = QString("update qt_test_table set name = '小小晓晓', age = 18, score = 100 where id = 2;");
query.exec(sql);
6、查询数据
使用.next()方法指向下一条记录,如果还有则返回true,如果没有了则返回false。
通过.value()可以获得对应字段的内容;
可以通过数字下标方式获得,也可以通过字段名获得。
select * from 表名; //查询全部
select 字段名 from 表名; //仅查询该字段内容
select * from 表名 where 条件; //条件查询
// 查询数据
query.exec("select * from qt_test_table;"); // 查询全部
//query.exec("select * from qt_test_table where id = 2;"); // 条件查询
// 当查询完数据返回false
while (query.next()) {
qDebug() << query.value(0).toInt() // 第一个字段
<< query.value(1).toString() // 第二个字段
<< query.value("age").toInt() // 也可以通过字段名进行获取
<< query.value("score").toInt();
}
7、删除表
drop table 表名;
// 删除表
query.exec("drop table qt_test_table;");
8、释放数据库连接
当不在使用数据库时,记得释放数据库的连接。
// 释放数据库连接
db.close();
9、获得当前数据库对象
有时候我们的数据库对象是在构造函数里定义的,但是如果我们需要在私有的方法里使用它,该如何使用呢?
很简单:
QSqlDatabase::database(); // 返回当前数据库对象