QxOrm使用Sql语句进行数据库操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 之前介绍了纯使用QxOrm的增删改查,接下来介绍使用QxOrm来执行sql语句。这部分也是有必要的。QxOrm一共提供了1个类2个方法来执行sql语句

QxOrm使用Sql语句

之前介绍了纯使用QxOrm的增删改查,接下来介绍使用QxOrm来执行sql语句。这部分也是有必要的。


QxOrm一共提供了1个类2个方法来执行sql语句

qx::QxSqlQuery // 类 qx_query ;
qx::dao::execute_query() // 方法 ;
qx::dao::call_query() // 方法.

使用qx::QxSqlQuery

有两种方式使用qx::QxSqlQuery


   ●  手动编写SQL

void selectData()
{
    qx::QxSqlQuery query("WHERE t_person.first_name = :first_name");
    query.bind(":first_name", "王五");
    QList<person> persons;
    QSqlError daoError = qx::dao::fetch_by_query(query, persons);
    TurboLog::instance().getConsoleLogger()->error("select table:{}", persons.size());
}

这个里面是使用sql查询sql表,省去了select * from的那个部分,实际生成的sql不会有* 都是按字段生成的。


   ●  使用语法类似于SQL的C++方法

void selectData()
{
    qx::QxSqlQuery query("WHERE t_person.first_name = :first_name");
    query.bind(":first_name", "王五");
    QList<person> persons;
    QSqlError daoError = qx::dao::fetch_by_query(query, persons);
    TurboLog::instance().getConsoleLogger()->error("select table:{}", persons.size());
    qx_query query1;
    query1.where("first_name").isEqualTo("王五");
    QList<person> persons1;
    daoError = qx::dao::fetch_by_query(query1, persons1);
    TurboLog::instance().getConsoleLogger()->error("select table:{}", persons1.size());
}

这个是在上面的基础上使用了C++的方式查询,两次结果一致。


当然这种方式还支持其他的过滤条件,代码如下:

qx_query query;
query.where("sex").isEqualTo(author::female)
     .and_("age").isGreaterThan(38
     .or_("last_name").isNotEqualTo("Dupont")
     .or_("first_name").like("Alfred")
     .and_OpenParenthesis("id").isLessThanOrEqualTo(999)
     .and_("birth_date").isBetween(date1, date2)
     .closeParenthesis()
     .or_("id").in(50, 999, 11, 23, 78945)
     .and_("is_deleted").isNotNull()
     .orderAsc("last_name", "first_name", "sex")
     .limit(50, 150);

你可以更换成自己的表字段去尝试不同的查找条件,我这里就不一一列举。


第一种方式除了:以外,QxOrm 库还提供 3 种样式来编写 SQL 参数。


   ●  ph_style_2_point_name* : “WHERE author.sex = :sex” (default style) ;

   ●  ph_style_at_name : “WHERE author.sex = @sex” ;

   ●  ph_style_question_mark : “WHERE author.sex = ?”.


下面的方法是所有的QxOrm可以执行qx::QxSqlQuery的方法。

// with functions into namespace qx::dao
qx::dao::count<T>()
qx::dao::fetch_by_query<T>()
qx::dao::update_by_query<T>()
qx::dao::delete_by_query<T>()
qx::dao::destroy_by_query<T>()
qx::dao::fetch_by_query_with_relation<T>()
qx::dao::fetch_by_query_with_all_relation<T>()
qx::dao::update_by_query_with_relation<T>()
qx::dao::update_by_query_with_all_relation<T>()
qx::dao::update_optimized_by_query<T>()
// with qx::QxSession class
qx::QxSession::count<T>()
qx::QxSession::fetchByQuery<T>()
qx::QxSession::update<T>()
qx::QxSession::deleteByQuery<T>()
qx::QxSession::destroyByQuery<T>()
// with qx::QxRepository<T> class
qx::QxRepository<T>::count()
qx::QxRepository<T>::fetchByQuery()
qx::QxRepository<T>::update()
qx::QxRepository<T>::deleteByQuery()
qx::QxRepository<T>::destroyByQuery()

使用标准 SQL 或存储过程

上面是使用不完全的sql,如何执行自己写的sql语句呢?


接下来的两种方式是执行自己的sql语句或者是存储过程。


使用qx::dao::execute_query() 执行sql

void selectData()
{
    QList<person> persons;
    qx_query testStoredProcBis("SELECT * FROM t_person");
    QSqlError daoError = qx::dao::execute_query(testStoredProcBis, persons);
    TurboLog::instance().getConsoleLogger()->error("select table:{}", persons.size());
    qx::dump(persons);
    qx::serialization::json::to_file(persons, "persons.json");
}

qx::serialization::json::to_file(persons, “persons.json”); 序列化到json文件函数。dump内执行的就是这个函数。


可以看到对应的表的json输出。


qx::dao::call_query() 执行存储过程

sqlite不支持存储过程,因此这个需要换用mysql进行测试。


创建存储过程

delimiter $$
create procedure bb(in aa varchar(20),out cid varchar(20))
begin
select t_person.id into cid
from t_person
where t_person.first_name=aa;
end $$
delimiter ;

执行一下代码即可,不过这个地方的boundValue函数我是没咋看懂,欢迎懂的小伙伴告诉我一下这个怎么用。

void selectData()
{
    QList<person> persons;
    qx_query query("CALL bb(:param1, :param2)");
    query.bind(":param1", "王五");
    query.bind(":param2", 5024, QSql::InOut);
    QSqlError daoError = qx::dao::call_query(query);
    QVariant vNewValue = query.boundValue(":param2");
    TurboLog::instance().getConsoleLogger()->error("call_query update: {}", vNewValue.toInt());
}

main.cpp

#include <QApplication>
#include <QSqlDatabase>
#include <QMessageBox>
#include "precompiled.h"
#include "person.h"
#include "author.h"
#include "author2.h"
#include "turbo_log.h"
void databaseInit()
{
    qx::QxSqlDatabase::getSingleton()->setDriverName("QMYSQL");
    qx::QxSqlDatabase::getSingleton()->setHostName("192.168.0.84");
    qx::QxSqlDatabase::getSingleton()->setPort(3306);
    qx::QxSqlDatabase::getSingleton()->setDatabaseName("qttest");
    qx::QxSqlDatabase::getSingleton()->setUserName("root");
    qx::QxSqlDatabase::getSingleton()->setPassword("123");
}
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);
    daoError =  qx::dao::insert(p);
    daoError =  qx::dao::insert(p);
    daoError =  qx::dao::insert(p);
    daoError =  qx::dao::insert(p);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("insert update:" + daoError.text().toStdString());
    }
}
void selectData()
{
    QList<person> persons;
    qx_query query("CALL bb(:param1, :param2)");
    query.bind(":param1", "王五");
    query.bind(":param2", "@aa", QSql::Out);
    QSqlError daoError = qx::dao::call_query(query);
    QVariant vNewValue = query.boundValue(1);
    TurboLog::instance().getConsoleLogger()->error("call_query update: {}", vNewValue.toString().toStdString());
}
void deleteData()
{
    QSqlError daoError =  qx::dao::destroy_all<person>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("delete persons:" + daoError.text().toStdString());
    }
}
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    databaseInit();
//    insertData();
    selectData();
