ORM的概念, ORM到底是什么

本文介绍了ORM(ObjectRelationalMapping)技术的基本概念及其在软件开发中的应用。ORM作为一种解决面向对象与关系数据库互不匹配现象的技术手段,简化了数据持久化的操作,提高了开发效率。同时也探讨了ORM的优缺点。

转 http://www.cnblogs.com/wgbs25673578/p/5140482.html

一、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是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。但我们不能指望工具能一劳永逸的解决所有问题,有些问题还是需要特殊处理的,但需要特殊处理的部分对绝大多数的系统,应该是很少的。

<think>好的,我现在要回答用户关于ORM概念及原理的问题。首先,我需要回顾用户提供的引用内容,确保信息准确并正确引用。 用户提到了四个引用,其中引用[1]和引用[2]详细介绍了ORM的基本概念、原理以及实现方法。引用[3]和引用[4]讨论了高级功能,比如Django ORM的模型继承和F对象,但用户主要关注的是概念和原理,所以可能暂时不需要深入这些高级内容。 首先,ORM的定义是什么?根据引用[1],ORM是对象关系映射,是一种编程技术,用于在面向对象编程语言和关系数据库之间建立映射关系。这样开发者可以用面向对象的方式操作数据库,无需直接编写SQL。这点很重要,需要明确说明。 接下来,原理部分。引用[2]提到了反射和Attribute在ORM中的应用,以及如何通过实体模型映射数据库表。ORM的核心原理包括元数据映射、SQL生成和事务管理。需要分解这几个部分,解释每个部分的作用。例如,元数据映射指的是将类与数据库表、属性与字段对应起来,可能需要用反射机制读取类的结构,并生成对应的表结构。 然后,用户可能需要了解ORM的优势和劣势。根据引用[1],优势包括提高开发效率、降低SQL学习成本、增强可维护性。劣势可能有性能问题,复杂查询不如手写SQL高效,这在引用[3]的高级功能中可能部分得到缓解,但用户的问题不涉及这些,所以简要提及即可。 此外,引用[2]中的步骤,如创建数据库表和实体模型,映射生成SQL语句,这部分可以说明ORM如何通过模型类自动生成CRUD操作的SQL,例如insert语句的组合。例如,当保存一个对象时,ORM会将其属性值提取并拼接到INSERT语句中,这涉及到反射和动态SQL生成,可能需要具体例子,但用户示例中未提供代码,所以保持理论解释。 需要确保回答结构清晰,分点说明概念、原理、优缺点。同时,正确添加引用标记,比如在定义部分末尾加上[^1],在原理部分引用[^2]。 最后,生成相关问题时要围绕ORM的基本概念、原理、常用框架、优缺点等,确保问题有助于用户进一步学习。例如,如何实现ORM映射,常用框架有哪些,优缺点比较等。 现在检查是否有遗漏或错误:确保每个引用正确对应到内容,原理部分涵盖元数据、SQL生成、事务管理,优势劣势明确,回答符合中文要求,行内公式正确使用$...$,但这里可能不涉及数学公式,所以可能不需要。独立公式部分同样,但ORM通常不涉及数学表达式,所以可能没有用到。需要确保LaTeX语法正确,但此处可能没有使用。最后,生成的问题要相关,帮助用户深入理解。</think>### ORM概念及原理 **ORM(对象关系映射)** 是一种编程技术,用于在面向对象编程语言和关系型数据库之间建立数据转换的桥梁。其核心目标是让开发者能够通过操作对象(类实例)来间接管理数据库,而无需直接编写复杂的SQL语句。 #### 核心概念 1. **对象与表的映射** ORM将数据库中的表结构映射为程序中的类(实体模型),表的每一列对应类的属性。例如,一个`User`类可能对应数据库中的`users`表,类的属性`id`、`name`对应表的字段`id`、`name`。 2. **操作抽象化** 开发者通过调用对象的方法(如`save()`、`delete()`)即可自动生成并执行对应的SQL语句(如`INSERT`、`DELETE`),无需手动拼接SQL字符串。 3. **数据关系映射** ORM支持一对一、一对多、多对多等数据库关系的映射。例如,通过外键关联的两个表,在代码中可通过类的属性直接访问关联对象[^3]。 #### 实现原理 1. **元数据映射** ORM框架通过反射或注解(如Python的`@classmethod`)读取类的元数据(如属性名、类型),并将其映射到数据库表的字段定义。例如,引用中提到的“实体模型映射数据库表”即依赖此机制。 2. **SQL生成与执行** ORM将对象的操作(如保存、查询)动态转换为SQL语句。例如,当调用`user.save()`时,框架会根据类的属性生成类似`INSERT INTO users (name) VALUES ('Alice')`的语句[^2]。 3. **事务管理** ORM提供事务的封装,支持自动提交或回滚。例如,在Django ORM中,可以通过`with transaction.atomic()`管理事务边界。 #### 优势与局限 - **优势** - **开发效率高**:减少重复的SQL编写工作。 - **代码可维护性强**:数据操作集中在模型类中,逻辑更清晰。 - **跨数据库兼容**:更换数据库时只需修改配置,无需重写逻辑。 - **局限** - **性能损耗**:复杂查询可能因自动生成的SQL不够优化而变慢。 - **灵活性受限**:极端场景下仍需手写SQL。 --- ### § 1. ORM框架如何实现数据库表的自动创建? 2. 常见的ORM框架有哪些(如Django ORM、SQLAlchemy)?它们的特点是什么? 3. 在哪些场景下不适合使用ORM? 4. ORM如何处理数据库迁移(如字段修改、表结构变更)? 5. 如何通过ORM实现多表联合查询?[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值