我看过无数的文章和评论(尤其是评论),它们告诉我们ORM(对象关系映射)的概念有多糟糕,糟糕和错误。 以下是通常的声明,以及我对它们的评论:
  • “它们很慢” –映射有一些开销,但这并不严重。 您可能会拥有慢得多的代码段。
  • “它们会产生不利于性能的错误查询” –首先,它产生的查询要比常规开发人员编写的查询更好,其次–如果您使用错误的映射,则会产生错误的查询
  • “它们剥夺了您的控制权” –您可以自由执行本机查询
  • “您不需要它们,普通的SQL和XDBC很好” –不,但是我将在下一段中讨论
  • “它们迫使您使用不好的吸气剂和吸气剂” –您的实体是简单的价值对象, 在那里使用吸气剂/吸气剂就可以了 。 下面的更多内容
  • 数据库升级非常困难– ORM周围有很多工具可以简化架构转换。 许多ORM都内置了这些工具
但是,为什么首先需要一个ORM? 假设您决定不使用一个。 您编写查询并以ResultSet的形式(或使用您所使用语言的任何形式)将结果取回。 您可以在那里通过其名称访问每一列。 结果是类型不安全的类似地图的结构。 但是系统的其余部分需要对象–前端组件需要对象,服务方法需要对象作为参数,等等。这些对象是简单的值对象,并且通过getter公开它们的状态没有错。 他们没有对状态进行操作的任何逻辑,它们只是用来转移状态。 如果您使用的是静态类型的语言,则很可能在代码周围使用对象而不是类型不安全的结构,更不用说这些结构是数据库访问接口,并且您不会在前端使用它们码。 因此,您想到了一个绝妙的主意–“我将创建一个价值对象,并将结果集中的所有内容转移给它。 现在,我将数据保存在一个对象中,不需要在数据库中传递特定于接口的接口来传递代码。” 这是伟大的一步。 但是很快您就意识到这是一项重复性的任务–您正在创建一个新对象,并逐字段手动进行操作,将结果从SQL查询传递到该对象。 然后,您设计了一个巧妙的反射实用程序,该实用程序可以读取对象字段,并假定您在数据库中具有相同的列名,读取结果集并填充对象。 好吧,猜猜是什么–多年来,ORM一直在做同样的事情。 我敢打赌他们的更好,并且可以在许多您认为不需要的场景中工作。 (而且我只是简单地说明了维护本地查询的过程有多奇怪-有些将它们放在一个巨大的文本文件中(难看),而另一些则将它们放在行内(DBA现在如何优化它们?))
总结上一段–您将在项目中创建某种ORM,但是您的项目将比那里吸收的更多,并且您不会承认它是ORM。
这是提到称为commons-dbutils (Java)的实用程序的好地方。 它是将数据库结果映射到涵盖基本情况的对象的简单工具。 它不是ORM,但它执行ORM的工作–将数据库映射到您的对象。 但是基本的列到字段映射器中缺少一些东西,那就是外键和联接。 使用ORM,即使需要JOIN来获取它,也可以在“地址”字段中获取用户的地址。 这既是ORM的优点,也是主要的缺点。 * ToOne映射通常是安全的。 但是* ToMany集合可能非常棘手,并且经常被滥用 。 这部分是ORM的错误,因为ORM不会以任何方式警告您映射某个公司的所有订单的集合的后果。 您将永远也永远不需要访问该集合,但是可以对其进行映射。 我从未从ORM反对者那里听到过这样的争论,因为他们还没有达到这一点。
那么,ORM基本上是dbutils加上危险的集合映射吗? 不,它为您提供了许多所需的其他功能。 方言–您以与数据库无关的方式编写代码,尽管您可能不会更改最初选择的数据库供应商,但是使用任何数据库都容易得多,而无需每个开发人员都了解语法的罪魁祸首。 我曾经使用过MSSQL和Oracle,但与他们合作几乎没有痛苦。 另一个非常非常重要的事情是缓存。 您会执行两次相同的查询吗? 我猜不是,但是如果碰巧是在第三个方法调用的两个单独的方法中,则可能很难捕获或避免。 会话缓存来了,它将为您保存所有重复的查询,以便从数据库中获取某些行(对象)。 这里对ORM还有另一种批评–会话管理太复杂了。 我主要使用JPA,因此我无法透露其他信息,但是正确地进行会话管理确实很棘手。 都是出于很好的理由(前面提到的缓存,事务管理,延迟映射等),但是它仍然太复杂了。 您需要团队中至少有一个对特定ORM有丰富经验的人员来正确地进行设置。
但是还有二级缓存,这要重要得多。 这种事情可以使facebook和twitter之类的服务存在–将很少变化的数据填充到(分布式)内存中,而不是每次都查询数据库,而是从内存中获取对象,这快了很多倍。 为什么这与ORM相关? 因为通常可以将缓存解决方案插入ORM,并且您可以将ORM生成的对象完全存储在内存中。 通过这种方式,缓存对您的数据库访问代码变得完全透明,从而使其简单而高效。
因此,总而言之– ORM仍在做您需要做的事情,但是几乎可以肯定的是,存在10年的框架比您自己的映射器要好,并且它们在顶部提供了许多必要且重要的附加功能他们的核心功能。 他们也有两个弱点(他们实际上都说“您需要知道自己在做什么”):
  • 它们很容易被滥用,这可能导致从数据库中获取大量不必要的结果。 您可以非常轻松地创建app脚的映射,这会减慢您的应用程序的速度。 当然,拥有一个良好的映射是您的责任,但是ORM并没有真正帮助您
  • 他们的会话管理很复杂,尽管有很好的理由,但可能需要团队中经验丰富的人才能正确地进行设置
