Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射。

ORM 对象关系映射,这样说还是懵。 这里比较难理解的是 关系 —— 即Relationl ,虽然看起来是形容词,但是理解为名称应该更加合理。当然,也不要纠结这个。可以这样理解,对象:java Model,对应一个实体类,关系:关系型数据库,对应一个数据库表,映射:就是具体对应关系。ORM 其实是 更加自然的表述了我们对事务的描述,类似ER图(仅仅是概念层面)一样,对象数据库的PDM(仅仅是数据库层面) 文件一样。 但是ORM 更深了一步,它跨越了 数据库和 应用程序。 它 更多关注的是 映射。 使得我们可以 隐藏某些数据库的细节,从而 “更加直接的” 通过应用程序来操作数据库。虽然减轻了某些方面的工作,但是也对我们的提出了额外的要求, 就是我们需要来仔细维护这个 “映射”。

映射是必不可少的, 我们通常需要一个 xml 文件来描述这个映射。 当然, 现在JPA 也可以使用 注解了。常见的映射种类有:

  1. 3、关联映射模式
  2. 3.1一对一关联模式:在关联两端各加一列。
  3. 3.2一对多关联模式:和3.1一样。如果多这端是有序的,还需加入一列表示序号。
  4. 3.3多对多关联模式:将关联单独作一个表。
  5. 3.4组合关联模式:注意级联式删除。
  6. 3.5反演关联模式:关联两端指向相关的类型,和普通关联一样。
  7. 3.6成对关联模式:关联记录两个类间的关系,用交集类表示关联,表示成一个单独的表,每个关联对应一个表,用外键表示它们间的关系。
  8. 3.7关联上的OCL需要分析成对应的存储过程代码。
  9. 3.8保证关联的CARDINALITY也需要分析成对应的存储过程代码。

映射关系是很多种的,上面也仅仅是一部分而已。 更多的映射,需要特定场景才有用到。Hibernate 对我们的这种映射做了很多 封装工作。

在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。

优势

第一:隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。

第二:ORM使我们构造固化数据结构变得简单易行。在ORM年表的史前时代,我们需要将我们的对象模型转化为一条一条的SQL语句,通过直连或是DB helper在关系数据库构造我们的数据库体系。而现在,基本上所有的ORM框架都提供了通过对象模型构造关系数据库结构的功能。这,相当不错。

缺点

第一:无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。

第二:面向对象的查询语言(X-QL)作为一种数据库与对象之间的过渡,虽然隐藏了数据层面的业务抽象,但并不能完全的屏蔽掉数据库层的设计,并且无疑将增加学习成本.

第三:对于复杂查询,ORM仍然力不从心。虽然可以实现,但是不值的。视图可以解决大部分calculated column,case ,group,having,order by, exists,但是查询条件(a and b and not c and (d or d))。

世上没有驴是不吃草的(又想好又想巧,买个老驴不吃草),任何优势的背后都隐藏着缺点,这是不可避免的。问题在于,我们是否能容忍缺点。

常用的ORM框架

(1)Hibernate  全自动,需要些hql语句

(2)iBATIS  半自动自己写sql语句,可操作性强,小巧

(3)EclipseLink  一个可扩展的支持JPA的ORM框架,供强大的缓存功能,缓存支持集群。

(4)Apache OJB等等

(5)JPA

显然, Hibernate  对ORM支持是最好的,mybatis 不是那么好。ORM 不是银弹,虽然我们不再需要直接面对sql 、jdbc,但是,我们又多了一个工作,我们需要管理映射。

对于Hibernate,我们需要编写hbm.xml文件。

对于iBATIS  、mybatis ,我们需要写 mapper 的 xml文件,xml里面需要映射 然后还要写 sql 文件。当然,现在的 tk-mybatis / mybatis-plus 好像不用写 sql 文件了。

对于JPA,好像就跟 mybatis-plus 一样的。 (我现在有点搞不清楚两者区别)

  1. ORMObject Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。
  2.  
  3. 只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。当前ORM框架主要有五种:Hibernate(Nhibernate),iBATISmybatisEclipseLinkJFinal
  4. ORM是通过使用描述对象和数据库之间映射的元数据,在我们想到描述的时候自然就想到了xml和特性(Attribute).目前的ORM框架中,Hibernate就是典型的使用xml文件作为描述实体对象的映射框架,而大名鼎鼎的Linq则是使用特性(Attribute)来描述的。
  5.  
  6. 元数据
  7. 是描述其它数据的数据 data about other data),或者说是用于提供某种资源的有关信息的结构数据(structured data)。元数据是描述信息资源或数据等对象的数据,其使用目的在于:识别资源;评价资源;追踪资源在使用过程中的变化;实现简单高效地管理大量网络化数据;实现信息资源的有效发现、查找、一体化组织和对使用资源的有效管理。

ORM与DB Helper Library:

