基于QxOrm的Orm数据库基本操作

基于QxOrm的Orm数据库基本操作

前言

Orm:
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中

一、说明

Qxorm下载后在doc 文件下 有详细的安装配置说明,

基于QxOrm的Orm数据库基本操作
基于QxOrm的Orm数据库基本操作

本文基于Qt 、sqlite给出Qxorm的基本操作

DbBase:数据库类抽象
DbProcBase:数据库常用操作API封装,
TextOrmDB:业务数据库类,继承于DbBase
DbOrmPro:数据库管理类
DbBaseObj :数据库表对象类

; 二、基本操作

1.数据库DbBase

  • 数据库连接 ,连接参数QJsonObject传入
bool DbConnect( QString & error = QString() );

    bool DbBase::DbConnect(QString & error )
    {
        if (info_.isEmpty())
        {
            error = "db info empty";
            return false;
        }
        {
            auto type = info_["type"].toString();
            auto db = info_["db"].toString();
            *database_ = (QSqlDatabase::addDatabase(info_["type"].toString(), info_["db"].toString()));

            database_->setDatabaseName(info_["db"].toString());
            if (database_->isValid())
            {
                if (!database_->open())
                {
                    error = database_->lastError().text();
                    return false;
                }
            }
        }
        return true;
    }
  • 获取数据库
  QSharedPointer< QSqlDatabase> database_;
   DbBase::DbBase( )
   {
       database_ = QSharedPointer<QSqlDatabase>::create();
   }

   bool DbBase::DbGetName(QString & name, QString & error)
   {
       name = database_->databaseName();
       return  name.isEmpty();
   }

2.DbProcBase数据库操作API

  • 数据库操作对象传入
void SetDataBase(const QSharedPointer<QSqlDatabase> & database);
 - template<typename T>
    void DbProcBase<T>::SetDataBase(const QSharedPointer<QSqlDatabase> & database)
    {
        database_ = database;
    }
  • 表创建
    -qx::dao::create_table 函数
 -bool CreateDbTable(const QSharedPointer<T> & t , QString & error = QString());

    template<typename T>
    bool DbProcBase<T>::CreateDbTable(const QSharedPointer<T> & t, QString & error)
    {
        QSqlError sql_error = qx::dao::create_table<T>(database_.data());
        error = sql_error.text();
        return error.isEmpty();
    }

// 数据插入

bool AddData(const QSharedPointer<T> & t, QString & error = QString());
    template<typename T>
    bool DbProcBase<T>::AddData(const QSharedPointer<T> & t, QString & error)
    {
        QSqlError sql_error = qx::dao::insert<T>(*t,database_.data());
        error = sql_error.text();
        return error.isEmpty();
    }
  • 数据删除
 bool DelteData(const QSharedPointer<T> & t, QString & error = QString());
 -
    template<typename T>
    bool DbProcBase<T>::DelteData(const QSharedPointer<T> & t, QString & error)
    {
        QSqlError sql_error = qx::dao::delete_by_id<T>(*t, database_.data());
        error = sql_error.text();
        return error.isEmpty();
    }
  • 数据更新
bool UpdateData(const QSharedPointer<T> & t, QString & error = QString());
 -
    template<typename T>
    bool DbProcBase<T>::UpdateData(const QSharedPointer<T> & t, QString & error)
    {
        QSqlError sql_error = qx::dao::update<T>(*t, database_.data());
        error = sql_error.text();
        return error.isEmpty();
    }
  • 数据查询
 bool SearchDataByKey(const QSharedPointer<T> & t, QString & error = QString());

    template<typename T>
    bool DbProcBase<T>::SearchDataByKey(const QSharedPointer<T> & t, QString & error)
    {
        QSqlError sql_error = qx::dao::fetch_by_id<T>(*t, database_.data());
        error = sql_error.text();
        return error.isEmpty();
    }

3. TextOrmDB 业务数据库

  • 数据库初始化
private:
    QSharedPointer< DB::DbProcBase<DbBaseObj> > DbPrc_;
 void init();
 TextOrmDB::TextOrmDB( )
{
    init();
}

void TextOrmDB::init()
{
    DbPrc_ = QSharedPointer<DB::DbProcBase<DbBaseObj>>::create();
    QJsonObject obj_para;

    obj_para["db"] = "testorm.db";
    obj_para["type"] = "QSQLITE";
    SetDbInfo(obj_para);
    DbConnect();
    DbPrc_->SetDataBase(GetDbDatabase());
}
  • 数据增改删