我从未见过将这两个用作反对ORM的论据,而本文开头的错误用法却经常被使用,这使我相信,对ORM狂热的人们很少知道他们在说什么。
参考: ORM Haters不要从Bozho的技术博客博客上的JCG合作伙伴 Bozhidar Bozhanov那里 得到它 。

翻译自: https://www.javacodegeeks.com/2012/05/orm-haters-dont-get-it.html

ORM仇恨者无法理解相关推荐

  1. orm的理解_ORM仇恨者无法理解

    orm的理解 我看过无数的文章和评论(尤其是评论),它们告诉我们ORM(对象关系映射)概念的严重性,糟糕性和错误性. 以下是通常的声明,以及我对它们的评论: "它们很慢" –映射有 ...

  2. 【ORM框架】go语言ORM框架 - gorm快速入门

    文章目录 前言 一.正确看待orm 1.什么是orm 2.常用的orm 3.orm的优缺点 4.如何正确看待orm和sql之间的关系 二.gorm入门 前言 Gorm 是 Golang 的一个 orm ...

  3. SQL基础知识回顾--(Go/Python/Beego ORM/Django ORM/原生Sql)

    序言 Filecoin即将上线.我们知道filecoin是由goLang编写的,所以在此间歇期,我打算同时复习一下go和python的知识,本文的侧重点在于如何高效率的使用orm-sql语句. Go操 ...

  4. Flask中的ORM使用

    前言 ORM拓展 安装 数据库设置 使用 关系 单表操作 建表 应用表结构 CRUD 添加查找操作 更新操作 删除操作 一对多 多对多 总结 前言 最近几天接触了一下Flask,在惊叹于其简洁性的同时 ...

  5. Spring Boot 使用 Dom4j XStream 操作 Xml

    阅读目录 0 Dom4j XStream 简单介绍 Dom4j XStream 1 新建 Spring Boot Maven 示例工程项目 2 引入依赖 Pom 3 Dom4j 代码实例 3.1 打开 ...

  6. Java EE企业应用实战

    前 言 目前Java EE应用的开发方式大致可分为两种:一种以Spring.Hibernate等开源框架为基础,这就是通常所说的轻量级Java EE应用:另一种则以EJB 3+JPA为基础,也就是本书 ...

  7. 什么是JPA?Java持续性介绍

    新钛云服已累计为您分享723篇技术干货 本文将了解基于 Hibernate 的 Java 持久化标准,学习如何使用 JPA 在关系数据库或 NoSQL 数据库中存储和管理 Java 对象. 作为一种规 ...

  8. MyBatis 01 快速入门

    MyBatis 01 快速入门 文章目录 MyBatis 01 快速入门 一.学习目标 二.为什么需要框架技术 三.框架技术介绍 四.主流框架介绍 五.持久化与ORM 六.MyBatis简介 七.搭建 ...

  9. 【备战秋招系列-4】Java高频知识——并发、Spring、MySQL、redis

    并发 20 P1:Java 内存模型 Java 线程的通信由 JMM 控制,JMM 的主要目的是定义程序中各种变量的访问规则,关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节.此处的 ...

最新文章

  1. 爆笑!论文中,这些话的实际意思是...
  2. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线
  3. 安装程序检测到无法验证文件的发行者_InstallShield Installation 文件
  4. CSS 修饰图片的5种方法
  5. SQL Server 2017 正式发布
  6. Joy of Handcraft Gym - 102822J(线段树或差分)
  7. 2 MM配置-企业结构-定义-定义工厂代码
  8. Fix Backup Database is terminating abnormally When performing a Farm Backup
  9. [Java] 蓝桥杯ALGO-39 算法训练 数组排序去重
  10. log4j.properties中log4j.rootLogger 与log4j.rootCategory 有什么区别 .
  11. AI智能语音识别算法原理 二
  12. 光纤的用途及主要种类
  13. 港股上市公司公告 API 数据接口
  14. 计算机cad实训日记,cad制图实习日记范文
  15. 基于SRS的视频直播服务器搭建
  16. Quoted-printable
  17. Python统计微信消费!生成微信消费账单!真强大!
  18. win10系统用激活码激活,用dos命令来激活,只能激活半年时间,暂时没找到永久的。
  19. CSS 列表样式 (ul)
  20. 【图割】最大流/最小割算法详解(Yuri Boykov and Vladimir Kolmogorov,2004 )

热门文章

  1. C语言的运算符的优先级与结合性+ASCII表
  2. php cdi_通过MicroProfile上下文传播增强了CDI上下文和隔板
  3. jakarta ee_Jakarta EE的拟议命名空间
  4. jakarta ee_Jakarta EE 8状态
  5. 如何将网页部署到maven_如何通过Rultor将Maven工件部署到CloudRepo
  6. graalvm_GraalVM上的Picocli:极快的命令行应用程序
  7. dc/os_DC / OS中具有Java和数据库应用程序的服务发现
  8. javafx 使用_何时使用JavaFX代替HTML
  9. javafx显示image_JavaFX技巧20:有很多要显示的吗? 使用画布!
  10. Java EE MVC:处理表单验证