COMPASSi/trunk/code/inc/Util/include/DBUtil.h

261 lines
7.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef DBUTIL_H
#define DBUTIL_H
#include <QMap>
#include <QtSql>
#include <QStringList>
#include <QVariantMap>
#include <functional>
/**
* 封装了一些操作数据库的通用方法,例如插入、更新操作、查询结果返回整数、时间类型,
* 还可以把查询结果映射成 map甚至通过传入的映射函数把 map 映射成对象等,也就是 Bean
* 可以简化操作数据库的类的代码,参考 UserDao.cpp.
*
* 所谓的 bean就是一个简单的对象只有属性 (也可以有 getter 和 setter 方法),主要目的是用来传输数据,
*
* sql 可以是一个简单的 SQL 语句,如 SELECT id, username, password FROM user
* 也可以是一个需要绑定参数的 SQL如 UPDATE user SET username=:username, password=:password WHERE id=:id
* 这时需要把要绑定的参数放在 map 里然后与 sql 一起作为参数传入,如
* QVariantMap params;
* params["id"] = user.id;
* params["username"] = user.username;
* params["password"] = user.password;
*
* DaoTemplate::update(sql, params);
*
* 比较常用的方法有:
* insert
* update: 包括更新和删除
*
* selectMap
* selectMaps
* selectBean
* selectBeans
* selectStrings
*/
#include "UtilityGlobal.h"
// #ifdef __cplusplus
// extern"C"{
// #endif
struct UTILITY_API QuerySQL
{
QString sql;
QVariantMap params;
};
class UTILITY_API DBUtil {
public:
/**
* 执行插入语句
*
* @param sql
* @param params
* @return 如没有错误返回 true 有错误返回 false.
*/
static bool insert(const QString &db,const QString &sql, const QVariantMap &params = QVariantMap());
/**
* 执行更新语句 (update 和 delete 语句都是更新语句).
*
* @param sql
* @param params
* @return 如没有错误返回 true 有错误返回 false.
*/
static bool update(const QString& db, const QString &sql, const QVariantMap &params = QVariantMap());
/**
* 执行查询语句,查询到一条记录,并把其映射成 map: key 是列名value 是列值.
*
* @param sql
* @param params
* @return 返回记录映射的 map.
*/
static QVariantMap selectMap(const QString db, const QString &sql, const QVariantMap params = QVariantMap());
/**
* 执行查询语句,查询到多条记录,并把每一条记录其映射成一个 mapKey 是列名Value 是列值.
* 所有的 map 都放在 list 里。
*
* @param sql
* @param params
* @return 返回记录映射的 map 的 list.
*/
static QList<QVariantMap> selectMaps(const QString db, const QString sql, const QVariantMap params = QVariantMap());
/**
* 查询结果是一个整数值,如查询记录的个数、和等.
*
* @param result
* @param sql
* @param params
* @return 返回 int
*/
static int selectInt(const QString& db, const QString &sql, const QVariantMap &params = QVariantMap());
/**
* 查询结果是一个长整数值, 如果返回的是时间戳时很方便.
*
* @param result
* @param sql
* @param params
* @return 返回长整数
*/
static qint64 selectInt64(const QString& db, const QString &sql, const QVariantMap &params = QVariantMap());
/**
* 查询结果是一个字符串.
* @param str
* @param sql
* @param params
* @return 返回字符串
*/
static QString selectString(const QString& db, const QString &sql, const QVariantMap &params = QVariantMap());
/**
* 查询结果是多个字符串.
*
* @param strs
* @param sql
* @param params
* @return 返回 string list.
*/
static QStringList selectStrings(const QString& db, const QString &sql, const QVariantMap &params = QVariantMap());
/**
* 查询结果是一个日期类型.
*
* @param date
* @param sql
* @param params
* @return 返回 date
*/
static QDate selectDate(const QString& db, const QString &sql, const QVariantMap &params = QVariantMap());
/**
* 查询结果是一个日期时间类型.
*
* @param date
* @param sql
* @param params
* @return 返回 date time
*/
static QDateTime selectDateTime(const QString& db, const QString &sql, const QVariantMap &params = QVariantMap());
/**
* 查询结果是一个 QVariant.
*
* @param str
* @param sql
* @param params
* @return 返回 variant
*/
static QVariant selectVariant(const QString& db, const QString &sql, const QVariantMap &params = QVariantMap());
/**
* 查询结果封装成一个对象 bean.
*
* @param sql
* @param mapToBean - 把 map 映射成对象的函数.
* @return 返回查找到的 bean, 如果没有查找到,返回 T 的默认对象,其 id 最好是 -1这样便于有效的对象区别。
*/
template <typename T>
static T selectBean(T mapToBean(const QVariantMap& rowMap), const QString& db, const QString& sql, const QVariantMap& params = QVariantMap()) {
// 把 map 都映射成一个 bean 对象
return mapToBean(selectMap(db, sql, params));
}
/**
* 执行查询语句,查询到多个结果并封装成 bean 的 list.
*
* @param sql
* @param params
* @param mapToBean - 把 map 映射成 bean 对象函数.
* @return 返回 bean 的 list如果没有查找到返回空的 list.
*/
template<typename T>
static QList<T> selectBeans(T mapToBean(const QVariantMap& rowMap), const QString& db, const QString& sql, const QVariantMap& params = QVariantMap()) {
QList<T> beans;
// 每一个 map 都映射成一个 bean 对象
foreach (const QVariantMap &row, selectMaps(db, sql, params)) {
beans.append(mapToBean(row));
}
return beans;
}
/**
* 使用事务的方式进行一系列的操作暂不支持select输出,只支持一个db
*
* @param query_list sql语句列表
*/
static bool transationSql(const QString& db, const QList<QuerySQL>& query_list);
/*判断表格是否存在*/
static bool has_existed_table(const QString& db, const QString &tn);
static bool has_existed_table_db(const QSqlDatabase& db, const QString &tn);
/*删除表*/
static bool remove_table(const QString& db, const QString& tn);
static bool remove_table_db(const QSqlDatabase& db, const QString& tn);
/* 清空表数据 */
static bool clear_table_db(const QSqlDatabase& db, const QString& tn);
static void disConnection(const QString &dbName);
private:
/**
* 定义了访问数据库算法的骨架SQL 语句执行的结果使用传进来的 Lambda 表达式处理
*
* @param sql
* @param params
* @param fn - 处理 SQL 语句执行的结果的 Lambda 表达式
*/
static void executeSql(const QString& db, const QString &sql, const QVariantMap &params, std::function<void(QSqlQuery *query)> fn);
/**
* 取得 query 的 labels (没用别名就是数据库里的列名).
*
* @param query
* @return string list.
*/
static QStringList getFieldNames(const QSqlQuery &query);
/**
* 把 map 中的 key 和 value 绑定到 query 里.
*
* @param query
* @param params
*/
static void bindValues(QSqlQuery *query, const QVariantMap &params);
/**
* 把 query 中的查询得到的所有行映射为 map 的 list.
*
* @param query
* @return 返回 key 为列名,值为列的值的 map 的 list.
*/
static QList<QVariantMap> queryToMaps(QSqlQuery *query);
/**
* 如果 config.json 里 database.debug 为 true则输出执行的 SQL如果为 false则不输出.
* @param query
*/
static void debug(const QSqlQuery &query, const QVariantMap &params);
};
// #ifdef __cplusplus
// }
// #endif
#endif // DBUTIL_H