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

orm的理解

我看过无数的文章和评论(尤其是评论),它们告诉我们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年的框架比您自己的映射器要好,并且它们在顶部提供了许多必要且重要的附加功能他们的核心功能。 他们也有两个弱点(他们实际上都说“您需要知道自己在做什么”):
  • 它们很容易被滥用,这可能导致从数据库中获取大量不必要的结果。 您可以非常轻松地创建mapping脚的映射,这会减慢您的应用程序的速度。 当然,有一个好的映射是您的责任,但是ORM并没有真正帮助您
  • 他们的会话管理很复杂,尽管有很好的理由,但可能需要团队中经验丰富的人才能正确地进行设置
我从未见过将这两个用作反对ORM的论据,而本文开头的错误用法却经常被使用,这使我相信,对ORM狂热的人们很少知道他们在说什么。
参考: ORM Haters不要从Bozho的技术博客博客上的JCG合作伙伴 Bozhidar Bozhanov那里 得到它 。

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

orm的理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为手机打字声音怎么开启_华为手机这5个超实用小功能,记得要开启,谁用都说好...

华为手机这5个超实用小功能,记得要开启,谁用都说好用过华为手机的用户应该都知道,emui优化的很到位,同时也给用户非常好的体验感,随着系统的优化,功能也是越来越完善,不仅越来越好用&#xff0c…

ORM进阶之Hibernate 的三大对象

ORM进阶之 ORM简单介绍 ORM进阶之Hibernate 简单介绍及框架搭 ORM进阶之Hibernate 的三大对象 我们在上一篇博客中讲到了怎样搭建一个Hibernate框架, 提到Hibernate我们就不得不说他的三大对象,Configuration,SessionFactory , Se…

与Java EE和Spring的集成架构

本周在纽约举行的OReilly软件体系结构大会将举行 。 我很高兴与Josh Long一起提供了有关如何集成Java EE和Spring的教程。 一段时间以来,我们一直在开玩笑。 某些人想到的对两种技术的超级愚蠢见解使我们俩都感到困扰了一段时间。 这次演讲的另一个重要原因是&#…

推广的euclid_欧几里德(Euclid)贴近度评价法在人类进化上的应用

文●螭母:1008一s688 12001)Ol一0006—03 欧几里德(Euclid)贴近度评价法在人类进化上的应用 刘国民1,宋香梅2 (1奉溪拜专,皋溪117022;2.本溪市圆税局,苯澳117022) 搞要:用F唧数学中的欧几里德贴…

HTML个人笔记

<hr/> 水平线标签 <hr style "whidth:80px"/>设置水平线宽度&#xff1b; <hr style "whidth:80%"/>居中 <hr style "whidth:80%" align "left"/>段落的80%&#xff0c;居左&#xff1b; ol>li*5tab生产5…

qt 保存绘制图片时背景变黑_QGraphicsScene绘制背景图片引起的问题

项目是基于Qt的图形视图框架编写的&#xff0c;现有个需求是要在图形中加入自定义的背景图片。心想不就是个背景图片吗&#xff1f;只要重写drawBackground函数我想怎么画就怎么画啊。于是立马从QGraphicsScene类中派生了一个CScene类&#xff0c;并重写了虚函数drawBackground…

JavaScript | JSON基本格式

————————————————————————————————————————————————————————— JSON 语法 "use strict"; // 简单值 "hello,world" // 必须使用双引号// 对象 {"name": "hugh","age&…

Linux命令大全(文件管理)

Linux命令&#xff08;文件管理命令&#xff09; 1、cat命令。用于连接文件并打印到标准输出设备上。 参数: -n 从1开始对所有的输出行数进行编号 -b 和n类似&#xff0c;只是不算空行 -s 大于等于2个空格&#xff08;连续的&#xff09;当一个空格处理 -T 将Tab字符显示…

jmeter 生成计数器_使用密码摘要生成器扩展JMeter

jmeter 生成计数器最近&#xff0c;我不得不处理一个具有50,000条用户记录的OpenLDAP实例&#xff0c;并进行一些压力测试。 JMeter是填充LDAP的最佳选择。 但是&#xff0c;在我的情况下&#xff0c;OpenLDAP配置为不接受任何明文密码。 因此&#xff0c;我无法使用通过JMet…

