QxOrm的使用-数据操作--增删改查

简介: 上一篇我们讲了QxOrm的基本的数据映射操作,这里面再补充一点东西

QxOrm的使用-数据操作

上一篇我们讲了QxOrm的基本的数据映射操作,这里面再补充一点东西


 ●  数据类型映射

Qt/C++类型 数据库类型
bool SMALLINT
qx_bool SMALLINT
short SMALLINT
int INTEGER
long INTEGER
long long INTEGER
float FLOAT
double FLOAT
long double FLOAT
unsigned short SMALLINT
unsigned int INTEGER
unsigned long INTEGER
unsigned long long INTEGER
std::string TEXT
std::wstring TEXT
QString TEXT
QVariant TEXT
QUuid TEXT
QDate DATE
QTime TIME
QDateTime TIMESTAMP
QByteArray BLOB
qx::QxDateNeutral TEXT
qx::QxTimeNeutral TEXT
qx::QxDateTimeNeutral TEXT

 ●  注册瞬态数据成员


我们以person为例子


person.h

#ifndef QXORMDEMO_PERSON_H
#define QXORMDEMO_PERSON_H
#include "precompiled.h"
#include "export.h"
#include <QDateTime>
class person
{
public:
    long id;
    QString firstName;
    QString lastName;
    QDateTime birthDate;
    int age;
};
QX_REGISTER_HPP_APP(person, qx::trait::no_base_class_defined, 0)
#endif //QXORMDEMO_PERSON_H

person.cpp

#include "person.h"
QX_REGISTER_CPP_APP(person)
namespace qx
{
    template <> void register_class(QxClass<person> & t)
    {
        t.setName("t_person");    
        t.id(& person::id, "id"); 
        t.data(& person::firstName, "first_name"); 
        t.data(& person::lastName, "last_name");  
        t.data(& person::birthDate, "birth_date"); 
        // 注册瞬态数据成员,一下两种二选一:
        // t.data(& person::age, "age", 0, true, false);
        IxDataMember * pDataMember = t.data(& person::age, "age");
        pDataMember->setDao(false);
    }
}

使用该方法可以看到数据库内没有生成age字段,但是类内是有该字段的。


瞬态数据成员是为了方便序列化或者自检等。


 ●  数据库的连接


在main函数内看到的以下代码:

qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
qx::QxSqlDatabase::getSingleton()->setDatabaseName("./demo.db");
qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
qx::QxSqlDatabase::getSingleton()->setUserName("root");
qx::QxSqlDatabase::getSingleton()->setPassword("");

该段代码是使用QxSqlDatabase内的单例类来连接数据库的,该方式是跨线程的。其他方式暂且不介绍,如果有需要则到官网查看。


使用QxOrm对数据库进行增删改查

接下来我们使用person类来做基本的增删改查操作,QxOrm提供了多种函数,这里只介绍最基本的,如果你想深入学习,可以到源码中去查看QxOrm的文档

新增数据


main.cpp

#include <QApplication>
#include "precompiled.h"
#include "person.h"
#include "author.h"
#include "author2.h"
#include "turbo_log.h"
void databaseInit()
{
    qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
    qx::QxSqlDatabase::getSingleton()->setDatabaseName("./demo.db");
    qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
    qx::QxSqlDatabase::getSingleton()->setUserName("root");
    qx::QxSqlDatabase::getSingleton()->setPassword("");
}
void createTable()
{
    QSqlError daoError = qx::dao::create_table<person>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("Table person:" + daoError.text().toStdString());
    }
    daoError = qx::dao::create_table<author>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("Table author:" + daoError.text().toStdString());
    }
    daoError = qx::dao::create_table<author2>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("Table author2:" + daoError.text().toStdString());
    }
}
void insertData()
{
    person p;
    p.firstName = "张三";
    p.lastName = "张三2";
    p.birthDate = QDateTime::fromString("1996-04-25", "yyyy-MM-dd");
    p.age = 23;
    QSqlError daoError =  qx::dao::insert(p);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("insert person:" + daoError.text().toStdString());
    }
    person p2;
    p2.firstName = "李四";
    p2.lastName = "李四2";
    p2.birthDate = QDateTime::fromString("1996-04-25", "yyyy-MM-dd");
    p2.age = 23;
    daoError = qx::dao::save(p2);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("save person:" + daoError.text().toStdString());
    }
}
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    databaseInit();
    insertData();
    return app.exec();
}

我们在main函数中执行插入, qx::dao::save 和 qx::dao::insert都可以进行插入,区别在于如果save的数据的id是存在的则修改数据。


如果你想测试对应的数据,则给person设置id之后执行save和insert就可以看出区别。

person p;
p.id = 1;
p.firstName = "王二麻";
p.lastName = "王二麻2";
p.birthDate = QDateTime::fromString("1996-04-25", "yyyy-MM-dd");
p.age = 23;
QSqlError daoError =  qx::dao::save(p);
if (daoError.type() != QSqlError::NoError)
{
    TurboLog::instance().getConsoleLogger()->error("insert person:" +      daoError.text().toStdString());
}

删除数据

QxOrm提供了如下函数删除数据

qx::dao::delete_by_query
qx::dao::delete_by_id
qx::dao::delete_all
qx::dao::destory_by_query
qx::dao::destory_by_id
qx::dao::destory_all

如果没有定义软删除的话 destory和delete都是把数据删除了。

void deleteData()
{
    person p;
    qx_query query;
    query.where("id").isEqualTo(2);
    QSqlError daoError =  qx::dao::delete_by_query<person>(query);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("delete persons:" + daoError.text().toStdString());
    }
    qx_query query2;
    query2.where("id").isEqualTo(1);
    daoError =  qx::dao::destroy_by_query<person>(query2);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("delete persons:" + daoError.text().toStdString());
    }
}

