您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM


Posted in 面试题 onFebruary 08, 2016
对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示者额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。

对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

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

让我们从O/R开始。字母O起源于”对象”(Object),而R则来自于”关系”(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。

当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。

如果打开你最近的程序,看看DAL代码,你肯定会看到很多近似的通用的模式。我们以保存对象的方法为例,你传入一个对象,为SqlCommand对象添加SqlParameter,把所有属性和对象对应,设置SqlCommand的CommandText属性为存储过程,然后运行SqlCommand。对于每个对象都要重复的写这些代码。

除此之外,还有更好的办法吗?有,引入一个O/R Mapping。实质上,一个O/R Mapping会为你生成DAL。与其自己写DAL代码,不如用O/R Mapping。你用O/R Mapping保存,删除,读取对象,O/R Mapping负责生成SQL,你只需要关心对象就好。

对象关系映射成功运用在不同的面向对象持久层产品中,如:Torque,OJB,Hibernate,TopLink,Castor JDO, TJDO 等。
一般的ORM包括以下四部分:
一个对持久类对象进行CRUD操作的API;
一个语言或API用来规定与类和类属性相关的查询;
一个规定mapping metadata的工具;
一种技术可以让ORM的实现同事务对象一起进行dirty checking, lazy association fetching以及其他的优化操作。

Tags in this post...

面试题 相关文章推荐
为什么要优先使用同步代码块而不是同步方法?
Jan 30 面试题
介绍java中初始化块的使用
Sep 11 面试题
Java平台和其他软件平台有什么不同
Jun 05 面试题
C语言笔试题回忆
Apr 02 面试题
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
Nov 09 面试题
SQL Server 2000数据库的文件有哪些,分别进行描述。
Nov 09 面试题
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
Jun 16 面试题
下列程序在32位linux或unix中的结果是什么
Mar 25 面试题
北京麒麟网信息技术有限公司网络游戏测试面试题
Sep 28 面试题
异步传递消息系统的作用
May 01 面试题
什么是组件架构
May 15 面试题
UNIX命令速查表
Mar 10 面试题
如何启动时不需输入用户名与密码
May 09 #面试题
怎样让char类型的东西转换成int类型
Dec 09 #面试题
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
Sep 08 #面试题
大唐电信科技股份有限公司java工程师面试经历
Dec 09 #面试题
如何写出高性能的JSP和Servlet
Jan 22 #面试题
宝信软件JAVA工程师面试经历
Aug 19 #面试题
Linux中如何设置Java环境变量(Ubuntu)
Jul 24 #面试题
You might like
短波问题解答
2021/02/28 无线电
《APMServ 5.1.2》使用图解
2006/10/23 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
对python3新增的byte类型详解
2018/12/04 Python
实例讲解Python3中abs()函数
2019/02/19 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
在django view中给form传入参数的例子
2019/07/19 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
python opencv肤色检测的实现示例
2020/12/21 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
中专毕业生自荐信
2013/11/16 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