使用C++的ORM框架QxORM詳解
QxORM中,我們用的最多的無(wú)非是這兩點(diǎn)
官方表述是這樣的:
持久性:支持最常見(jiàn)的數(shù)據(jù)庫(kù),如SQLite、MySQL、PostgreSQL、Oracle、MS SQL Server、MongoDB(具有 1-1、1-n、n-1 和 n-n 關(guān)系);
序列化:JSON、二進(jìn)制和 XML 格式;
簡(jiǎn)潔一點(diǎn)就是:
連接訪(fǎng)問(wèn)各類(lèi)主流數(shù)據(jù)庫(kù)
能夠?qū)?shù)據(jù)導(dǎo)入導(dǎo)出
下面我們進(jìn)入主題:
第一步:建立對(duì)象模型。相對(duì)于常規(guī)的結(jié)構(gòu)體,只是多了一些宏定義與聲明。
頭文件:QxModels.h
#include "precompiled.h" /*************************************************************** * @projectName pluqt * @brief 自定義ORM模型 * @author lzw * @date 2022-01-04 ***************************************************************/ struct User { long id; QString name; int age; QString hobbies; }; QX_REGISTER_HPP_QX_DLL1(User, qx::trait::no_base_class_defined, 1)
源文件:QxModels.cpp
#include "precompiled.h" #include "qxmodels.h" #include <QxOrm_Impl.h> QX_REGISTER_CPP_QX_DLL1(User) namespace qx { template <> void register_class(QxClass<User> & t) { // 設(shè)置表名 t.setName("User"); // 注冊(cè) User::id <=> 數(shù)據(jù)庫(kù)中的主鍵 t.id(&User::id, "id"); // 注冊(cè) User::name 屬性,使用的 key 是 name,version 是 1。 t.data(&User::name, "name", 1); // 注冊(cè) User::age 屬性,使用的 key 是 age。 t.data(&User::age, "age"); // 注冊(cè) User::hobbies 屬性,使用的 key 是 hobbies。 t.data(&User::hobbies, "hobbies"); } }
第二步:連接數(shù)據(jù)庫(kù)。
QString in_db = QCoreApplication::applicationDirPath(); in_db.append("/database/plulocal.db"); QFile::remove(in_db); qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE"); qx::QxSqlDatabase::getSingleton()->setDatabaseName(in_db); qx::QxSqlDatabase::getSingleton()->setHostName("localhost"); qx::QxSqlDatabase::getSingleton()->setUserName("root"); qx::QxSqlDatabase::getSingleton()->setPassword(""); qx::QxSqlDatabase::getSingleton()->setSqlPlaceHolderStyle(qx::QxSqlDatabase::ph_style_2_point_name); qx::QxSqlDatabase::getSingleton()->setTraceSqlQuery(true); qx::QxSqlDatabase::getSingleton()->setTraceSqlRecord(false);
第三步:使用ORM。建表,新增,簡(jiǎn)單查詢(xún),復(fù)雜查詢(xún)等等
// 建表 QSqlError daoError1 = qx::dao::create_table<User>(); // 產(chǎn)生100條模擬數(shù)據(jù) for(int in_idx=0; in_idx<100; ++in_idx) { auto in_user = new User(); in_user->name = "lzw"+QString::number(in_idx); in_user->age = 20+in_idx; in_user->hobbies = "play"; auto daoError1 = qx::dao::insert(in_user); } // 查詢(xún)單條記錄 User in_pointUser; in_pointUser.id = 3; qDebug()<<in_pointUser.name; QSqlError daoError11 = qx::dao::fetch_by_id(in_pointUser); qDebug()<<in_pointUser.name; // 查詢(xún)一定年齡段的集合記錄 //typedef std::shared_ptr<User> UserPtr; //typedef qx::QxCollection<long, UserPtr> UserList; UserList in_userList; qx_query in_query("select * from user where age>=20 and age<=25"); daoError11 = qx::dao::execute_query(in_query, in_userList); qAssert(! daoError11.isValid()); qAssert(in_userList.count() > 0); qx::dump(in_userList);
有圖有真相。執(zhí)行前:
執(zhí)行后:(并不需要寫(xiě)一條sql語(yǔ)句,當(dāng)然也支持寫(xiě)原生sql語(yǔ)句)
補(bǔ)充:序列化的兩個(gè)函數(shù)
// 導(dǎo)出binary流 qx::serialization::qt::to_file(in_pointUser, "user.txt"); // 導(dǎo)出json文本 qx::serialization::json::to_file(in_userList, "list_of_user.json");
一氣呵成,大功告成。各位很簡(jiǎn)單吧
到此這篇關(guān)于使用C++的ORM框架QxORM的文章就介紹到這了,更多相關(guān)C++ QxORM內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 好用的C++ string Format“函數(shù)”介紹
- C++ normal_distribution高斯正態(tài)分布函數(shù)的用法示例
- C/C++實(shí)現(xiàn)對(duì)STORM運(yùn)行信息查看及控制的方法
- C++實(shí)現(xiàn)教職工信息管理系統(tǒng)課程設(shè)計(jì)
- C++實(shí)現(xiàn)職工工資管理系統(tǒng)課程設(shè)計(jì)
- C++實(shí)現(xiàn)地鐵自動(dòng)售票系統(tǒng)程序設(shè)計(jì)
- C++設(shè)計(jì)與實(shí)現(xiàn)ORM系統(tǒng)實(shí)例詳解
相關(guān)文章
C語(yǔ)言 數(shù)據(jù)類(lèi)型詳細(xì)介紹
本文主要講解C語(yǔ)言 數(shù)據(jù)類(lèi)型,這里整理了詳細(xì)的數(shù)據(jù)類(lèi)型的資料,希望能幫助剛剛開(kāi)始學(xué)習(xí)C語(yǔ)言的同學(xué)2016-08-08C語(yǔ)言去除相鄰重復(fù)字符函數(shù)的實(shí)現(xiàn)方法
這篇文章主要介紹了C語(yǔ)言去除相鄰重復(fù)字符函數(shù)的實(shí)現(xiàn)方法的相關(guān)資料,實(shí)現(xiàn)去重字符串相鄰重復(fù)的字符,不相鄰的不用去重的功能,需要的朋友可以參考下2017-08-08C++實(shí)現(xiàn)完整功能的通訊錄管理系統(tǒng)詳解
來(lái)了來(lái)了,通訊錄管理系統(tǒng)踏著七彩祥云飛來(lái)了,結(jié)合前面的結(jié)構(gòu)體知識(shí)和分文件編寫(xiě)方法,我總結(jié)并碼了一個(gè)帶菜單的通訊錄管理系統(tǒng),在這篇文章中將會(huì)提到C的清空屏幕函數(shù),嵌套結(jié)構(gòu)體具體實(shí)現(xiàn),簡(jiǎn)單且充實(shí),跟著我的思路,可以很清晰的解決這個(gè)項(xiàng)目2022-05-05C語(yǔ)言雙指針?biāo)惴ㄅ笥堰^(guò)情人節(jié)我過(guò)算法
這篇文章主要為大家介紹了C語(yǔ)言中雙指針?biāo)惴ǖ氖纠斀?,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02C++實(shí)現(xiàn)教職工管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)教職工管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C語(yǔ)言?xún)?nèi)嵌匯編API內(nèi)存搜索引擎實(shí)例
這篇文章主要介紹了C語(yǔ)言?xún)?nèi)嵌匯編API內(nèi)存搜索引擎實(shí)例,涉及匯編語(yǔ)言與內(nèi)存相關(guān)操作,需要的朋友可以參考下2014-10-10