1015.利用QxOrm庫操作數據庫示例代碼

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 項目配置上需要注意點

項目結構如下
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章