很多人可能都接触过这类的helper,每个公司都有自己的helper。许多Helper提供了很多的强大的功能,封闭交互底层,实体类支持,提供SQL翻译功能。ORM比之这些Helper只是多提供了一层,他尝试封闭的自动化的(或是映射文件)来实现关联。以前,这都是我们手打的。(灵活替换数据库也算ORM优点,

问题就在与有些人发现封闭的自动化关联满足他们需要了,所以ORM对他而言是成功的。而有些人发现封闭的自动化关联不适合他们的项目,所以ORM被诟病。

写到这里,我想不用多言了。该结束了。

我的观点是ORM试图取代helper,为此提供了更多的功能。他为了应付更加严格和复杂的企业需求而不断发展,在很多情况下,这些工具开始具有自身的复杂性,使得开发人员必须学习使用它们的详细规则,并修改组成应用程序的类以满足映射系统的需要,使用它们所面临的复杂性反而盖过了所能获得的好处。在我们的大部分项目中Helper依然是我们构建数据持久层的主力,ORM或许在有些项目(模块)中可以独揽一切,但是ORM(就目前而言)无法面对一切考验。

参考:

https://blog.csdn.net/zhanghongjie0302/article/details/47344417

https://baike.baidu.com/item/ORM

https://baike.baidu.com/item/ORM%E6%A1%86%E6%9E%B6/15541111

https://blog.csdn.net/sgear/article/details/7408251

再论 ORM的更多相关文章

  1. 为什么不推崇复杂的ORM

    上一篇文章写完,回复的人很多,有的说的很中肯,有的貌似只是看到文章的标题就进来写评论的!还有人问为什么我要屏蔽掉[反对]按钮,因为谁写文章都是为了分享,都在说出自己的心得体会.不过由于大家遇到的项目, ...

  2. 关于ORM的浴室思考

    这是一个由EF群引发的随笔 平时在一个EF群摸鱼,日常问题可以归纳为以下几种: 这条sql用linq怎么写? EF可以调用我写的存储过程么? EF好慢啊一些复杂查询写起来好麻烦-- 为什么会有这些问题 ...

  3. 也来写写基于单表的Orm(使用Dapper)

    前言 这两天看园子里有个朋友写Dapper的拓展,想到自己之前也尝试用过,但不顺手,曾写过几个方法来完成自动的Insert操作.而对于Update.Delete.Select等,我一直对Diction ...

  4. 话说C#程序员人手一个ORM

    话说C#程序员人手一个ORM,确实没有必要再写ORM了,不过我的ORM并不是新的,是从DBHelper演化过来的,算是DBHelper魔改版. 目前流行的ORM有EF.Dapper.SqlSugar. ...

  5. ORM中choices参数(重要)、MTV于MVC模型、多对多关系三种创建方式

    choices参数(重要) **使用方式

  6. 3小时搞定一个简单的MIS系统案例Northwind,有视频、有源代码下载、有真相

    一.瞎扯框架.架构 楼主自从1998年从C语言.MASM.Foxbase开始学计算机开始接触这个行当16年以来,2001年干第一份与程序.软件.然后是各种屌的东西开始,差不多干了13年了,这13年来, ...

  7. 【强烈推荐】数据库迁移利器:Migrator.Net

    简介 很郁闷,写了一天的遇到LiveWriter错误,可恶啊 几年前在做项目中第一次接触到了Migrator.Net,就深深被吸引住了,至此以后在新的大项目中,我都会使用Migrator.Net来创建 ...

  8. Entity Framework4.0 (一)概述(EF4 的Database First方法)

    转自:http://www.cnblogs.com/marksun/archive/2011/12/15/2289582.html Entity Framework4.0(以后简称:EF4),是Mic ...

  9. 从点击到呈现 — 详解一次HTTP请求

    一般来说,很多的参考资料上面都会说,http 是一个基于请求/响应的工作模式,然后画出一张浏览器和服务器的 b/s 结构图,再画上两个箭头,表示请求和响应,应该说这么解释是易懂的,一般也是够清楚的,但 ...

随机推荐

  1. AX3298添加新sensor

    这是编译的工程目录. 1,先把sensor对应的驱动比如GC1034.c添加到工程.然后编译成库.会在res目录下生产sensor.bin文件 流程:编译后在debug目录生成 elf 文件AX329 ...

  2. php 服务端允许跨域访问

    加上需要允许跨域访问,配置如下(一下配置内容前不允许有其他任何输出操作): //设置允许跨域的 请求源地址//方式一:header("Access-Control-Allow-Origin: ...

  3. flume安装配置

    1 下载安装包并解压 下载地址:http://flume.apache.org/download.html 解压:tar zxvf apache-flume-1.8.0-bin.tar.gz 2 配置 ...

  4. 私有IP

    私有IP地址段为10.0.0.0-10.255.255.255,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255.

  5. Win10无法访问网上邻居电脑共享的文件夹怎么办

    Win10无法访问网上邻居电脑共享的文件夹怎么办 现在许多电脑上装的都是Win系统,Win10无法访问网上邻居电脑共享的文件夹怎么办呢?下面小编为大家介绍下解决的方法吧! 1点击桌面上的“此电脑”图标 ...

  6. bond-vlan-bridge

    拓扑介绍 Eth-Trunk5 down down 0% 0% 0 0 10GE1/0/5 down down 0.01% 0.01% 0 0 10GE2/0/5 down down 0.01% 0% ...

  7. [delphi]在DLL中多线程同步Synchronize卡死问题

    在dll中多线程同步调用Synchronize不可以,会出现假死卡住的现象.可通过Sendmessage实现. 转网上其他文章解释: Application.Initialize; begin     ...

  8. Redis入门的简单使用

    Redis是什么? redis是一个开源的,面向键/值对的NOSQL的分布式数据库系统 NOSQL指的是非关系型的数据,简单直白地讲就是在非关系型的数据库中不存在表的概念,而是以键值对的方式, 即一个 ...

  9. JDK安装教程

    打开我的电脑,在D盘中新建一个文件夹,名字为develop 进入develop,创建一个新文件夹,名字叫做jdk 双击JDK的安装包, .4.出如图所示的框,选择下一步 .5.更改安装路径,选择更改 ...

  10. nginx 配置说明

    ======nginx 配置文件分开==== http://blog.csdn.net/baple/article/details/44197981 1.备份现在有nginx.conf2.复制ngin ...