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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 之前介绍了纯使用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语句就介绍到这里,有不明白的小伙伴欢迎提问。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
3月前
|
SQL 机器学习/深度学习 人工智能
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
本文系统性地阐述了自然语言转SQL(NL2SQL) 技术如何让非技术背景的业务分析师实现数据自助查询,从而提升数据驱动决策的效率与准确性。
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
|
2月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
347 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
1月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
177 6
|
3月前
|
SQL 人工智能 Java
用 LangChain4j+Ollama 打造 Text-to-SQL AI Agent,数据库想问就问
本文介绍了如何利用AI技术简化SQL查询操作,让不懂技术的用户也能轻松从数据库中获取信息。通过本地部署PostgreSQL数据库和Ollama模型,结合Java代码,实现将自然语言问题自动转换为SQL查询,并将结果以易懂的方式呈现。整个流程简单直观,适合初学者动手实践,同时也展示了AI在数据查询中的潜力与局限。
409 8
|
3月前
|
SQL 人工智能 Linux
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
259 5
|
4月前
|
SQL 缓存 监控
SqlRest让SQL秒变Http API,还支持20+数据库(含国产数据库)
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
4月前
|
SQL 存储 数据库
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
907 0
|
4月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
428 0
|
6月前
|
SQL 人工智能 数据库
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
454 0
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
|
7月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。

热门文章

最新文章

下一篇
oss云网关配置