c++ 查找 list中最长的字符串_查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答)...

查找不重复字符的最长子字符串&#xff08;编程面试中常见题-用8种编程语言来回答&#xff09;给定一个字符串str&#xff0c;找到不重复字符的最长子字符串。比如我们有 “ABDEFGABEF”, 最长的字符串是 “BDEFGA” 和 “DEFGAB”, 长度为6.再如 “BBBB” 最长字符串是 “B”,…

Spring Async和Java的8 CompletableFuture

众所周知&#xff0c;我不是Spring的最大粉丝&#xff0c;但是当时我在一个组织中工作&#xff0c;该组织使用Spring&#xff08;以不同的形式和版本&#xff09;维护了太多的项目。 我仍然对Spring持怀疑态度&#xff0c;当然有一些很好的主意&#xff0c;有一些很好的&#x…

JustOj 1032: 习题6.7 完数

题目描述 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。 例如&#xff0c;6的因子为1、2、3&#xff0c;而6123&#xff0c;因此6是"完数"。 编程序找出N之内的所有完数&#xff0c;并按下面格式输出其因子&#xff1a; 输入 N 输出 ?…

mysql 触发器 本表_MySQL触发器处理本表数据

关于MySQL的触发器&#xff0c;基本上每个Mysql教程里都有讲到&#xff0c;但是我发现那些教程里讲的都是如何处理其他表的数据。在MySQL中写触发器操作关于MySQL的触发器&#xff0c;基本上每个Mysql教程里都有讲到&#xff0c;但是我发现那些教程里讲的都是如何处理其他表的数…

JS 操作cookie

平时网站的开发中cookie用的还是用的比较多的&#xff0c;因为cookie在客户端&#xff0c;所以用js操作的比较多&#xff0c;下面是常用的设置、查找、删除等功能实现。 function addCookie(objName, objValue, objHours){//添加cookie var str objName "" esc…

官方野生蝇群流口水分数

官方是什么&#xff1f; 标题太小&#xff0c;但有用的贡献。 Wildfly Swarm允许我们创建相当小的自包含应用程序&#xff0c;包括我们从Wildfly Application Server中需要的应用程序。 在这篇文章中&#xff0c;我们将研究与Wildfly Swarm合作使用的Drools分数 。 该部分背后的…

SQL-十步完全理解 SQL

十步完全理解 SQL http://blog.jobbole.com/55086/ 刚开始看到了 执行顺序&#xff0c;写得挺好的&#xff0c;明天继续转载于:https://www.cnblogs.com/hpyg/p/7270168.html

MySQL 高水位update_Oracle delete 高水位线处理问题

最近遇到oracle 表中数据量很大查询和更新比较慢 需要删除&#xff0c;发现删除后查询速度还是很慢&#xff0c;原来是delete oracle 高水位没有下降的最近遇到Oracle 表中数据量很大查询和更新比较慢 需要删除&#xff0c;发现删除后查询速度还是很慢&#xff0c;原来是delete…

jasperreports_JasperReports JSF插件用例–简单列表报告

jasperreports这是JasperReports JSF插件系列的第一篇“用例文章” &#xff0c;我将专注于一个简单的需求&#xff0c;并且我将进一步深入。 起点是我们已经为图书商店完成的项目设置&#xff0c;我将向其中添加一个列表&#xff0c;其中包含在数据库中注册的其他图书&#xf…

mysql optimizer_mysql 参数optimizer_switch

mysql 5.1中开始引入optimizer_switch, 控制mysql优化器行为。他有一些结果集&#xff0c;通过on和off控制开启和关闭优化器行为。使用有效期全局和会话两个级别&#xff0c;在5.5中optimizer_swtich 可取结果如下&#xff0c;不同mysql版本可取结果不同。5.1和5.6参考官方文档…

2个菜鸟Java常量和枚举陷阱

在对Java和Groovy代码进行的各种代码审查中&#xff0c;我经常看到魔术数字和其他随机字符串在整个代码库中乱七八糟。 例如&#xff0c;魔术数字是下面的代码&#xff08;Groovy&#xff09;中的4.2&#xff1a; if (swashbuckle > 4.2) {... }4.2是什么意思&#xff1f;…