//    deleteData();
    return app.exec();
}

连接的地方需要修改成mysql的,当然有可能你的qt不支持mysql的连接,这个时候就需要编译mysql的驱动来连接mysql。最新版的mysql驱动编译完成之后还要加上openssl的动态库,否则会一直显示driver not load,只要将


libcrypto-1_1-x64.dll


libssl-1_1-x64.dll


拷贝到工程目录下即可


这边的使用sql语句就介绍到这里,有不明白的小伙伴欢迎提问。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
160 3
|
18天前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
16 2
|
1月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
54 11
|
1月前
|
SQL 监控 数据库
慢SQL对数据库写入性能的影响及优化技巧
在数据库管理系统中,慢SQL(即执行缓慢的SQL语句)不仅会影响查询性能,还可能对数据库的写入性能产生显著的不利影响
|
1月前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
1月前
|
SQL 存储 数据可视化
SQL 数据库大揭秘:连接数字世界的魔法桥梁
在数字化时代,数据如繁星般璀璨,而 SQL 数据库则像强大的引力场,有序汇聚、整理和分析这些数据。SQL 数据库是一个巨大的数字宝库,装满各行各业的“宝藏”。本文将带你探索 SQL 数据库在电商、金融、医疗和教育等领域的应用。例如,在电商中,它能精准推荐商品;在金融中,它是安全卫士,防范欺诈;在医疗中,它是健康管家,管理病历;在教育中,则是智慧导师,个性化教学。此外,还将介绍如何利用板栗看板等工具实现数据可视化,提升决策效率。
|
1月前
|
SQL 监控 数据处理
SQL数据库数据修改操作详解
数据库是现代信息系统的重要组成部分,其中SQL(StructuredQueryLanguage)是管理和处理数据库的重要工具之一。在日常的业务运营过程中,数据的准确性和及时性对企业来说至关重要,这就需要掌握如何在数据库中正确地进行数据修改操作。本文将详细介绍在SQL数据库中如何修改数据,帮助读者更好
198 4
|
1月前
|
SQL 存储 Oracle
Oracle数据库SQL语句详解与应用指南
在数字化时代,数据库已成为各类企业和组织不可或缺的核心组件。Oracle数据库作为业界领先的数据库管理系统之一,广泛应用于各种业务场景。掌握Oracle数据库的SQL语句是数据库管理员、开发人员及运维人员的基本技能。本文将详细介绍Oracle数据库SQL语句的基本概念、语法、应用及最佳实践。一、Or
53 3
|
1月前
|
SQL 数据管理 数据库
文章初学者指南:SQL新建数据库详细步骤与最佳实践
引言:在当今数字化的世界,数据库管理已经成为信息技术领域中不可或缺的一部分。作为广泛使用的数据库管理系统,SQL已经成为数据管理和信息检索的标准语言。本文将详细介绍如何使用SQL新建数据库,包括准备工作、具体步骤和最佳实践,帮助初学者快速上手。一、准备工作在开始新建数据库之前,你需要做好以下准备工作
120 3
|
1月前
|
SQL 存储 安全
SQL查询数据库:基础概念与操作指南
在数字化时代,数据库已成为信息管理的重要工具之一。作为管理和操作数据库的核心语言,SQL(结构化查询语言)已成为数据管理和查询的关键技能。本文将全面介绍SQL查询数据库的基本概念、语句和操作指南,以帮助初学者快速上手,同时为进阶用户提供有价值的参考。一、数据库与SQL简介数据库是一种存储、管理和检索
40 3