如果定义了软删除行为的话。


person.h

#ifndef QXORMDEMO_PERSON_H
#define QXORMDEMO_PERSON_H
#include "precompiled.h"
#include "export.h"
#include <QDateTime>
class person
{
public:
    long id;
    QString firstName;
    QString lastName;
    QDateTime birthDate;
    QDateTime deleteData;
    int age;
};
QX_REGISTER_HPP_APP(person, qx::trait::no_base_class_defined, 0)
#endif //QXORMDEMO_PERSON_H

person.cpp

#include "person.h"
QX_REGISTER_CPP_APP(person)
namespace qx
{
    template <> void register_class(QxClass<person> & t)
    {
        t.setName("t_person");           
        t.id(& person::id, "id");             
        t.data(& person::firstName, "first_name");   
        t.data(& person::lastName, "last_name"); 
        t.data(& person::birthDate, "birth_date");
        // t.data(& person::age, "age", 0, true, false);
        IxDataMember * pDataMember = t.data(& person::age, "age");
        pDataMember->setDao(false);
        t.setSoftDelete(qx::QxSoftDelete("deleteData"));
    }
}

使用delete 数据不会被实际删除。


main.cpp

void deleteData()
{
    QSqlError daoError =  qx::dao::delete_all<person>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("delete persons:" + daoError.text().toStdString());
    }
}

629c21e600ff492393698929f1b88893.png

使用destory 数据会被实际删除。

void deleteData()
{
    QSqlError daoError =  qx::dao::destroy_all<person>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("delete persons:" + daoError.text().toStdString());
    }
}

最后by_id的用法和查找的那个by_id是一致的,我这里不再贴代码了。


修改数据

使用qx::dao::update 更新数据库数据,注意:未赋值的字段将被更新为默认值或者空,此操作需要将字段赋值全

person p;
p.id = 3;
p.firstName = "王五";
p.lastName = "王五2";
p.birthDate = QDateTime::fromString("1996-04-25", "yyyy-MM-dd");
p.age = 23;
QSqlError daoError =  qx::dao::update(p);
if (daoError.type() != QSqlError::NoError)
{
    TurboLog::instance().getConsoleLogger()->error("insert update:" + daoError.text().toStdString());
}

QxOrm提供了一种脏模式更新数据库qx::dao::update_optimized但是不建议使用。


查询数据

上面修改的时候,如果你的数据不全则更新的字段也会出问题,最好的方式是线查询出来再更新某个字段。


我们可以使用qx::dao::fetch_all查询全部数据。

void selectData()
{
    QList<person> persons;
    QSqlError daoError =  qx::dao::fetch_all(persons);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("select persons:" + daoError.text().toStdString());
    }
    TurboLog::instance().getConsoleLogger()->info("persons: {}", persons.size());
}

可以打印出总数据数量为4;


同样的我们可以使用qx::dao::fetch_by_id 精确查询某条数据。

void selectData()
{
    person p;
    p.id = 3;
    QSqlError daoError =  qx::dao::fetch_by_id(p);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("select persons:" + daoError.text().toStdString());
    }
    TurboLog::instance().getConsoleLogger()->info("persons: {}", p.firstName.toStdString());
}

可以打印出总数据数量为p.firstName为王五;


同样的我们可以使用qx::dao::fetch_by_query 按照自己想要的条件搜索

mvoid selectData()
{
    person p;
    qx_query query;
    query.where("id").isEqualTo(2);
    QSqlError daoError =  qx::dao::fetch_by_query(query, p);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("select persons:" + daoError.text().toStdString());
    }
    TurboLog::instance().getConsoleLogger()->info("persons: {}", p.firstName.toStdString());
}

可以打印出总数据数量为p.firstName为张三;

目录
相关文章
|
2月前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
2月前
|
存储 监控 数据处理
flink 向doris 数据库写入数据时出现背压如何排查?
本文介绍了如何确定和解决Flink任务向Doris数据库写入数据时遇到的背压问题。首先通过Flink Web UI和性能指标监控识别背压,然后从Doris数据库性能、网络连接稳定性、Flink任务数据处理逻辑及资源配置等方面排查原因,并通过分析相关日志进一步定位问题。
194 61
|
6天前
|
SQL 关系型数据库 API
HarmonyOs开发:关系型数据库封装之增删改查
每个方法都预留了多种调用方式,比如使用callback异步回调或者使用Promise异步回调,亦或者同步执行,大家在使用的过程中,可以根据自身业务需要进行选择性调用,也分别暴露了成功和失败的方法,可以针对性的判断在执行的过程中是否执行成功。
62 13
|
5天前
|
SQL 存储 运维
从建模到运维:联犀如何完美融入时序数据库 TDengine 实现物联网数据流畅管理
本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品。文章从一个具体的业务场景出发,分析了企业在面对海量时序数据时的挑战,并提出了利用 TDengine 高效处理和存储数据的方法,帮助企业解决在数据采集、存储、分析等方面的痛点。通过这篇文章,作者不仅展示了自己对数据处理技术的理解,还进一步阐释了时序数据库在行业中的潜力与应用价值,为读者提供了很多实际的操作思路和技术选型的参考。
17 1
|
10天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
13天前
|
前端开发 JavaScript 数据库
获取数据库中字段的数据作为下拉框选项
获取数据库中字段的数据作为下拉框选项
42 5
|
2月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
169 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
2月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
2月前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。
|
3月前
|
人工智能 Cloud Native 容灾
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?