目录
一、数据库简介
二、Linux下使用sqlite3
三、SQL语句
1.Create Table
2.Drop Table
3.Truncate Table
4.Insert Into
5.Select
6.Delete
7.Update
8.Alter Table
9.约束
四、Sqlite3类
1.QSqlDatabase
2.QSqlQuery
3.QStandardItemMode
4.QSqlTableModel
5.QSqlQueryModel
五、数据库简单加密
一、数据库简介数据库是用来存储和管理数据的专用软件,使得管理数据更加安全,方便和高效。数据库对数据的管理的基本单位是表(table)。
常见的数据库:
大型数据库(大型机) ----------- Oracle(亿级)
中型数据库(分布式超大型) -------- mysql(百万级)
轻型数据库(嵌入式设备) -------- sqlite(万级)
访问数据库使用SQL语句,适用于所有的数据库。
二、Linux下使用sqlite3sudo apt-get update
sudo apt-get install sqlite3
sqlite3使用指令
sqlite3 数据库文件的路径 //打开、创建数据库
sqlite3 first.db //打开数据库成功后会进入命令行
基本操作命令:
.exit/.quit -------- 退出数据库命令行
.help -------------- 帮助说明信息
.tables ------------ 查看当前数据库中所有的表
三、SQL语句基本语法: 所有的SQL语句都以分号(;)结束并且不区分大小写。
1.Create Tablecreate table 表名(字段名1 字段类型1,字段名2 字段类型2,字段名3 字段类型3,...);
表格是数据库中储存资料的基本架构。在绝大部份的情况下,数据库厂商不可能知道您需要如何储存您的资料,所以通常您会需要自己在数据库中建立表格。
//创建一个stutbl的表,表中有3个字段
//分别是整数类型的学号id,字符串类型的name和整数类型的age
create table stutbl(id int,name char[20],age int);
//不存在则创建
create table if not exists stutbl(id int,name char[20],age int);
//如果希望表中某个字段的内容不重复,可以用unique修饰该字段
create table if not exists stutbl(id int unique,name char[20],age int);
字段数据类型:
类型范围说明int/integer-2^32---2^32-1整型float-1.79E+308至1.79E+308浮点型real-3.04E+38至3.04E+38浮点型char8000定长的unicode字符类型varchar8000变长的unicode字符类型(根据使用长度自动分配)text2G变长的unicode字符类型,文本类型 2.Drop Table从数据库中清除一个表格
drop table 表名;
3.Truncate Table
清除一个表格中的所有数据
truncate table 表名
4.Insert Into
insert into 表名 values(字段值1,字段值2,字段值3,....);
//字段值如果是字符串,必须用''(单引号)括起来
示例:
insert into stutbl values(1001,'张飞',23);
insert into stutbl values(1002,'赵云',19);
insert into stutbl values(1003,'刘备',31);
stutbl表格内容如下:
select * from 表名; //查询表中的所有数据
select 字段名, 字段名 form 表格名; //查询结果显示两个字段对应的数据
条件查询(where)
select * form 表格名 where 条件; //查询满足条件的数据
示例:
create table if not exists testtbl(id int unique,name char[20],class int,grade int,age int,score float);
INSERT INTO TESTTBL VALUES(1001,'lily',4,3,9,78.5);
INSERT INTO TESTTBL VALUES(1002,'黄国桐',6,7,12,88.5);
INSERT INTO TESTTBL VALUES(1003,'秦逍',3,5,23,91.0);
INSERT INTO TESTTBL VALUES(1004,'韦申姿',9,2,16,81.5);
//查找:
1.使用where指定查询条件
select * from testtbl where class=6;//查询class值为6的条目
select * from testtbl where score>=90 or scoresetHorizontalHeaderItem(0,new QStandardItem("id"));
model->setHorizontalHeaderItem(1,new QStandardItem("name"));
model->setHorizontalHeaderItem(2,new QStandardItem("age"));
//绑定模型和表格
ui->tableView->setModel(model);
效果如下:
总之,QTableView是表示图控件、QStandardItemModel是标准数据模型、QItemSelectionModel用来响应消息和出发信号和事件,QStandardItem是QStandardItemModel 的数据管理的基本单元。
4.QSqlTableModelQSqlTableModel用来显示数据库中数据表的数据,实现对数据的编辑、插入、删除等操作。实现数据的排序和过滤。
QSqlTableModel将SQL语句对数据库的访问完全对象化,将SQL语句的执行封装成对象及其成员函数的实现,同时也对象化了Qt的表格界面,实现了数据库访问的高耦合性,屏蔽了数据库访问的内部细节,将数据库的访问简化成调用对象的接口(成员函数)。
1.绑定表(数据库的表) --------- setTable
[virtual] void QSqlTableModel::setTable(const QString &tableName); //传入数据库表格名
2.插入数据
//插入一条记录: 先构建一条QSqlRecord,在插入
bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record);
//插入一行
bool QAbstractItemModel::insertRow(int row, const QModelIndex &parent = QModelIndex());
3.提交模型到数据库 --------- submit/submitAll
[override virtual slot] bool QSqlTableModel::submit(); [slot] bool QSqlTableModel::submitAll();
4.查询 ---------- select()
[virtual slot] bool QSqlTableModel::select();
注:每次查询后应该重新绑定表格,如果要显示要绑定模型和表格界面。
查找并设置过滤器
[virtual] void QSqlTableModel::setFilter(const QString &filter);//传入的字符串格式"字段名=字段值"
查找并排序
[virtual] void QSqlTableModel::setSort(int column, Qt::SortOrder order);
Qt::AscendingOrder --- 升序 Qt::DescendingOrder --- 降序
5.从模型删除行 -------- removeRow/removeRows
[override virtual] bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); //传入从哪一行开始删除多少行
//返回当前模型的行数
[override virtual] int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const;
//删除指定行
bool QAbstractItemModel::removeRow(int row, const QModelIndex &parent = QModelIndex());
6.修改 --------- (查询+插入)
①.//获取QSqlRecord
QSqlRecord QSqlTableModel::record() const;//获取一条空记录 QSqlRecord QSqlTableModel::record(int row) const ; //获取指定行的记录
②.//QSqlRecord的修改字段值的函数
void QSqlRecord::setValue(int index, const QVariant &val); void QSqlRecord::setValue(const QString &name, const QVariant &val);
③.//将修改好的记录写回模型
bool QSqlTableModel::setRecord(int row, const QSqlRecord &values);
法二:直接修改模型中的数据 ------ setData
//传入要修改的位置编号和内容
[override virtual] bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
//通过行和列求编号
[override virtual] QModelIndex QAbstractTableModel::index(int row, int column, const QModelIndex &parent = ...) const;
7.撤销修改 ------ revert/revertAll
[override virtual slot] void QSqlTableModel::revert();
[slot] void QSqlTableModel::revertAll();
QSqlTableModel *model;//数据库数据模型
QSqlDatabase db;
//添加数据库驱动
db = QSqlDatabase::addDatabase("QSQLITE");
//指定数据库文件路径
db.setDatabaseName("stu.db");
//打开数据库
if(!db.open()){
QMessageBox::warning(this,"提示","打开数据库失败");
}
//初始化模型
model = new QSqlTableModel(this);
//绑定模型和表格界面
ui->tableView->setModel(model);
//建表
void SmartSQLStu::on_pushButton_create_clicked()
{
QString sql = QString("create table if not exists %1(id int unique,name ntext,age int)").
arg(ui->lineEdit_tablename->text());
//执行sql ------ QSqlQuery对象在要执行时创建
QSqlQuery query;
if(!query.exec(sql)){
QMessageBox::warning(this,"提示","建表失败!");
return;
}
model->setTable(ui->lineEdit_tablename->text());
//设置提交后生效
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//显示
model->select();
//禁止表名输入框和建表按钮
ui->lineEdit_tablename->setEnabled(false);
ui->pushButton_create->setEnabled(false);
}
//添加
void SmartSQLStu::on_pushButton_insert_clicked()
{
//获取当前行数
int row = model->rowCount();
model->insertRow(row);//最后一行后插入
int id = 100;
model->setData(model->index(row,0),id);
//提交
model->submitAll();
}
//保存
void SmartSQLStu::on_pushButton_save_clicked()
{
model->submitAll();
}
//撤销
void SmartSQLStu::on_pushButton_revert_clicked()
{
model->revertAll();
}
//删除
void SmartSQLStu::on_pushButton_delete_clicked()
{
//从表格中获取要删除的行
int delrow = ui->tableView->currentIndex().row();
//删除改行
model->removeRow(delrow);
//询问询问用户是否真的删除
if(QMessageBox::Yes==QMessageBox::warning(this,"删除","确定删除本行吗?",QMessageBox::Yes|QMessageBox::No)){
model->submitAll();
}
else{
//撤销
model->revert();
}
}
//查询
void SmartSQLStu::on_pushButton_select_clicked()
{
model->setTable(ui->lineEdit_tablename->text());
model->select();
}
5.QSqlQueryModel
QSqlQueryModel作为数据模型从数据库里查询数据,只需要使用setQuery()函数设置一个select查询语句即可。
用QSqlQueryModel::setQuery设置sql查询
void QSqlQueryModel::setQuery ( const QSqlQuery & query )
void QSqlQueryModel::setQuery ( const QString & query, const QSqlDatabase & db = QSqlDatabase() )
QSqlQueryModel *sql_model = new QSqlQueryModel;
sql_model->setQuery("SELECT* FROM user_table");
tabelview->setModel(sql_model);
tabelview->setEditTriggers(QAbstractItemView::NoEditTriggers);
五、数据库简单加密
MD5是一种将任意长度的数据变换得到128位2进制数据,无法通过128位2进制数据求的原始数据的加密方式。
1.创建一个加密对象 //需要添加头文件
QCryptographicHash hash(QCryptographicHash::Md5);
2.放入要加密的数据
void QCryptographicHash::addData(const QByteArray &data); //hash.addData(password.toUtf8());
3.获取加密结果
QByteArray QCryptographicHash::result() const;
//hash.result();
将用户注册的密码进行加密
//对密码进行Md5的加密
//1.创建QCryptographicHash加密对象
QCryptographicHash hash(QCryptographicHash::Md5);
//2.放入要加密的数据
hash.addData(password.toUtf8());
//3.取出加密结果
QByteArray arr = hash.result();
password = arr.toHex();
qDebug()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?