QxOrm 示例代碼
承接上一遍的QxOrm框架開發環境搭建,本篇幅梳理一下QxOrm示例,互聯網資料並不多,主要還是在參考官方示例代碼的基礎上,寫了本篇的示例小demo.
1 ORM介紹
對象關係映射(Object Relational Mapping,簡稱ORM) 是通過使用描述對象和數據庫之間映射的元數據,將面嚮對象語言程序中的對象自動持久化到關係數據庫中。本質上就是將數據從一種形式轉換到另外一種形式。 這也同時暗示着額外的執行開銷;然而,如果ORM作爲一種中間件實現,則會有很多機會做優化,而這些在手寫的持久層並不存在。 更重要的是用於控制轉換的元數據需要提供和管理;但是同樣,這些花費要比維護手寫的方案要少;而且就算是遵守ODMG規範的對象數據庫依然需要類級別的元數據。
2 定義產品類product
product.h 頭文件如下
#pragma once
#include <QString>
#include <QxOrm_Impl.h>
#include "precompiled.h"
/**
* 自定義一個產品類.add by xhome 2020/3/11
* QX_PRODUCT_DLL_EXPORT 導出符號必須存在,因爲我們自定義的類需要給dao層調用.
*/
class QX_PRODUCT_DLL_EXPORT product {
public:
long id; //id
QString name; //名稱
QString description; //描述
product():id(0) { ; }
virtual ~product() { ; }
};
QX_REGISTER_HPP_QX_PRODUCT(product, qx::trait::no_base_class_defined, 0)
typedef std::shared_ptr<product> product_ptr;
typedef std::vector<product_ptr> list_product;
product.cpp 文件如下
#include <QxOrm_Impl.h>
#include "product.h"
#include "precompiled.h"
//
//註冊cpp 類
namespace qx {
template <> void register_class(QxClass<product> & t)
{
//生成表結構schema, 創建表格時回調使用.
t.id(&product::id, "id", 0);
t.data(&product::name, "name", 0);
t.data(&product::description, "desc", 0);
}
}
3 預編譯頭文件與導出庫
export.h 文件如下
#pragma once
#ifdef _BUILDING_QX_PRODUCT
#define QX_PRODUCT_DLL_EXPORT QX_DLL_EXPORT_HELPER
#else // _BUILDING_QX_BLOG
#define QX_PRODUCT_DLL_EXPORT QX_DLL_IMPORT_HELPER
#endif // _BUILDING_QX_BLOG
#ifdef _BUILDING_QX_PRODUCT
#define QX_REGISTER_HPP_QX_PRODUCT QX_REGISTER_HPP_EXPORT_DLL
#define QX_REGISTER_CPP_QX_PRODUCT QX_REGISTER_CPP_EXPORT_DLL
#else // _BUILDING_QX_PRODUCT
#define QX_REGISTER_HPP_QX_PRODUCT QX_REGISTER_HPP_IMPORT_DLL
#define QX_REGISTER_CPP_QX_PRODUCT QX_REGISTER_CPP_IMPORT_DLL
#endif // _BUILDING_QX_PRODUCT
precompiled.h 文件如下
#pragma once
#include "export.h"
#include <QxOrm.h>
4 主函數簡單調用
main.cpp 文件如下
#include "testQxORM.h"
#include <QtWidgets/QApplication>
#include <QStringLiteral>
#include <QxOrm_Impl.h>
#include "product.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFile::remove("./product.sqlite");
// Parameters to connect to database
qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
qx::QxSqlDatabase::getSingleton()->setDatabaseName("./product.sqlite");
qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
qx::QxSqlDatabase::getSingleton()->setUserName("root");
qx::QxSqlDatabase::getSingleton()->setPassword("");
qx::QxSqlDatabase::getSingleton()->setFormatSqlQueryBeforeLogging(true);
qx::QxSqlDatabase::getSingleton()->setDisplayTimerDetails(true);
// Only for debug purpose : assert if invalid offset detected fetching a relation
qx::QxSqlDatabase::getSingleton()->setVerifyOffsetRelation(true);
//創建數據庫表.
QSqlError daoError = qx::dao::create_table<product>();
product_ptr product_1;
product_ptr product_2;
//智能指針託管.將普通指針轉換爲智能指針,由系統進行維護管理.
product_1.reset(new product());
product_1->id = 1;
product_1->name = QStringLiteral("蘋果");
product_1->description = QStringLiteral("熟透了的紅蘋果");
product_2.reset(new product());
product_2->id = 2;
product_2->name = QStringLiteral("香蕉");
product_2->description = QStringLiteral("很新鮮的香蕉");
list_product productX;
productX.push_back(product_1);
productX.push_back(product_2);
daoError = qx::dao::insert(productX);
return 0;
}
5 運行效果圖
運行程序生成數據庫product.sqlite ,通過navcat 軟件查看數據表如下效果.
6 項目配置上需要注意點
項目結構如下