当前位置:首页 > 技术分析 > 正文内容

一文详解 C++ 框架:快速认识 ORM(orm框架有哪些 c#)

ruisui883个月前 (01-21)技术分析14

什么是 ORM?

关于 ORM,维基百科描述如下:

ORM 全称是 Object Relational Mapping(对象关系映射),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。


面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。

简单理解,ORM 就是在数据库和对象之间作了一个映射:


  • 数据库的表(table) --> 类(class)
  • 记录(record,行数据)--> 对象(object)
  • 字段(field)--> 对象的属性(attribute)


为什么使用 ORM?

ORM 在关系数据库上提供了一个高级抽象,开发者可以使用自己喜欢的编程语言来处理数据库,而不必编写 SQL 语句或存储过程。

举个栗子吧,有一张用户表 user,要获取 id 为 1 的记录。按照传统方式,先要编写一条 SQL 语句:

QString?sql?=?"select?*?from?user?where?id?=?1";

然后再执行 SQL 查询,随后就可以获取记录以及其中的字段值了:

QSqlQuery?query;
query.exec(sql);
if?(query.next())?{
????//?获取记录
????QSqlRecord?record?=?query.record();
????if?(!record.isEmpty())?{
????????//?获取字段值
????????QString?name?=?record.value("name").toString();
????????int?age?=?record.value("age").toInt();
????????qDebug()?<<?"name:"?<<?name?<<?"age:"?<<?age;
????}
}

如果改为 ORM(例如:QxOrm),就会变为这样:

typedef?QSharedPointer<User>?UserPtr;

UserPtr?user(new?User());
user->id?=?1;
QSqlError?daoError?=?qx::dao::fetch_by_id(user);
if?(daoError.type()?==?QSqlError::NoError)?{
????qDebug()?<<?"name:"?<<?user->name?<<?"age:"?<<?user->age;
}

比较之后你会发现,ORM 使用对象封装了数据库操作,因此不必再和 SQL 语句打交道了。只需要与数据对象直接交互即可,而无需关心底层数据库。


ORM 的优缺点

无论是何种技术,在使用时都应该权衡一番。ORM 也不例外,一起来看看它的优缺点吧!

优点:

  • ORM 提供了一种面向对象的查询语言,这使得开发者可以专注于对象模型,而不必关心数据库结构或 SQL 语义。
  • ORM 提供了大量的服务,开发者只需要关注业务逻辑,而不是重复的 CRUD(Create、Read、Update、Delete)操作,这可以减少大量的代码。
  • ORM 将迫使你使用 MVC 风格,这通常会使代码更加简洁、更容易理解。
  • ORM 有现成的工具,很多功能可以自动完成,比如预处理、事务等。
  • ORM 对数据库进行了抽象,因此从一种数据库切换到另一种(例如:从 MySQL 到 PostgreSQL)会很容易。

缺点:

  • 无论是什么 ORM 框架,都需要花费相当大的精力去学习和理解。
  • ORM 抽象掉了数据库层,开发者无法了解底层数据库(和 SQL)的相关操作。
  • 对于复杂的查询,ORM 要么难以实现,要么性能不如原生的 SQL。


主流的 ORM 框架

目前为止,C++ 中主流的 ORM 框架有以下几个:

  • LiteSQL:https://litesql.org/
  • ODB:https://www.codesynthesis.com/products/odb/
  • QxOrm:https://www.qxorm.com/qxorm_en/home.html
  • Wt::Dbo:https://www.webtoolkit.eu/wt/doc/tutorial/dbo.html

为了更清楚地了解它们的现状,有必要从不同角度对比一番,像许可协议、所支持的数据库等:

其中,LiteSQL 和 ODB 不依赖于特定的框架,而 QxOrm 依赖于 Qt,Wt::Dbo 依赖于 Wt。

综合考虑,如果是纯 C++ 开发,可以选择使用 ODB。它拥有大量的用户群体,(相比 LiteSQL)技术支持好,(相比 QxOrm)编译时间短,(相比 Wt::Dbo)提供了更多的特性,更重要的是它易于使用,并且提供了很全面的文档。

当然,如果是 Qt 开发,也可以选择使用 QxOrm。它几乎支持所有的数据库,并且也有良好的文档。除此之外,它还提供了一个图形编辑器 - QxEntityEditor,可以很方便地以图形方式来管理数据模型。


还有些什么

ORM 并不是 SQL/DB 技能的替代者,而是对它的补充,这两者可以说是相辅相成的!

就个人而言,我更喜欢使用 ORM,而不是编写 SQL 代码。因为后者很难维护,而 ORM 却能以更易读的格式提供所需的数据。另一方面,当在小型团队中工作时,一般我们充当的都是“全栈工程师”的角色,很少有专门的数据库专家做支持,这时 ORM 能极大地简化数据层的工作。

当然了,上述观点有一定的偏见,最终如何选择还是要取决于自己。无论如何,我还是强烈建议大家要理解 SQL 的原则,并掌握其中的一些常见操作。倘若你还没有使用过 ORM,建议尝试一下,看看它究竟是如何工作的,我相信你会喜欢上它的。


作者:一去、二三里,爱编程、爱分享、爱生活!

欢迎大家关注,更多优质原创内容敬请期待!

本文出自头条号【高效程序员】,VX 公众号同名。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/419.html

标签: c# orm框架
分享给朋友:

“一文详解 C++ 框架:快速认识 ORM(orm框架有哪些 c#)” 的相关文章

深入理解Vue.js组件通信:父子组件与子父组件数据交互详解

什么是Vue组件通讯 Vue.js 组件通信是指在 Vue 应用的不同组件之间进行数据交换和状态同步的过程。由于 Vue 的组件是基于单文件组件(SFCs)的模块化设计,每个组件都有自己的作用域,因此它们不能直接访问彼此的数据。为了使组件之间能够协同工作,Vue 提供了几种不同的通信方式。以下是 V...

程序员开发必会之git常用命令,git配置、拉取、提交、分支管理

整理日常开发过程中经常使用的git命令![送心]git配置SSH刚进入项目开发中,我们首先需要配置git的config、配置SSH方式拉取代码,以后就免输入账号密码了!# 按顺序执行 git config --global user.name "自己的账号" git config -...

壹啦罐罐 Android 手机里的 Xposed 都装了啥

这是少数派推出的系列专题,叫做「我的手机里都装了啥」。这个系列将邀请到不同的玩家,从他们各自的角度介绍手机中最爱的或是日常使用最频繁的 App。文章将以「每周一篇」的频率更新,内容范围会包括 iOS、Android 在内的各种平台和 App。本期继续歪楼,由少数派撰稿作者@壹啦罐罐介绍他正在使用的...

身体越柔软越好?刻苦拉伸可能反而不健康 | 果断练

坐下伸直膝盖,双手用力向前伸,再用力……比昨天前进了一厘米,又进步了! 这么努力地拉伸,每个人都有自己的目标,也许是身体健康、线条柔美、放松肌肉、体测满分,也可能为了随时劈个叉,享受一片惊呼。 不过,身体柔软,可以享受到灵活的福利,也可能付出不稳定的代价,并不是越刻苦拉伸越好。太硬或者太软,都不安全...

7 招教你轻松搭建以图搜图系统

作者 | 小龙责编 | 胡巍巍当您听到“以图搜图”时,是否首先想到了百度、Google 等搜索引擎的以图搜图功能呢?事实上,您完全可以搭建一个属于自己的以图搜图系统:自己建立图片库;自己选择一张图片到库中进行搜索,并得到与其相似的若干图片。Milvus 作为一款针对海量特征向量的相似性检索引擎,旨在...

K8S NFS 共享存储

NFS 共享存储前面我们学习了 hostPath 与 Local PV 两种本地存储方式,但是平时我们的应用更多的是无状态服务,可能会同时发布在不同的节点上,这个时候本地存储就不适用了,往往就需要使用到共享存储了,比如最简单常用的网络共享存储 NFS,本节课我们就来介绍下如何在 Kubernetes...