ORM是什么?如何理解ORM?

一、ORM简介 
        对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法。 
        这种方案存在以下不足: 
        1.持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口 
        2.持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,毒药修改持久化曾的相关程序代码,增加了软件的维护难度。 

        ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。Java典型的ORM中间件有:Hibernate,ibatis,speedframework。 
        ORM的方法论基于三个核心原则: 
  · 简单:以最基本的形式建模数据。 
  · 传达性:数据库结构被任何人都能理解的语言文档化。 
  · 精确性:基于数据模型创建正确标准化了的结构。 

二、ORM的概念 
        让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。 
        当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。 

        ORM解决的主要问题是对象关系的映射。域模型和关系模型分别是建立在概念模型的基础上的。域模型是面向对象的,而关系模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。 
        ORM技术特点: 
        1.提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。 
        2.ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。 

三、ORM的优缺点 
        ORM的缺点是会牺牲程序的执行效率和会固定思维模式。 
        从系统结构上来看,采用ORM的系统一般都是多层系统,系统的层次多了,效率就会降低。ORM是一种完全的面向对象的做法,而面向对象的做法也会对性能产生一定的影响。 

        在我们开发系统时,一般都有性能问题。性能问题主要产生在算法不正确和与数据库不正确的使用上。ORM所生成的代码一般不太可能写出很高效的算法,在数据库应用上更有可能会被误用,主要体现在对持久对象的提取和和数据的加工处理上,如果用上了ORM,程序员很有可能将全部的数据提取到内存对象中,然后再进行过滤和加工处理,这样就容易产生性能问题。 
        在对对象做持久化时,ORM一般会持久化所有的属性,有时,这是不希望的。 
        但ORM是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。但我们不能指望工具能一劳永逸的解决所有问题,有些问题还是需要特殊处理的,但需要特殊处理的部分对绝大多数的系统,应该是很少的。

转载于:https://www.cnblogs.com/Simon-Qi/p/9962902.html

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

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

相关文章

遍历Map keySet和entrySet

