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

12 篇文章 0 订阅

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

前言

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

一、说明

Qxorm下载后在doc 文件下 有详细的安装配置说明,
在这里插入图片描述
在这里插入图片描述

本文基于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;

    //init db
    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 数据库表对象类 业务数据对象类

在这里插入图片描述

.h 文件

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


#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;

};
//.h 文件注册
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
// cpp 文件注册
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);

      //  obj.data(&DbBaseObj::Ext1, "ext1", OBJECT_TABLE_VERSION_V2);//属性对应版本号
      //  obj.data(&DbBaseObj::Ext2, "ext2", OBJECT_TABLE_VERSION_V2);
    }
}
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<qsharedpointer.h>
#include"dbbaseobj.h"
#include "TextOrmDB.h"
#include<qdatetime.h>
DbOrmPro::DbOrmPro(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    init();
}
// Db manageger 
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);

    //查
    //方式1
    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");
    // 方式2
    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

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值