bool insertData(QSharedPointer<DbBaseObj> obj, QString & error);
    bool UpdateData(QSharedPointer<DbBaseObj> obj, QString & error);
    bool SearchData(QSharedPointer<DbBaseObj> obj, QString & error);

    bool deleteData(QSharedPointer<DbBaseObj> obj, QString & error);
bool TextOrmDB::insertData(QSharedPointer<DbBaseObj> obj, QString & error)
{
    if (DbPrc_ != nullptr)
    {
        DbPrc_->AddData(obj, error);
    }
    return error.isEmpty();
}
bool TextOrmDB::UpdateData(QSharedPointer<DbBaseObj> obj, QString & error)
{
    if (DbPrc_ != nullptr)
    {
        DbPrc_->UpdateData(obj, error);
    }
    return error.isEmpty();
}
bool TextOrmDB::SearchData(QSharedPointer<DbBaseObj> obj, QString & error)
{
    if (DbPrc_ != nullptr)
    {
        DbPrc_->SearchDataByKey(obj, error);
    }
    return error.isEmpty();
}

bool TextOrmDB::deleteData(QSharedPointer<DbBaseObj> obj, QString & error)
{
    if (DbPrc_ != nullptr)
    {
        DbPrc_->DelteData(obj, error);
    }
    return error.isEmpty();
}
  • 执行SQL:
    -已数据库查询为例,Qxorm可以直接执行SQL语句:
 bool SearchData(data_list &list_data, const QString & sql, QString & error);
bool TextOrmDB::SearchData(data_list &list_data, const QString & sql, QString & error)
{
    if ( ( DbPrc_ != nullptr ) && ( !sql.isEmpty() ) && ( GetDbDatabase() != nullptr ) )
    {
        qx::QxSqlQuery query(sql);
        QSqlError sql_error = qx::dao::execute_query(query, list_data, GetDbDatabase().data());
        error = sql_error.text();
        return error.isEmpty();
    }
    return error.isEmpty();
}

4. DbBaseObj 数据库表对象类 业务数据对象类

基于QxOrm的Orm数据库基本操作

.h 文件

  • QX_REGISTER_HPP_APP注册当前类,
    QX_REGISTER_HPP_APP(当前类名,基类(如果没有基类,则使用 qx::trait::no_base_class_defined),版本)
  • 主键定义
    默认主键类型为long ,修改主键类型使用QX_REGISTER_PRIMARY_KEY宏
  • 执行SQL 获取返回结果参数定义
    typedef qx::QxCollection
  #include "QxOrm.h"
#include
#include

#define OBJECT_TABLE_VERSION_V1 0
#define OBJECT_TABLE_VERSION_V2 1
class  DbBaseObj
{
public:
    DbBaseObj(){};
    ~DbBaseObj(){};
    void set_key(const QString & key_value);
    void set_para(const QString & para_value );
    void set_datatime( const QDateTime & datatime_value);
    void set_ext1(int value);
    void set_ext2(const QString & ext2);

    QString  get_key();
    QString get_para();
    QDateTime get_datatime();

    int    get_ext1();
    QString get_ext2();
public:
    QString   key;
    QString para;
    QDateTime datatime;

    int Ext1 = 0;
    QString  Ext2;

};

QX_REGISTER_HPP_APP(DbBaseObj, qx::trait::no_base_class_defined, OBJECT_TABLE_VERSION_V2)
QX_REGISTER_PRIMARY_KEY(DbBaseObj, QString)
typedef qx::QxCollection<int, DbBaseObj> data_list;

.cpp文件:

include “dbbaseobj.h”

  • cpp文件注册宏QX_REGISTER_CPP_APP:
    QX_REGISTER_CPP_APP(DbBaseObj)
  • 类字段注册 register_class

QX_REGISTER_CPP_APP(DbBaseObj)

