关于 ORM,维基百科描述如下:
ORM 全称是 Object Relational MApping(对象关系映射),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。
简单理解,ORM 就是在数据库和对象之间作了一个映射:
ORM
ORM 在关系数据库上提供了一个高级抽象,开发者可以使用自己喜欢的编程语言来处理数据库,而不必编写 SQL 语句或存储过程。
举个栗子吧,有一张用户表 user,要获取 id 为 1 的记录。按照传统方式,先要编写一条 SQL 语句:
QStringsql="select*fromuserwhereid=1";
然后再执行 SQL 查询,随后就可以获取记录以及其中的字段值了:
QSqlQueryquery;
query.exec(sql);
if(query.next()){
//获取记录
QSqlRecordrecord=query.record();
if(!record.isEmpty()){
//获取字段值
QStringname=record.value("name").toString();
intage=record.value("age").toInt();
qDebug()<<"name:"<<name<<"age:"<<age;
}
}
如果改为 ORM(例如:QxOrm),就会变为这样:
typedefQSharedPointer<User>UserPtr;
UserPtruser(newUser());
user->id=1;
QSqlErrordaoError=qx::dao::fetch_by_id(user);
if(daoError.type()==QSqlError::NoError){
qDebug()<<"name:"<<user->name<<"age:"<<user->age;
}
比较之后你会发现,ORM 使用对象封装了数据库操作,因此不必再和 SQL 语句打交道了。只需要与数据对象直接交互即可,而无需关心底层数据库。
无论是何种技术,在使用时都应该权衡一番。ORM 也不例外,一起来看看它的优缺点吧!
优点:
缺点:
目前为止,C++ 中主流的 ORM 框架有以下几个:
为了更清楚地了解它们的现状,有必要从不同角度对比一番,像许可协议、所支持的数据库等:
ORM 各个框架
其中,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 公众号同名。