#ifndef DBUTIL_H #define DBUTIL_H #include #include #include #include #include /** * 封装了一些操作数据库的通用方法,例如插入、更新操作、查询结果返回整数、时间类型, * 还可以把查询结果映射成 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 ¶ms = QVariantMap()); /** * 执行更新语句 (update 和 delete 语句都是更新语句). * * @param sql * @param params * @return 如没有错误返回 true, 有错误返回 false. */ static bool update(const QString& db, const QString &sql, const QVariantMap ¶ms = QVariantMap()); /** * 执行查询语句,查询到一条记录,并把其映射成 map: key 是列名,value 是列值. * * @param sql * @param params * @return 返回记录映射的 map. */ static QVariantMap selectMap(const QString db, const QString &sql, const QVariantMap params = QVariantMap()); /** * 执行查询语句,查询到多条记录,并把每一条记录其映射成一个 map,Key 是列名,Value 是列值. * 所有的 map 都放在 list 里。 * * @param sql * @param params * @return 返回记录映射的 map 的 list. */ static QList 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 ¶ms = QVariantMap()); /** * 查询结果是一个长整数值, 如果返回的是时间戳时很方便. * * @param result * @param sql * @param params * @return 返回长整数 */ static qint64 selectInt64(const QString& db, const QString &sql, const QVariantMap ¶ms = QVariantMap()); /** * 查询结果是一个字符串. * @param str * @param sql * @param params * @return 返回字符串 */ static QString selectString(const QString& db, const QString &sql, const QVariantMap ¶ms = QVariantMap()); /** * 查询结果是多个字符串. * * @param strs * @param sql * @param params * @return 返回 string list. */ static QStringList selectStrings(const QString& db, const QString &sql, const QVariantMap ¶ms = QVariantMap()); /** * 查询结果是一个日期类型. * * @param date * @param sql * @param params * @return 返回 date */ static QDate selectDate(const QString& db, const QString &sql, const QVariantMap ¶ms = QVariantMap()); /** * 查询结果是一个日期时间类型. * * @param date * @param sql * @param params * @return 返回 date time */ static QDateTime selectDateTime(const QString& db, const QString &sql, const QVariantMap ¶ms = QVariantMap()); /** * 查询结果是一个 QVariant. * * @param str * @param sql * @param params * @return 返回 variant */ static QVariant selectVariant(const QString& db, const QString &sql, const QVariantMap ¶ms = QVariantMap()); /** * 查询结果封装成一个对象 bean. * * @param sql * @param mapToBean - 把 map 映射成对象的函数. * @return 返回查找到的 bean, 如果没有查找到,返回 T 的默认对象,其 id 最好是 -1,这样便于有效的对象区别。 */ template 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 static QList selectBeans(T mapToBean(const QVariantMap& rowMap), const QString& db, const QString& sql, const QVariantMap& params = QVariantMap()) { QList 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& 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 ¶ms, std::function 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 ¶ms); /** * 把 query 中的查询得到的所有行映射为 map 的 list. * * @param query * @return 返回 key 为列名,值为列的值的 map 的 list. */ static QList queryToMaps(QSqlQuery *query); /** * 如果 config.json 里 database.debug 为 true,则输出执行的 SQL,如果为 false,则不输出. * @param query */ static void debug(const QSqlQuery &query, const QVariantMap ¶ms); }; // #ifdef __cplusplus // } // #endif #endif // DBUTIL_H