├── User ├── precompiled.h ├── user.cpp ├── user.h ├── User.pro ├── export.h ├── main.cpp └── User.pro.user └── README.md /User/precompiled.h: -------------------------------------------------------------------------------- 1 | /**************************************** 2 | * @file Precompiled 3 | * @brief 用于提高编译速度 4 | * @author Waleon 5 | * @wechat 微信公众号:高效程序员 6 | * @date 2020/02/07 7 | ****************************************/ 8 | 9 | #ifndef PRECOMPILED_H 10 | #define PRECOMPILED_H 11 | 12 | #include 13 | #include "export.h" 14 | 15 | #endif // PRECOMPILED_H 16 | -------------------------------------------------------------------------------- /User/user.cpp: -------------------------------------------------------------------------------- 1 | #include "precompiled.h" 2 | #include "user.h" 3 | #include 4 | 5 | QX_REGISTER_CPP_USER(User) 6 | 7 | namespace qx { 8 | template <> void register_class(QxClass & t) 9 | { 10 | // 注册 User::id <=> 数据库中的主键 11 | t.id(&User::id, "id"); 12 | 13 | // 注册 User::name 属性,使用的 key 是 name,version 是 1。 14 | t.data(&User::name, "name", 1); 15 | 16 | // 注册 User::age 属性,使用的 key 是 age。 17 | t.data(&User::age, "age"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /User/user.h: -------------------------------------------------------------------------------- 1 | /**************************************** 2 | * @file User 3 | * @brief 对应的是数据库中的 User 表 4 | * @author Waleon 5 | * @wechat 微信公众号:高效程序员 6 | * @date 2020/02/07 7 | ****************************************/ 8 | 9 | #ifndef USER_H 10 | #define USER_H 11 | 12 | class USER_DLL_EXPORT User 13 | { 14 | public: 15 | User() : id(0) { } 16 | virtual ~User() { } 17 | 18 | long id; 19 | QString name; 20 | int age; 21 | }; 22 | 23 | QX_REGISTER_HPP_USER(User, qx::trait::no_base_class_defined, 1) 24 | 25 | #endif // USER_H 26 | -------------------------------------------------------------------------------- /User/User.pro: -------------------------------------------------------------------------------- 1 | # QxOrm 的通用配置,包含了 Qt 和 boost 库依赖 2 | include($$PWD/../../QxOrm/QxOrm.pri) 3 | 4 | CONFIG += console 5 | DEFINES += _BUILDING_USER 6 | 7 | # 预编译头文件 8 | !contains(DEFINES, _QX_NO_PRECOMPILED_HEADER) { 9 | PRECOMPILED_HEADER = precompiled.h 10 | } 11 | 12 | # QxOrm 库相关配置 13 | INCLUDEPATH += $$PWD/../../QxOrm/include 14 | LIBS += -L$$PWD/../../QxOrm/lib 15 | 16 | # 设置生成的目标名称、添加依赖库 17 | CONFIG(debug, debug|release) { 18 | TARGET = Userd 19 | LIBS += -lQxOrmd 20 | } else { 21 | TARGET = User 22 | LIBS += -lQxOrm 23 | } 24 | 25 | # 文件列表 26 | HEADERS += \ 27 | precompiled.h \ 28 | export.h \ 29 | user.h 30 | 31 | SOURCES += \ 32 | main.cpp \ 33 | user.cpp 34 | -------------------------------------------------------------------------------- /User/export.h: -------------------------------------------------------------------------------- 1 | /**************************************** 2 | * @file Export 3 | * @brief 管理类、函数 ... 的导出/导入。 4 | * @author Waleon 5 | * @wechat 微信公众号:高效程序员 6 | * @date 2020/02/07 7 | ****************************************/ 8 | 9 | 10 | #ifndef EXPORT_H 11 | #define EXPORT_H 12 | 13 | #ifdef _BUILDING_USER 14 | #define USER_DLL_EXPORT QX_DLL_EXPORT_HELPER 15 | #else 16 | #define USER_DLL_EXPORT QX_DLL_IMPORT_HELPER 17 | #endif 18 | 19 | #ifdef _BUILDING_USER 20 | #define QX_REGISTER_HPP_USER QX_REGISTER_HPP_EXPORT_DLL 21 | #define QX_REGISTER_CPP_USER QX_REGISTER_CPP_EXPORT_DLL 22 | #else 23 | #define QX_REGISTER_HPP_USER QX_REGISTER_HPP_IMPORT_DLL 24 | #define QX_REGISTER_CPP_USER QX_REGISTER_CPP_IMPORT_DLL 25 | #endif 26 | 27 | #endif // EXPORT_H 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | QxOrm使用教程(ORM for C++ 对象关系映射) 2 | 3 | QxOrm 几乎支持所有的主流数据库,比如 SQLite、MySQL、PostgreSQL、Oracle、MS SQL Server、MongoDB 等。为了快速了解它的用法,我们以 SQLite 为例,来介绍一些常见的数据库操作(例如:增删改查) 4 | 5 | [QxOrm使用教程(ORM for C++ 对象关系映射)](https://www.ljjyy.com/archives/2021/03/100647.html) 6 | 7 | QxOrm 是一个 C++ 库,旨在为 C++/Qt 开发人员提供对象关系映射(ORM)功能(类似于 Java 中的 Hibernate,.Net 中的 NHibernate)。 8 | 9 | - **主页:**http://www.qxorm.com/qxorm_en/home.html 10 | - **下载:**http://www.qxorm.com/qxorm_en/download.html 11 | - **手册:**http://www.qxorm.com/qxorm_en/manual.html 12 | - **在线类文档:**http://www.qxorm.com/doxygen/html/index.html 13 | - **GitHub:**https://github.com/QxOrm/QxOrm 14 | 15 | 其主要特性包括: 16 | 17 | - 持久性:支持最常见的数据库,如 SQLite、MySQL、PostgreSQL、Oracle、MS SQL Server、MongoDB(具有 1-1、1-n、n-1 和 n-n 关系)。 18 | - 序列化:JSON、二进制和 XML 格式。 19 | - 反射(或内省):动态访问类定义、检索属性和调用类方法。 20 | - HTTP Web Server:独立的多线程 HTTP 1.1 web 服务器(支持 SSL/TLS、持久连接、cookie、会话、分块响应、URL 分发器/路由)。 21 | - JSON API:与 C++/Qt 以外的其他技术的互操作性(REST web 服务、QML 应用程序、脚本语言)。 22 | 23 | 默认情况下,QxOrm 库只依赖 QtCore 和 QtSql 模块。如果启用 QxOrm HTTP web server 特性,那么还将依赖于 QtNetwork 模块。除此之外,有些特性还需要依赖 boost(默认禁用)。 24 | 25 | -------------------------------------------------------------------------------- /User/main.cpp: -------------------------------------------------------------------------------- 1 | #include "precompiled.h" 2 | #include "user.h" 3 | #include 4 | 5 | int main(int argc, char *argv[]) 6 | { 7 | QCoreApplication a(argc, argv); 8 | 9 | // 初始化参数,用于和数据库交互 10 | qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE"); 11 | qx::QxSqlDatabase::getSingleton()->setDatabaseName("./Users.db"); 12 | qx::QxSqlDatabase::getSingleton()->setHostName("localhost"); 13 | qx::QxSqlDatabase::getSingleton()->setUserName("root"); 14 | qx::QxSqlDatabase::getSingleton()->setPassword(""); 15 | 16 | // 在数据库中创建 User 表 17 | QSqlError daoError = qx::dao::create_table(); 18 | 19 | // 创建 3 个用户 20 | // 可以使用 std 和 Qt 智能指针:std::shared_ptr、QSharedPointer 等... 21 | typedef QSharedPointer UserPtr; 22 | UserPtr u1; 23 | u1.reset(new User()); 24 | u1->name = "Jack Ma"; 25 | u1->age = 30; 26 | 27 | UserPtr u2; 28 | u2.reset(new User()); 29 | u2->name = "Pony"; 30 | u2->age = 25; 31 | 32 | UserPtr u3; 33 | u3.reset(new User()); 34 | u3->name = "Rose"; 35 | u3->age = 18; 36 | 37 | // 将所有用户插入容器中 38 | // 可以使用 std、boost、Qt 和 qx::QxCollection 中的许多容器 39 | typedef QVector VectorUser; 40 | VectorUser users; 41 | users.push_back(u1); 42 | users.push_back(u2); 43 | users.push_back(u3); 44 | 45 | // 将容器中的所有用户插入到数据库中 46 | // p1、p2、p3 的 id 属性会自动更新 47 | daoError = qx::dao::insert(users); 48 | 49 | // 修改第二个用户的信息,并更新到数据库中 50 | u2->name = "Pony modified"; 51 | u2->age = 38; 52 | daoError = qx::dao::update(u2); 53 | 54 | // 从数据库中删除第一个用户 55 | daoError = qx::dao::delete_by_id(u1); 56 | 57 | // 计算用户的数量 58 | long userCount = qx::dao::count(); 59 | qDebug() << "User Count: " << userCount; 60 | 61 | // 将 id 为 3 的用户取出,并传给一个新变量 62 | UserPtr userTmp; 63 | userTmp.reset(new User()); 64 | userTmp->id = 3; 65 | daoError = qx::dao::fetch_by_id(userTmp); 66 | qDebug() << "User Tmp: " << userTmp->id << userTmp->name << userTmp->age; 67 | 68 | #if _QX_SERIALIZE_XML 69 | // 将容器中的用户导出到 XML 文件中(序列化) 70 | qx::serialization::xml::to_file(users, "./export_users.xml"); 71 | 72 | // 将 XML 中的用户导入至新容器 73 | VectorUser usersXmlTmp; 74 | qx::serialization::xml::from_file(usersXmlTmp, "./export_users.xml"); 75 | #endif 76 | 77 | #ifndef _QX_NO_JSON 78 | // 将容器中的用户导出到 Json 文件中(序列化) 79 | qx::serialization::json::to_file(users, "./export_users.json"); 80 | 81 | // 将 Json 文件中的用户导入至新容器 82 | VectorUser usersJsonTmp; 83 | qx::serialization::json::from_file(usersJsonTmp, "./export_users.json"); 84 | #endif 85 | 86 | // 克隆一个用户 87 | UserPtr uClone = qx::clone_to_qt_shared_ptr(*u1); 88 | qDebug() << "Clone from u1: " << uClone->id << uClone->name << uClone->age; 89 | 90 | // 按类名(factory)创建新用户 91 | qx::any uAny = qx::create("User"); 92 | 93 | // 将用户插入到 qx::cache 94 | qx::cache::set("users", users); 95 | 96 | // 从 qx::cache 中删除所有元素 97 | qx::cache::clear(); 98 | 99 | // 内存泄漏 100 | User *user = new User(); 101 | 102 | return a.exec(); 103 | } 104 | -------------------------------------------------------------------------------- /User/User.pro.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | EnvironmentId 7 | {c4da1889-17ad-47a8-bddc-cd90da2180db} 8 | 9 | 10 | ProjectExplorer.Project.ActiveTarget 11 | 0 12 | 13 | 14 | ProjectExplorer.Project.EditorSettings 15 | 16 | true 17 | false 18 | true 19 | 20 | Cpp 21 | 22 | CppGlobal 23 | 24 | 25 | 26 | QmlJS 27 | 28 | QmlJSGlobal 29 | 30 | 31 | 32 | Nim 33 | 34 | NimGlobal 35 | 36 | 37 | 3 38 | UTF-8 39 | false 40 | 4 41 | false 42 | 80 43 | true 44 | true 45 | 1 46 | true 47 | false 48 | 0 49 | true 50 | true 51 | 0 52 | 8 53 | true 54 | 2 55 | true 56 | true 57 | true 58 | *.md, *.MD, Makefile 59 | false 60 | true 61 | 62 | 63 | 64 | ProjectExplorer.Project.PluginSettings 65 | 66 | 67 | true 68 | true 69 | true 70 | true 71 | true 72 | 73 | 74 | 0 75 | true 76 | 77 | -fno-delayed-template-parsing 78 | 79 | true 80 | Builtin.Questionable 81 | 82 | true 83 | Builtin.DefaultTidyAndClazy 84 | 4 85 | 86 | 87 | 88 | true 89 | 90 | 91 | 92 | 93 | ProjectExplorer.Project.Target.0 94 | 95 | Desktop 96 | Desktop Qt 5.15.1 MSVC2019 64bit 97 | Desktop Qt 5.15.1 MSVC2019 64bit 98 | qt.qt5.5151.win64_msvc2019_64_kit 99 | 1 100 | 0 101 | 0 102 | 103 | true 104 | 0 105 | C:\d\mmm\qt\QxOrm\QxOrm-project\build-User-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug 106 | C:/d/mmm/qt/QxOrm/QxOrm-project/build-User-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug 107 | 108 | 109 | true 110 | QtProjectManager.QMakeBuildStep 111 | 112 | false 113 | 114 | 115 | 116 | true 117 | Qt4ProjectManager.MakeStep 118 | 119 | false 120 | 121 | 122 | false 123 | 124 | 2 125 | Build 126 | Build 127 | ProjectExplorer.BuildSteps.Build 128 | 129 | 130 | 131 | true 132 | Qt4ProjectManager.MakeStep 133 | 134 | true 135 | clean 136 | 137 | false 138 | 139 | 1 140 | Clean 141 | Clean 142 | ProjectExplorer.BuildSteps.Clean 143 | 144 | 2 145 | false 146 | 147 | 148 | Debug 149 | Qt4ProjectManager.Qt4BuildConfiguration 150 | 2 151 | 2 152 | 2 153 | 154 | 155 | true 156 | 2 157 | C:\d\mmm\qt\QxOrm\QxOrm-project\build-User-Desktop_Qt_5_15_1_MSVC2019_64bit-Release 158 | C:/d/mmm/qt/QxOrm/QxOrm-project/build-User-Desktop_Qt_5_15_1_MSVC2019_64bit-Release 159 | 160 | 161 | true 162 | QtProjectManager.QMakeBuildStep 163 | 164 | false 165 | 166 | 167 | 168 | true 169 | Qt4ProjectManager.MakeStep 170 | 171 | false 172 | 173 | 174 | false 175 | 176 | 2 177 | Build 178 | Build 179 | ProjectExplorer.BuildSteps.Build 180 | 181 | 182 | 183 | true 184 | Qt4ProjectManager.MakeStep 185 | 186 | true 187 | clean 188 | 189 | false 190 | 191 | 1 192 | Clean 193 | Clean 194 | ProjectExplorer.BuildSteps.Clean 195 | 196 | 2 197 | false 198 | 199 | 200 | Release 201 | Qt4ProjectManager.Qt4BuildConfiguration 202 | 0 203 | 0 204 | 2 205 | 206 | 207 | true 208 | 0 209 | C:\d\mmm\qt\QxOrm\QxOrm-project\build-User-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile 210 | C:/d/mmm/qt/QxOrm/QxOrm-project/build-User-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile 211 | 212 | 213 | true 214 | QtProjectManager.QMakeBuildStep 215 | 216 | false 217 | 218 | 219 | 220 | true 221 | Qt4ProjectManager.MakeStep 222 | 223 | false 224 | 225 | 226 | false 227 | 228 | 2 229 | Build 230 | Build 231 | ProjectExplorer.BuildSteps.Build 232 | 233 | 234 | 235 | true 236 | Qt4ProjectManager.MakeStep 237 | 238 | true 239 | clean 240 | 241 | false 242 | 243 | 1 244 | Clean 245 | Clean 246 | ProjectExplorer.BuildSteps.Clean 247 | 248 | 2 249 | false 250 | 251 | 252 | Profile 253 | Qt4ProjectManager.Qt4BuildConfiguration 254 | 0 255 | 0 256 | 0 257 | 258 | 3 259 | 260 | 261 | 0 262 | Deploy 263 | Deploy 264 | ProjectExplorer.BuildSteps.Deploy 265 | 266 | 1 267 | 268 | false 269 | ProjectExplorer.DefaultDeployConfiguration 270 | 271 | 1 272 | 273 | 274 | dwarf 275 | 276 | cpu-cycles 277 | 278 | 279 | 250 280 | 281 | -e 282 | cpu-cycles 283 | --call-graph 284 | dwarf,4096 285 | -F 286 | 250 287 | 288 | -F 289 | true 290 | 4096 291 | false 292 | false 293 | 1000 294 | 295 | true 296 | 297 | false 298 | false 299 | false 300 | false 301 | true 302 | 0.01 303 | 10 304 | true 305 | kcachegrind 306 | 1 307 | 25 308 | 309 | 1 310 | true 311 | false 312 | true 313 | valgrind 314 | 315 | 0 316 | 1 317 | 2 318 | 3 319 | 4 320 | 5 321 | 6 322 | 7 323 | 8 324 | 9 325 | 10 326 | 11 327 | 12 328 | 13 329 | 14 330 | 331 | 332 | 2 333 | 334 | Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/QxOrm/QxOrm-project/User/User.pro 335 | C:/d/mmm/qt/QxOrm/QxOrm-project/User/User.pro 336 | 337 | false 338 | 339 | false 340 | true 341 | true 342 | false 343 | false 344 | true 345 | 346 | C:/d/mmm/qt/QxOrm/QxOrm-project/build-User-Desktop_Qt_5_15_1_MSVC2019_64bit-Release 347 | 348 | 1 349 | 350 | 351 | 352 | ProjectExplorer.Project.TargetCount 353 | 1 354 | 355 | 356 | ProjectExplorer.Project.Updater.FileVersion 357 | 22 358 | 359 | 360 | Version 361 | 22 362 | 363 | 364 | --------------------------------------------------------------------------------