namespace qx
{
    template <> void register_class(QxClass<DbBaseObj> & obj)
    {
        obj.setName("DbBaseObj");
        obj.id(&DbBaseObj::key, "key");
        obj.data(&DbBaseObj::para, "para", OBJECT_TABLE_VERSION_V1);
        obj.data(&DbBaseObj::datatime, "datatime", OBJECT_TABLE_VERSION_V1);

    }
}
void DbBaseObj::set_key(const QString & key_value)
{
    key = key_value;
}
void DbBaseObj::set_para(const QString & para_value)
{
    para = para_value;
}
void DbBaseObj::set_datatime(const QDateTime & datatime_value)
{
    datatime = datatime_value;
}
QString DbBaseObj::get_key()
{
    return key;
}
QString DbBaseObj::get_para()
{
    return para;
}
QDateTime DbBaseObj::get_datatime()
{
    return datatime;
}
void DbBaseObj::set_ext1(int value)
{
    Ext1 = value;
}
void DbBaseObj::set_ext2(const QString & ext2)
{
    Ext2 = ext2;
}
int DbBaseObj::get_ext1()
{
    return Ext1;
}
QString DbBaseObj::get_ext2()
{
    return Ext2;
}

5. DbOrmPro 数据库管理类

#include "DbOrmPro.h"
#include"TextOrmDB.h"
#include
#include"dbbaseobj.h"
#include "TextOrmDB.h"
#include
DbOrmPro::DbOrmPro(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    init();
}

void DbOrmPro::init()
{
    QSharedPointer<TextOrmDB> db = QSharedPointer<TextOrmDB>::create();
    QSharedPointer<DbBaseObj> obj = QSharedPointer<DbBaseObj>::create();

    QString error;
    db->CreateDbTable(obj, error);

    obj->set_key( QDateTime::currentDateTime().toString("yyyyMMddHHmmss"));
    obj->set_para( "str_para");
    obj->set_datatime(QDateTime::currentDateTime());

    db->insertData(obj, error);

    obj->set_para("update para");
    db->UpdateData(obj, error);

    QString  delete_key = "20220601140450";
    obj->set_key(delete_key);
    db->deleteData(obj,error);

    QString search_key = "20220601142514";
    obj->set_key(search_key);
    db->SearchData(obj,error);
    QString datetime = obj->get_datatime().toString("yyyy-MM-dd hh:mm:ss");

    QString sql("SELECT * FROM DbBaseObj");

    data_list datas;
    db->SearchData(datas, sql, error);
}

6 数据库升级

随着业务需求的迭代,会出现数据表新增字段情况,在Qxorm中通过qx::IxClass、 qx::IxDataMemberX可实现对数据库表的字段新增

  • DbProcBase 新增接口

    template<typename T>
    bool DbProcBase<T>::UpDbTable( int cur_version, QString & error)
    {
        QSqlQuery query(*database_);

          qx::QxCollection<QString, qx::IxClass *> * pAllClasses = qx::QxClassX::getAllClasses();
        if (!pAllClasses) { qAssert(false); return false; }

        for (long k = 0; k < pAllClasses->count(); k++)
        {
            qx::IxClass * pClass = pAllClasses->getByIndex(k);
            if (!pClass) { continue; }

            if (pClass->isKindOf("qx::service::IxParameter") || pClass->isKindOf("qx::service::IxService")) { continue; }

            if (pClass->getVersion()  cur_version)
                { continue; }

            qx::IxDataMemberX * pDataMemberX = pClass->getDataMemberX();
            for (long l = 0; (pDataMemberX && (l < pDataMemberX->count_WithDaoStrategy())); l++)
            {
                qx::IxDataMember * p = pDataMemberX->get_WithDaoStrategy(l);
                if (!p || (p->getVersion()  cur_version)) { continue; }

                query.exec("ALTER TABLE " + pClass->getName() + " ADD COLUMN " + p->getName() + " " + p->getSqlType() + ";");
                error = query.lastError().text();
            }
        }
        return error.isEmpty();
    }
  • DbBaseObj 新增字段ext1,ext2,并更新版本号为OBJECT_TABLE_VERSION_V2
#define OBJECT_TABLE_VERSION_V1 0
#define OBJECT_TABLE_VERSION_V2 1
 -QX_REGISTER_HPP_APP(DbBaseObj, qx::trait::no_base_class_defined, OBJECT_TABLE_VERSION_V2)
  obj.data(&DbBaseObj::Ext1, "ext1", OBJECT_TABLE_VERSION_V2);
        obj.data(&DbBaseObj::Ext2, "ext2", OBJECT_TABLE_VERSION_V2);

总结

参考:
https://blog.csdn.net/Mr_VK/article/details/122930987

Original: https://blog.csdn.net/jiang173707/article/details/125072893
Author: 风莫寻
Title: 基于QxOrm的Orm数据库基本操作

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/816448/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球