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

QxOrm的使用-数据操作

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

  • 数据类型映射
Qt/C++类型数据库类型
boolSMALLINT
qx_boolSMALLINT
shortSMALLINT
intINTEGER
longINTEGER
long longINTEGER
floatFLOAT
doubleFLOAT
long doubleFLOAT
unsigned shortSMALLINT
unsigned intINTEGER
unsigned longINTEGER
unsigned long longINTEGER
std::stringTEXT
std::wstringTEXT
QStringTEXT
QVariantTEXT
QUuidTEXT
QDateDATE
QTimeTIME
QDateTimeTIMESTAMP
QByteArrayBLOB
qx::QxDateNeutralTEXT
qx::QxTimeNeutralTEXT
qx::QxDateTimeNeutralTEXT
  • 注册瞬态数据成员

我们以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());
    }
}

在这里插入图片描述

使用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 按照自己想要的条件搜索

void 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为张三;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

turbolove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值