ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

使用C++的ORM框架QxORM

2022-07-12 18:02:59  阅读:255  来源: 互联网

标签:QxORM QxSqlDatabase qx age getSingleton C++ userList ORM User


QxORM中,我们用的最多的无非是这两点

官方表述是这样的:

  持久性: 支持最常见的数据库,如 SQLite、MySQL、PostgreSQL、Oracle、MS SQL Server、MongoDB(具有 1-1、1-n、n-1 和 n-n 关系);
  序列化: JSON、二进制和 XML 格式;

简洁一点就是:

  连接访问各类主流数据库

  能够将数据导入导出

下面我们进入主题:

  第一步:建立对象模型。相对于常规的结构体,只是多了一些宏定义与声明。

  头文件: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)
    {
        // 设置表名
        t.setName("User");
        // 注册 User::id <=> 数据库中的主键
        t.id(&User::id, "id");
        // 注册 User::name 属性,使用的 key 是 name,version 是 1。
        t.data(&User::name, "name", 1);
        // 注册 User::age 属性,使用的 key 是 age。
        t.data(&User::age, "age");
        // 注册 User::hobbies 属性,使用的 key 是 hobbies。
        t.data(&User::hobbies, "hobbies");
    }
}
复制代码

  第二步:连接数据库。

复制代码
    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。建表,新增,简单查询,复杂查询等等

复制代码
    // 建表
    QSqlError daoError1 = qx::dao::create_table<User>();

    // 产生100条模拟数据
    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";

        daoError1 = qx::dao::insert(in_user);
    }

    // 查询单条记录【使用QxOrm】
    User in_pointUser; in_pointUser.id = 3;
    QSqlError daoError11 = qx::dao::fetch_by_id(in_pointUser);
    qDebug()<<in_pointUser.name;

    // 查询单条记录【写SQL】
    qx::QxSqlQuery in_query11("WHERE age = :age");
    in_query11.bind(":age", 20);
    daoError11 = qx::dao::fetch_by_query(in_query11, in_userList);
    qAssert(! daoError11.isValid()); qAssert(in_userList.count() > 0);
    qx::dump(in_userList);

    // 查询一定年龄段的集合记录【原生SQL】
    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);

    // 查询一定年龄段的集合记录【使用QxOrm】
    in_userList.clear();
    int age1 = 20, age2 = 25;
    qx_query in_query1; in_query1.where("age").isBetween(age1, age2);
    daoError11 = qx::dao::fetch_by_query(in_query1, in_userList);
    qAssert(! daoError11.isValid()); qAssert(in_userList.count() > 0);
    qx::dump(in_userList);
复制代码

  有图有真相。执行前:

 

 

  执行后:(并不需要写一条sql语句,当然也支持写原生sql语句)

 

   补充:序列化的两个函数

    // 导出binary流
    qx::serialization::qt::to_file(in_pointUser, "user.txt");
    // 导出json文本
    qx::serialization::json::to_file(in_userList, "list_of_user.json");

  一气呵成,大功告成。各位很简单吧    

 

转 https://www.cnblogs.com/Kevinsh-Lee/p/16412968.html

标签:QxORM,QxSqlDatabase,qx,age,getSingleton,C++,userList,ORM,User
来源: https://www.cnblogs.com/wl-blog/p/16471075.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有