<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • 使用C++的ORM框架QxORM

    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");

      一氣呵成,大功告成。各位很簡單吧

     

    posted @ 2022-06-26 09:23  李濤賢賢  閱讀(216)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看