public class test {public static void main(String[] args) {Map<String, String> map new HashMap<String, String>();map.put("1", "广东");map.put("2", "广西");map.put("3", "广南");map.put…

falcon适配ldap密码同步

问题 小米的openfalcon在使用ldap首次登陆成功后,会在本地创建同名的账号, 这就有个问题当你更新了ldap的密码时,openfalcon是没有同步本地账号密码的功能 二次改造 方便我们debug, 先把日志的debug打开,默认是没有运行时日志的,只有console日志 # 编辑文件 dashboard/rrd/util…

如何有效的使用 for循环和Iterator遍历

遍历ArrayList 使用for循环遍历的速度会比Iterator遍历的速度要快&#xff1a; for (int i0, nlist.size(); i < n; i)list.get(i);runs faster than this loop:for (Iterator ilist.iterator(); i.hasNext();)i.next();采用ArrayList对随机访问比较快&#xff0c;而for循环…

【js】数组置空的其他方式及使用场景

数组在js中属于引用型类型。 var arr [1, 2, 3]; a []; 通常使用以上方式。如果使用场景必须使用方法置空&#xff0c; 可以采用arr.length 0; 或者使用a.splice(0, a.length); 使用场景 vue2中组定义组件中v-model的值是数组类型&#xff0c; 组件内部需要清空时&#xff0…

Postgresql 填充所有的时间点

最近使用有个业务需要展示20190101和20190106所有的时间段&#xff0c;例如 20190101 20190102 20190103 20190104 20190105 20190106但是数据库中存的只有以下 20190101 20190102 20190104 20190106那我们需要把20190103、20190105填充进去。 方式一&#xff1a; 新建个存储…

分类与监督学习,朴素贝叶斯分类算法

1.理解分类与监督学习、聚类与无监督学习。 &#xff08;1&#xff09;简述分类与聚类的联系与区别。 分类就是按照某种标准给对象贴标签&#xff0c;再根据标签来区分归类。聚类是指事先没有“标签”而通过某种成团分析找出事物之间存在聚集性原因的过程。 区别是&#xff0c…

Postgre合并多行数据为一行

业务情景描述&#xff1a;用户需要一行展示所有的文件名称&#xff0c; 比如&#xff1a;你的1.txt、2.txt、3.txt未上传成功&#xff0c;请核查&#xff01; SELECT * FROM fileTable --查询结果如下&#xff1a; 1.txt 2.txt 3.txt方式一&#xff1a;使用string_agg函数&…

如何学好Spring

要学好Spring&#xff0c;首先要明确Spring是个什么东西&#xff0c;能帮我们做些什么事情&#xff0c;知道了这些然后做个简单的例子&#xff0c;这样就基本知道怎么使用Spring了。Spring核心是IoC容器&#xff0c;所以一定要透彻理解什么是IoC容器&#xff0c;以及如何配置及…

数据库查询字段为空时,返回0

oracle select nvl(字段名,0) from 表名; sqlserver select isnull(字段名,0) from 表名; mysql select ifnull(字段名,0) from 表名; postgresql select coalesce(字段名,0) from 表名;

一张图搞定OAuth2.0

转发&#xff1a;https://www.cnblogs.com/flashsun/p/7424071.html 目录 1、引言2、OAuth2.0是什么3、OAuth2.0怎么写1、引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式&#xff1a;授权码模式 非常简单的一件事情&#xff0c;网上一堆神乎其神的讲解&#xff0c;让…

insert select 过滤掉重复数据

INSERT INTO SELECT 语句从一个表复制数据&#xff0c;然后把数据插入到一个已存在的表中。 table1和table2表结构一样时&#xff1a; INSERT INTO table2 SELECT * FROM table1;table1和table2表结构不一样时&#xff1a; INSERT INTO table2(field1,field2,field3) SELECT …

jdbc连接sqlserver,mysql,oracle

class xxx{private static String port "1433";private static String ip "192.168.2.163";//mysql : jdbc:mysql:////sqlserver : jdbc:sqlserver// 或者 jdbc:microsoft:sqlserver://private static String driverType "jdbc:sqlserver://&qu…

extjs展示列表,显示来很多空白行,但是数据没显示

检查&#xff1a; mysql查询是没有大小写问题 sql返回的字段大小写问题 Map<String, Object> result new hashmap<String, Object>();创建的map、key是有大小写区分 Map<String, Object> result new CaseInsensitiveMap(); 中的key是没大小写区分 最后…

linux部署redis详细步骤

公司一直在使用redis集群&#xff0c;寻思着自己也部署一套练练手。 打开redis的官网下载页&#xff1a;https://redis.io/download 按照官网的步骤进行操作&#xff1a; 你会发现输入src/redis-cli命令之后&#xff0c;一直连接不上。 提示信息&#xff1a;Could not connect …

四则运算 结对项目

github 地址:https://github.com/wangshicheng0213/HomeWork02 一、基本要求 1) 实现一个带有用户界面的四则运算。 2) 生成的题目不能重复。 3) 支持负数&#xff0c;例如-1&#xff0c;-1/2&#xff0c;-3‘4/5等。 4) 题目的数量&#xff08;个人项目的要求&#xff09; 5) …

linux部署redis集群遇到的问题

版本信息&#xff1a; redis&#xff1a;5.0.8 linux服务器&#xff1a;CentOS 7 不同版本问题处理方式可能有所不同 1、在java程序中&#xff0c;连接不上redisCluster。 报错信息&#xff1a; no reachable node in cluster 原因&#xff1a;创建集群时&#xff0c;使用了127…

大型数据库

over&#xff08;order by salary&#xff09; 按照salary排序进行累计&#xff0c;order by是个默认的开窗函数 over&#xff08;partition by deptno&#xff09;按照部门分区 如何使用Oracle Round 函数 (四舍五入)描述 : 传回一个数值&#xff0c;该数值是按照指定的小数位…

mysql服务自动关闭的解决

笔记本上设置成合上板子不休眠&#xff0c;于是干脆把笔记本放在书包里面&#xff0c;通过远程桌面连接笔记本电脑&#xff0c;经过了很长的时间&#xff0c;再去连接数据库&#xff0c;结果出现cann’t connect 10061错误&#xff0c;发现原来是MySQL服务不知怎么的就关闭了&a…

thinkPHP 数据库操作和分页类

转载于:https://www.cnblogs.com/finddata/p/10013962.html

RHCE基础环境系统的搭建

RHCE基础环境系统的搭建 安装前提&#xff1a; 安装的时候对系统和硬件的要求&#xff1a; 红帽系统安装队系统的要求&#xff1a;Windows操作系统选择64位的内存至少6GCPU需要支持虚拟化技术在做红帽系统实验的时候&#xff0c;把360类似这样的杀毒或是管家软件退出了&#xf…