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

news2024/11/20 2:19:02

文章目录

  • QxOrm的使用-数据操作
    • 使用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为张三;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/418805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【谷粒商城之整合阿里云OSS对象存储】

本笔记内容为尚硅谷谷粒商城整合阿里云OSS对象存储部分 目录 一 、简介 二、云存储开通与使用 1、开通阿里云对象存储服务 2、创建bucket 3、创建子用户&#xff08;获取密钥访问OSS服务器&#xff09; 给该子账户添加权限 4、阿里云对象存储上传方式 三、整合 1、…

BUUCTF--Web篇详细wp

BUUCTF--Web篇详细wp[极客大挑战 2019]EasySQL[极客大挑战 2019]Havefun[HCTF 2018]WarmUp[ACTF2020 新生赛]Include[ACTF2020 新生赛]Exec[强网杯 2019]随便注[GXYCTF2019]Ping Ping Ping[SUCTF 2019]EasySQL[极客大挑战 2019]Secret File[极客大挑战 2019]LoveSQL[极客大挑战…

MySQL 分布式数据库实现:无需修改代码,轻松实现分布式能力

这个项目做什么 ShardingSphere-Proxy&#xff0c;可以让用户像使用原生数据库一样使用 Apache ShardingSphere。 了解一项技术的开始&#xff0c;一般从官网开始。先来看一看官网对 ShardingSphere-Proxy 的定义是什么样的&#xff1a; 定位为透明化的数据库代理端&#xff…

异配图神经网络——Graph Transformer Networks

一.论文概述 作者提出了Graph Transformer Network (GTN)用来在异配图&#xff08;heterogeneous graph&#xff09;上学习节点表示。通过Graph Transformer层&#xff0c;模型能将异构图转换为由meta-path定义的多个新图&#xff0c;这些meta-paths具有任意的边类型和长度&am…

运行Spring Boot项目时[ java: 错误: 不支持发行版本 17 ]

项目场景&#xff1a; 使用IDEA的Spring Initializr构建的Spring boot项目在构建完成后运行出错 问题描述&#xff1a; 用Spring Initializr创建了Spring Boot 项目后&#xff0c;运行时报错&#xff1a; “错误:java: 错误: 不支持发行版本 17”根据错误信息得知&#xff…

Vue学习笔记(5. 计算属性,监视器(侦听器))

1. 计算属性&#xff08;computed&#xff09; (1) get方式 初期显示 改变值后&#xff08;hello -> hello1&#xff09;计算属性allStr跟随变更 (2) get set方式 页面初期显示 改变值&#xff08;hello -> hello1&#xff09;计算属性的get会监控到变更&#xff0c;使…

国产SSD、内存卷哭国外大厂,三星宣布减产涨价在路上了

PC 圈有一句话是这么说的&#xff1a;论价格屠夫还得看国产品牌&#xff01; 可不是嘛&#xff0c;国产长鑫、长江算是彻底将全球存储芯片市场搅局者这一「骂名」坐实了&#xff01; 不说特别早期&#xff0c;前几年吧&#xff0c;普通单条 8G DDR4 内存都能卖到六七百元&…

C++ 红黑树

1.红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;因…

D. Many Perfect Squares

题目链接&#xff1a;Problem - D - Codeforces 题意&#xff1a;给你一个数组&#xff0c;大小不超过50个。 问你让他们全部加上一个x&#xff0c;构造出来最多能够有多少个完全平方数。 思路&#xff1a; 先对数组排个序&#xff0c;首先它最少一定是有一个的&#xff0c…

Git配置SSH步骤

一、git 配置 &#xff08;1&#xff09;打开 git 命令窗口 &#xff08;2&#xff09;配置用户名&#xff08;填自己的姓名&#xff09; git config --global user.name “linjiaxiaozhu” &#xff08;3&#xff09;配置用户邮箱&#xff08;填自己的邮箱&#xff09; git…

电脑录屏的视频保存在哪里?您可以这样查看

案例&#xff1a;电脑录屏之后保存到哪里去了&#xff1f; “前几天&#xff0c;根据网络上的录屏教程试着录制了一下我的电脑屏幕&#xff0c;录制完成之后却找不到录制的视频。有没有小伙伴知道电脑录屏的视频保存在哪里&#xff1f;怎样才能快速找到&#xff1f;” 在现代…

pandas数据聚合和重组

介绍pandas数据聚合和重组的相关知识&#xff0c;仅供参考。 目录 1GroupBy技术 1.1简介 1.2对分组进行迭代 1.3选取一个或一组列 1.4通过字典或Series进行分组 1.5利用函数进行分组 2数据聚合 2.1简介 2.1面向列的多函数应用 2.2以‘无索引’的方式返回聚合数据 1G…

Faster R-CNN

目录 1. Fast R-CNN的不足 2. Faster R-CNN 3. RPN(Region Proposal Network) 3.1 anchor 3.2 RPN 网络 3.3 RPN 网络的损失 4. Faster R-CNN 损失 5. Faster R-CNN 训练 6. 对比 1. Fast R-CNN的不足 Fast R-CNN 的算法流程 Fast R-CNN网络运行速度慢的最主要原因&a…

浅谈根号分治与分块

文章目录1. 根号分治哈希冲突2. 线性分块引入教主的魔法[CQOI2011] 动态逆序对[国家集训队] 排队[HNOI2010] 弹飞绵羊蒲公英1. 根号分治 哈希冲突 题目1 nnn 个数&#xff0c;mmm 次操作。操作 1 为修改某一个数的值&#xff0c;操作 2 为查询所有满足下标模 xxx 等于 yyy 的…

一、基础算法6:双指针算法 模板题+算法模板(最长连续不重复子序列,数组元素的目标和,判断子序列)

文章目录算法模板双指针算法模板最长连续不重复子序列模板暴力法双指针算法数组元素的目标和模板判断子序列模板模板题最长连续不重复子序列原题链接题目题解数组元素的目标和原题链接题目题解判断子序列原题链接题目题解算法模板 双指针算法模板 for (int i 0, j 0; i <…

ForkJoinPool + RecursiveTask 来计算数组元素和

ForkJoinPool 是什么&#xff1f; ForkJoinPool 是一个 Java 并发编程框架&#xff0c;用于解决分治算法中的任务拆分、执行、合并等问题&#xff0c;是 Java 7 引入的一个新的工具类。 ForkJoinPool 的基本思想是将一个大任务划分成若干个小任务&#xff0c;然后并行执行这些…

SQL AVG函数

SQL AVG函数 SQL AVG函数简介 SQL AVG函数是一个聚合函数&#xff0c;用于计算集合的平均值。 以下说明了SQL AVG函数的语法&#xff1a; AVG([ALL|DISTINCT] expression)如果使用ALL关键字&#xff0c;AVG函数将获取计算中的所有值。 默认情况下&#xff0c;无论是否指定&a…

python+vue 图书馆读者行为分析系统-书友会

本系统主要包括以下功能模块&#xff1a;个人中心、用户管理、图书信息管理、图书分类管理、热门图书管理、书友会管理、报名信息管理、行为分析管理、在线论坛、系统管理等模块&#xff0c;通过这些模块的实现能够基本满足日常图书馆读者行为分析系统的操作。结合相关设计模式…

生成式 AI 与强人工智能:探索 AI 技术的未来

AIGC&#x1f388; AIGC&#xff08;AI Generated Content&#xff09; 即人工智能生成内容&#xff0c;又称“生成式 AI”&#xff08;Generative AI&#xff09;&#xff0c;被认为是继专业生产内容&#xff08;PGC&#xff09;、用户生产内容&#xff08;UGC&#xff09;之…

rust中的集合容器(切片和哈希)与错误处理

String、数组[T:n]、列表Vec\哈希表HashMap<K,V>等。 切片slice&#xff1b; 循环缓冲区 VecDeque、双向列表 LinkedList等。(这是指双向链表吗&#xff1f;) 这些集合容器的共性&#xff1a; 可以遍历 可以进行 map-reduce操作。 可以从一种类型转换成另一种类型。 主要…