一、MySQL概述
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
二、MySQL安装
下载MySQL 安装包,下载地址。
安装过程:超详细MySQL安装及基本使用教程
也可以使用phpstudy来安装MySQL
windows端5款mysql客户端工具:
1)MySQL Workbench
这属于mysql官方出品,免费,功能强大,是首选。
2)HeidiSQL
免费,功能强大,强烈推荐。
3)dbForge Studio for MySQL
收费软件
4)Navicat for MySQL
这个确实是好用,就是价格有点贵。
5)SQLyog
收费软件,贵。
三、Qt操作MySQL数据库
3.1 创建数据库
//! 输出可用数据库
qDebug() << "Available drivers:";
QStringList drivers = QSqlDatabase::drivers();
for (int i = 0; i < drivers.size(); i++){
qDebug()<<drivers[i];
}
//! 添加数据库驱动
QSqlDatabase mySqlDB = QSqlDatabase::addDatabase("QMYSQL");
//! 设置数据库名称
mySqlDB.setDatabaseName("E:/work/qe/mytest1/database.db");
//! 打开数据库
if(!mySqlDB.open())
return false;
Qt连接MySQL的时候提示“QSqlDatabase: QMYSQL driver not loaded”问题,原因有如下两个:
1)缺少libmysql.dll 文件
解决办法是从 MySQL\lib中将 libmysql.dll 文件复制D:\Qt\Qt5.7.1\5.7\msvc2015_64\bin中
2)Qt Creator与MySQL位数不统一
如果上面的方法试过了还是不行那么应该是你安装的MySQL和QT的位数不同,可以打开MySQL控制台
输入show variables like '%version_%';即可查看MySql位数。
2.2 创建一个表、插入及查询操作
#include <QCoreApplication>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QString>
#include <QSqlRecord>
#include <QSqlDriver>
#include <QString>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//! 输出可用数据库
qDebug() << "Available drivers:";
QStringList drivers = QSqlDatabase::drivers();
for (int i = 0; i < drivers.size(); i++){
qDebug()<<drivers[i];
}
//! 添加数据库驱动
QSqlDatabase mySqlDB = QSqlDatabase::addDatabase("QMYSQL");
mySqlDB.setHostName("localhost");
mySqlDB.setDatabaseName("web001");
mySqlDB.setUserName("root");
mySqlDB.setPassword("123456");
mySqlDB.setPort(3306);
//! 打开数据库
if(!mySqlDB.open()){
qDebug("Failed to connect to root mysql admin");
return false;
}
//! 以下执行相关sql语句
QSqlQuery mySqlQuery;
//! 清空student表
mySqlQuery.exec("drop table student");
//! 新建student表,id设置为主键,还有一个name项
mySqlQuery.exec("create table student (id int primary key, name varchar(20),course varchar(20))");
//!批量导入
QStringList strListStdName;
strListStdName<<"wang bin"<<"xiao yu"<<"ye mei";
QStringList strListStdCourse;
strListStdCourse<<"Math"<<"English"<<"Computer";
mySqlQuery.prepare("INSERT INTO student (id,name, course) "
"VALUES (:id,:name, :course)");
for (int i = 0; i < strListStdName.size(); i++)
{
mySqlQuery.bindValue(":id",i); //! 加入主键
mySqlQuery.bindValue(":name", strListStdName[i]); //! 向绑定值里加入名字
mySqlQuery.bindValue(":course", strListStdCourse[i]); //! 课程
mySqlQuery.exec(); //! 加入库中
}
//! 向表中插入1条数据
mySqlQuery.bindValue(0,3);
mySqlQuery.bindValue(1,"wang han");
mySqlQuery.bindValue(2,"Chinese");
mySqlQuery.exec();
//! 查找表中id >=1 的记录的id项和name项的值
mySqlQuery.exec("select * from student where id >= 0");
//! query.next()指向查找到的第一条记录,然后每次后移一条记录
QSqlRecord mySqlRec = mySqlQuery.record();
while(mySqlQuery.next())
{
//! 获取query所指向的记录在结果集中的编号
int nRowNum = mySqlQuery.at();
//! 获取每条记录中属性(即列)的个数
int nColumnNum = mySqlQuery.record().count();
//! 获取"name"属性所在列的编号,列从左向右编号,最左边的编号为0
int nFieldNo = mySqlQuery.record().indexOf("name");
nFieldNo = mySqlRec.indexOf("course");
//! 获取id属性的值,并转换为int型
int stud_id = mySqlQuery.value(0).toInt();
//! 获取name属性的值
QString stud_name = mySqlQuery.value(1).toString();
//! 获取course属性的值
QString stud_course = mySqlQuery.value(2).toString();
//! 输出结果
qDebug() << nRowNum << nColumnNum << nFieldNo << stud_id << stud_name << stud_course;
}
//! 定位到结果集中编号为2的记录,即第三条记录,因为第一条记录的编号为0
qDebug() << "exec seek(2) :";
if(mySqlQuery.seek(2))
{
qDebug() << "rowNum is : " << mySqlQuery.at()
<< " id is : " << mySqlQuery.value(0).toInt()
<< " name is : " << mySqlQuery.value(1).toString();
}
//! 定位到结果集中最后一条记录
qDebug() << "exec last() :";
if(mySqlQuery.last())
{
qDebug() << "rowNum is : " << mySqlQuery.at()
<< " id is : " << mySqlQuery.value(0).toInt()
<< " name is : " << mySqlQuery.value(1).toString();
}
return a.exec();
}
输出结果:
参考资料: