This commit is contained in:
curtis
2024-11-25 17:15:44 +08:00
commit 32e5360a91
3749 changed files with 1432905 additions and 0 deletions

View File

@@ -0,0 +1,146 @@
#include "cdatabaseinterface.h"
#include "mysqldatabase.h"
#include <QMap>
#include <QDebug>
#pragma execution_character_set("utf-8")
CDatabaseInterface* CDatabaseInterface::m_DatabaseInterface = NULL;
CDatabaseInterface::CDatabaseInterface(QObject *parent) : QObject(parent)
{
m_sqlDataBase = new MySqlDataBase();
}
bool CDatabaseInterface::openDB(QString name,const QString &type )
{
if(m_sqlDataBase)
{
return m_sqlDataBase->openDB(name,type);
}
return false;
}
void CDatabaseInterface::closeDB()
{
if(m_sqlDataBase)
{
m_sqlDataBase->closeDB();
}
}
CDatabaseInterface* CDatabaseInterface::getInstance()
{
if(!m_DatabaseInterface)
m_DatabaseInterface = new CDatabaseInterface();
return m_DatabaseInterface;
}
bool CDatabaseInterface::createTable(QString table,QMap<QString,QString> map)
{
if(m_sqlDataBase)
{
return m_sqlDataBase->createTable(table,map);
}
return false;
}
bool CDatabaseInterface::insertRowTable(QString table,QVariantMap map)
{
if(m_sqlDataBase)
{
return m_sqlDataBase->insertRowTable(table,map);
}
return false;
}
bool CDatabaseInterface::deleteRowTable(QString table,QString columName,QString value)
{
if(m_sqlDataBase)
{
return m_sqlDataBase->deleteRowTable(table,columName,value);
}
return false;
}
bool CDatabaseInterface::updateRowTable(QString table,QString name,QVariantMap map)
{
if(m_sqlDataBase)
{
return m_sqlDataBase->updateRowTable(table,name,map);
}
return false;
}
bool CDatabaseInterface::updateRowTable(QString table,QString targetkey,QString targetValue,QString name,QVariantMap map)
{
if(m_sqlDataBase)
{
return m_sqlDataBase->updateRowTable(table,targetkey,targetValue,name,map);
}
return false;
}
bool CDatabaseInterface::sortTable(QString table,QString target)
{
if(m_sqlDataBase)
{
return m_sqlDataBase->sortTable(table,target);
}
return false;
}
QList<QVariantMap> CDatabaseInterface::getValues(int page,int pageNum)
{
QList<QVariantMap> List;
List.clear();
if(m_sqlDataBase)
{
return m_sqlDataBase->getValues(page,pageNum);
}
return List;
}
bool CDatabaseInterface::prepare(const QString& query)
{
if(m_sqlDataBase)
{
return m_sqlDataBase->prepare(query);
}
return false;
}
bool CDatabaseInterface::exec(const QString &query)
{
if(m_sqlDataBase)
{
return m_sqlDataBase->exec(query);
}
return false;
}
bool CDatabaseInterface::exec()
{
if(m_sqlDataBase)
{
return m_sqlDataBase->exec();
}
return false;
}
QString CDatabaseInterface::getLastError()
{
if(m_sqlDataBase)
{
return m_sqlDataBase->lastError();
}
else
return QString("数据库未初始化");
}
int CDatabaseInterface::getValuesSize()
{
if(m_sqlDataBase)
{
return m_sqlDataBase->size();
}
return 0;
}

View File

@@ -0,0 +1,80 @@
#ifndef CDATABASEINTERFACE_H
#define CDATABASEINTERFACE_H
#include <QObject>
#include <QVariant>
#include <QString>
class MySqlDataBase;
class CDatabaseInterface : public QObject
{
Q_OBJECT
public:
static CDatabaseInterface* getInstance();
bool openDB(QString name,const QString &type = "QMYSQL");
//关闭数据库
void closeDB();
/*********创建数据表*****
* 参数 QString table-表名 QMap<QString,QString>-(arg1字段名)(arg2数据类型)
* 返回值 true-插入成功 false-插入失败
* 备注:最好不要使用该函数建表,因为涉及到的语句比较特殊,容易出错
* *********/
bool createTable(QString table,QMap<QString,QString>);
/*********数据库插入操作*****
* 参数 QString table-表名 QVariantMap map-实际带插入数据
* 返回值 true-插入成功 false-插入失败
* *********/
bool insertRowTable(QString table,QVariantMap map);
/*********删除数据库中的某一行*****
* 参数 QString table-表名 QString columName-列字段 QString value-需要删除的具体数据
* 返回值 true-插入成功 false-插入失败
* *********/
bool deleteRowTable(QString table,QString columName,QString value);
/*********更新数据库中的某一行*****
* 参数 QString table-表名 QString name-字段名 QVariantMap map-具体数据
* 返回值 true-插入成功 false-插入失败
* *********/
bool updateRowTable(QString table,QString name,QVariantMap map);
/*********更新数据库中的某一行*****
* 参数 QString table-表名 QString targetkey-字段名 QString targetValue-具体值 QVariantMap map-具体数据
* targetkey,targetValue为查询条件
* name查询条件二
* 返回值 true-插入成功 false-插入失败
* *********/
bool updateRowTable(QString table,QString targetkey,QString targetValue,QString name,QVariantMap map);
/*********升序排列*****
* 参数 QString table-表名 QString target-字段名
* 返回值 true-插入成功 false-插入失败
* *********/
bool sortTable(QString table,QString target);
/********获取数据库的查询结果*****
* 说明:在使用该函数之前需要先执行查询语句,具体为
* 参数 int page-从哪一页获取 int pageNum-一页获取多少数据
* 返回值 QList<QVariantMap>-查询得到的结果
* *********/
QList<QVariantMap>getValues(int page,int pageNum);
bool prepare(const QString& query);
bool exec(const QString &query);
bool exec();
//获取数据库操作最后出现的错误
QString getLastError();
int getValuesSize();
private:
explicit CDatabaseInterface(QObject *parent = nullptr);
static CDatabaseInterface* m_DatabaseInterface;
MySqlDataBase *m_sqlDataBase;
};
#endif // CDATABASEINTERFACE_H

View File

@@ -0,0 +1,332 @@
#include "mysqldatabase.h"
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>
#include <QSqlDriver>
#include <QSqlRecord>
#include <QSqlField>
MySqlDataBase::MySqlDataBase(QWidget *parent)
: QWidget(parent)
{
}
MySqlDataBase::~MySqlDataBase()
{
}
/*********打开数据库***************/
bool MySqlDataBase::openDB(QString name,const QString &type)
{
//首先判断是否该数据库
if(QSqlDatabase::contains(name))
{
m_database = QSqlDatabase::database(name);
}
else
{
/***根据type类型添加数据库驱动****/
m_database = QSqlDatabase::addDatabase(type,name);
/****设置数据库连接名****/
m_database.setDatabaseName(name);
}
m_database.setUserName("root");
m_database.setPassword("root");
if(!m_database.open())
{
setLastError(m_database.lastError().text());
return false;
}
m_sqlQuery = QSqlQuery(m_database);
qDebug()<<QSqlDatabase::connectionNames();
return true;
}
void MySqlDataBase::closeDB()
{
if(m_database.isOpen())
m_database.close();
}
/*********创建数据库表格**************/
bool MySqlDataBase::createTable(QString table,QMap<QString,QString> map)
{
if(!isTableExist(table))
{
QString tableList = QString("create table if not exists %1 (").arg(table);
QMapIterator<QString,QString> iter(map);
while(iter.hasNext())
{
iter.next();
tableList.append(QString("%1 %2").arg(iter.key()).arg(iter.value()));
if(iter.hasNext())
tableList.append(",");
}
tableList.append(")");
//执行sql语句
return this->exec(tableList);
}
else
{
setLastError(QString("Exist table<%1>").arg(table));
return false;
}
}
/*********数据库插入操作**************/
bool MySqlDataBase::insertRowTable(QString table,QVariantMap map)
{
QMap<QString,QString> tableContentMap;
if(!isTableExist(table))
{
setLastError(QString("Not find %1 table").arg(table));
return false;
}
else
{
tableContentMap = getTableInfo(table);
if(tableContentMap.isEmpty())
return false;
}
QString insertTableContent = QString("insert into %1(").arg(table);
QString values = QString(" values(");
QMapIterator<QString,QString> iter(tableContentMap);
while(iter.hasNext())
{
iter.next();
insertTableContent.append(QString("%1").arg(iter.key()));
values.append("?");
if(iter.hasNext())
{
insertTableContent.append(", ");
values.append(",");
}
}
insertTableContent.append(")");
values.append(")");
insertTableContent.append(values);
// qDebug()<<insertTableContent;
if(!this->prepare(insertTableContent))
return false;
QMapIterator<QString,QString> iter_(tableContentMap);
while(iter_.hasNext())
{
iter_.next();
m_sqlQuery.addBindValue(map[iter_.key()]);
}
return this->exec();
}
/*********删除数据库中的某一行*********/
bool MySqlDataBase::deleteRowTable(QString table,QString columName,QString value)
{
QString delereContent = QString("delete from %1 where %2 = '%3'").arg(table).arg(columName).arg(value);
return this->exec(delereContent);
}
/*********更新/更改某一个字段的n行数据*********/
bool MySqlDataBase::updateRowTable(QString table,QString name,QVariantMap map)
{
QString content = QString("update %1 set ").arg(table);
QMapIterator<QString,QVariant> iter(map);
while(iter.hasNext())
{
iter.next();
if(iter.hasNext())
content += QString("%1 = '%2',").arg(iter.key()).arg(iter.value().toString());
else
content += QString("%1 = '%2' ").arg(iter.key()).arg(iter.value().toString());
}
content += QString("where %1 = '%2'").arg(name).arg(map[name].toString());
return this->exec(content);
}
/*********更新某个字段为特定值的其他字段的值********/
bool MySqlDataBase::updateRowTable(QString table,QString targetkey,QString targetValue,QString name,QVariantMap map)
{
QString content = QString("update %1 set ").arg(table);
QMapIterator<QString,QVariant> iter(map);
while(iter.hasNext())
{
iter.next();
if(iter.key() == "UUID")
continue;
if(iter.hasNext())
content += QString("%1 = '%2',").arg(iter.key()).arg(iter.value().toString());
else
content += QString("%1 = '%2' ").arg(iter.key()).arg(iter.value().toString());
}
content += QString("where %1 = '%2' and %3 = '%4'").arg(targetkey).arg(targetValue).arg(name).arg(map[name].toString());
return this->exec(content);
}
/*********升序排列*************/
bool MySqlDataBase::sortTable(QString table,QString target)
{
/***select * from table by target*/
QString sortContent = QString("select * from %1 order by '%2'").arg(table).arg(target);
return this->exec(sortContent);
}
/********获取数据库的查询结果*******/
QList<QVariantMap> MySqlDataBase::getValues(int page,int pageNum)
{
QList<QVariantMap>list;
bool ok = m_sqlQuery.isSelect();
if(!ok)
return QList<QVariantMap>();
if( (!m_sqlQuery.seek(page)))
{
setLastError("gevalues error![The number of pages is out of the limit]");
}
do
{
QVariantMap map;
for(int i = 0;i < m_sqlQuery.record().count();i++)
{
map.insert(m_sqlQuery.record().field(i).name(),
m_sqlQuery.record().field(i).value());
}
list.append(map);
}while(m_sqlQuery.next() && --pageNum);
return list;
}
/****获取个数*****/
int MySqlDataBase::size()
{
int size = -1;
while(m_sqlQuery.isSelect() && m_sqlQuery.next())
{
/***驱动支持返回记录***/
if(m_sqlQuery.driver()->hasFeature(QSqlDriver::QuerySize))
{
size = m_sqlQuery.size();
break;
}
else
{
m_sqlQuery.last();
size = m_sqlQuery.at() + 1 ;
}
}
//返回第一个结果
m_sqlQuery.first();
return size;
}
QString MySqlDataBase::lastError()
{
return m_lastError;
}
void MySqlDataBase::setLastError(const QString& error)
{
m_lastError = error;
}
QSqlQuery& MySqlDataBase::getSqlQUery()
{
return m_sqlQuery;
}
bool MySqlDataBase::isTableExist(QString table)
{
QStringList tables = m_database.tables();
if(tables.contains(table))
return true;
else
return false;
}
bool MySqlDataBase::prepare(const QString& query)
{
if(!m_sqlQuery.prepare(QString(query)))
{
setLastError(m_sqlQuery.lastError().text());
return false;
}
return true;
}
bool MySqlDataBase::exec(const QString &query)
{
if(!m_sqlQuery.exec(QString(query)))
{
setLastError(m_sqlQuery.lastError().text());
return false;
}
return true;
}
bool MySqlDataBase::exec()
{
if(!m_sqlQuery.exec())
{
setLastError(m_sqlQuery.lastError().text());
return false;
}
return true;
}
QMap<QString,QString> MySqlDataBase::getTableInfo(QString table)
{
QMap<QString,QString>tableMap;
QString str = QString("PRAGMA table_info(%1)").arg(table);
m_sqlQuery.prepare(str);
if(m_sqlQuery.exec())
{
while(m_sqlQuery.next())
{
tableMap[m_sqlQuery.value(1).toString()] = m_sqlQuery.value(2).toString();
}
return tableMap;
}
else
{
setLastError(m_sqlQuery.lastError().text());
return tableMap;
}
}
#if 0
bool MySqlDataBase::initDataBase()
{
db = QSqlDatabase::addDatabase("QMYSQL");//设置数据库类型
db.setHostName("localhost");//设置数据库主机名
db.setDatabaseName("mysql");//设置数据库的名字
db.setUserName("root");//设置数据库登录用户
db.setPassword("root");//设置数据库登录密码
if(!db.open())
{
qDebug()<<"database open failed";
QSqlError error = db.lastError();
qDebug()<<error.text();
return false;
}
qDebug()<<"database open success";
return true;
}
#endif

View File

@@ -0,0 +1,96 @@
#ifndef MYSQLDATABASE_H
#define MYSQLDATABASE_H
#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
class MySqlDataBase : public QWidget
{
Q_OBJECT
public:
MySqlDataBase(QWidget *parent = nullptr);
~MySqlDataBase();
//QVariantMap -- QMap<QString,QVariant> --QMap<字段名,值>
//一下所有用到的位置都是该数据内容
/*********打开数据库*****
* 参数 QString name-连接名 const QString &type-数据库类型
* 返回值 true-插入成功 false-插入失败
* *********/
bool openDB(QString name,const QString &type = "QMYSQL");
//关闭数据库
void closeDB();
/*********创建数据表*****
* 参数 QString table-表名 QMap<QString,QString>-(arg1字段名)(arg2数据类型)
* 返回值 true-插入成功 false-插入失败
* 备注:最好不要使用该函数建表,因为涉及到的语句比较特殊,容易出错
* *********/
bool createTable(QString table,QMap<QString,QString>);
/*********数据库插入操作*****
* 参数 QString table-表名 QVariantMap map-实际带插入数据
* 返回值 true-插入成功 false-插入失败
* *********/
bool insertRowTable(QString table,QVariantMap map);
/*********删除数据库中的某一行*****
* 参数 QString table-表名 QString columName-列字段 QString value-需要删除的具体数据
* 返回值 true-插入成功 false-插入失败
* *********/
bool deleteRowTable(QString table,QString columName,QString value);
/*********更新数据库中的某一行*****
* 参数 QString table-表名 QString name-字段名 QVariantMap map-具体数据
* 返回值 true-插入成功 false-插入失败
* *********/
bool updateRowTable(QString table,QString name,QVariantMap map);
/*********更新数据库中的某一行*****
* 参数 QString table-表名 QString targetkey-字段名 QString targetValue-具体值 QVariantMap map-具体数据
* key,value是针对全部要修改的
* 返回值 true-插入成功 false-插入失败
* *********/
bool updateRowTable(QString table,QString targetkey,QString targetValue,QString name,QVariantMap map);
/*********升序排列*****
* 参数 QString table-表名 QString target-字段名
* key,value是针对全部要修改的
* 返回值 true-插入成功 false-插入失败
* *********/
bool sortTable(QString table,QString target);
/********获取数据库的查询结果*****
* 说明:在使用该函数之前需要先执行查询语句,具体为
* 参数 int page-从哪一页获取 int pageNum-一页获取多少数据
* 返回值 QList<QVariantMap>-查询得到的结果
* *********/
QList<QVariantMap>getValues(int page,int pageNum);
/****返回数据库的搜索结果个数*****/
//在使用这个函数之前需要调用查询语句。
int size();
void setLastError(const QString& error);
QString lastError();
//获取当前数据表信息
QMap<QString,QString> getTableInfo(QString table);
QSqlQuery& getSqlQUery();
bool isTableExist(QString table);
bool prepare(const QString& query);
bool exec(const QString &query);
bool exec();
private:
QSqlDatabase m_database;
QSqlQuery m_sqlQuery;
QString m_lastError;
};
#endif // MYSQLDATABASE_H