surpassdream 2016-01-26
1.ORM介绍
1.1 什么是ORM,为什么要用ORM框架?
ORM的全称是Object/Relation Mapping,对象/关系数据库映射。ORM可以理解成一种规范,它概述了这类框架的基本特征:完成面向对象编程语言和关系型数据库的映射。当ORM框架完成映射后,它既可利用面向对象程序设计语言的简单易用性,又可以利用关系型数据库的技术优势。因此,我们可以把ORM框架当成是应用程序和数据库的桥梁。
当我们使用一种面向对象程序设计语言来进行应用开发时,从项目开始起就采用的是面对对象分析、面向对象设计、面向对象编程,但到了持久层数据库访问时,又必须重返关系型数库的访问方式,这是一种糟糕的感觉。于是我们需要一种工具,它可以把关系型数据库包装成一个面向对象的模型,这个工具就是ORM框架。
ORM优势:
1 | 一个API来对持久化类的对象执行基本的CRUD操作。 |
2 | 语言或API来指定引用的类和类的属性查询。 |
3 | 一个可配置的设备,用于指定映射元数据。 |
4 | 技术与事务对象交互,以执行脏数据检查,懒关联加载,以及其他优化功能。 |
1.2 ORM映射机制
ORM工具提供了持久化类和数据表之间的映射关系 ,通过这种关系的映射过渡,我们可以很方便地通过持久化类对数据表进行操作。实际上,所有ORM工具大致上都遵循相同的映射思路。
ORM基本映射有如下这几条映射关系:
(1) 数据表映射类:
持久化类被映射到一个数据表。当我们使用这个持久化类来创建实例、修改属性、删除实例时,系统自动会转换为对这个表进行CRUD操作,下图显示了这种映射关系。
(2) 数据表的行映射对象(即实例):
持久化类会生成很多的实例,每个实例就对应数据表中的一行记录。当我们在应用中修改持久化类的某个实例时,ORM工具将会转换成对对应数据表中的特定行的操作。每个持久化对象对应数据表的一行记录。如下图所示:
(3) 数据表的列(字段)映射对象的属性:
当我们在应用中修改某个持久化对象的制定属性时(持久化数据映射到数据行),ORM将会转换成对对应表中指定数据行、指定列的操作。数据表列被映射到对象属性的示意图如下表示:
基于这些基本的映射方式,ORM工具可完成对对象模型和关系模型之间的相互映射,由此可见
在ORM框架中,对象持久化是一种中间媒介,应用程序只需要操作持久化对象,ORM框架则负责将这种操作转换为底层数据库操作——这种转换对开发者来说透明,无需开发者关心,从而将开发者从关系模型中解放出来,使得开发者能够以面向对象的思维操作关系型数据库。
1.3 ORM框架有哪些?
目前流行的ORM框架有如下这些产品:
(1)Hibernate:目前最流行的开源ORM框架,已经被选作JBoss的持久层解决方案。整个HIbernate项目也一并投入了Jboss的怀抱,而JBoss又加入了RedHat组织,所以现在Hibernate属于RedHat 的一部分。Hibernate 灵巧的设计、优秀的性能,还有其丰富的文档都是其风靡全球的重要因素。
(2)iBatis: Apache软件基金组织的子项目。与其称它为一种ORM框架,不如称它为一中“SQL Mapping”框架。曾经在J2EE的开发中扮演非常重要的角色,但因为不支持存粹的面向对象操作,因此现在逐渐地被取代。但是在一些公司,依然占有一席之地,特别是一些对数据访问特别灵活的地方,iBatis更加的灵活,它允许开发人员直接编写SQL语句。
(3)TopLink:Oracle公司的产品,作为一个遵循OTN协议的商业产品,TopLink 在开发过程中可以自由地下载和使用,但是一旦作为商业产品被使用,则需要收取费用。由于这一点,TopLink 的市场占有率不高。
(4)OBJ:Apache软件基金组织的子项目。另一个开源的ORM框架,可以说是Apache作为iBatis之后的取代产品,也是非常优秀的O/R Mapping框架,但是由于Hibernate 的广芒太盛,所以并未有广泛的使用,而且由于OJB的开发文档不是很多,这也影响了OJB的流行。
1.4 jdbc vs Hibernate vs myBatis ?
Hibernate不仅仅管理了Java类到数据库表的映射(包括Java 数据类型到SQL数据类型的映射),还提供查询数据和获取数据的方法,可以大幅度地减少开发时人工使用SQL和JDBC处理数据的时间。Hibernate支持几乎所有主要的RDBMS。
HIbernate能够从众多的ORM框架中脱颖而出,因为Hibernate和其他的框架对比有以下的优势:
(1)开源免费的License,方便需要时研究源代码,改写源代码,进行功能定制
(2)轻量级封装,避免引入过多复杂的问题,调试容易,减轻程序员的负担。
(3)具有可扩展性,API开放。功能不够用时,自己进行编码扩展。
(4)开发者活跃,有稳定的发展保障
下面是Hibernate应用程序体系结构的一个非常高的水平视图。
下面是Hibernate的应用架构与一些重要的核心课程的详细视图。
Hibernate使用各种现有的Java API,如JDBC,Java事务API(JTA)和Java命名和目录接口(JNDI)。 JDBC提供了常见的关系数据库功能的抽象的一个基本水平,使具有JDBC驱动程序,Hibernate的支持几乎任何数据库。 JNDI和JTA允许Hibernate与J2EE应用服务器进行集成。
Configuration 对象:
在任何Hibernate应用程序中创建并通常在应用程序初始化创建一次,它代表了Hibernate所需的配置或属性文件。
Configuration对象提供了两个按键组成部分:
1.数据库连接:这是通过Hibernate支持的一个或多个配置文件来处理。这些文件是:hibernate.properties和hibernate.cfg.xml。
2.类映射设置 :此组件创建Java类和数据库表之间的连接
SessionFactory 对象:
Configuration对象用于创建一个SessionFactory对象,它反过来可以配置Hibernate的使用提供的配置文件的应用程序,并允许一个Session对象被实例化。通过SessionFactory是线程安全的对象和使用的应用程序的所有线程。
通过SessionFactory是重量级的对象,因此通常它被应用程序时创建的启动和保持以备后用。将使用一个单独的配置文件需要每个数据库都有一个SessionFactory对象。所以,如果正在使用多个数据库,那么就需要创建多个SessionFactory的对象。
Session 对象:
Session对象用于获取与数据库的物理连接。 Session对象是重量轻,设计了一个互动是需要与数据库每次被实例化。持久化对象被保存,并通过一个Session对象中检索。会话中的对象不应该保持开放很长一段时间,因为他们通常不被线程安全的,应该被创建并根据需要销毁他们。
Transaction 对象:
事务代表一个工作单元与数据库和大部分RDBMS支持事务功能。在Hibernate事务是由一个基本的事务管理器和事务(从JDBC或JTA)来处理。
这是一个可选的对象和Hibernate应用程序可以选择不使用这个接口,而不是在他们自己的应用程序代码管理事务。
Query 对象:
查询对象使用SQL或Hibernate查询语言(HQL)字符串从数据库中检索数据并创建对象。一个查询实例是用来绑定查询参数,限制查询返回的结果数量,并最终执行查询。
Criteria 对象:
Criteria对象用于创建和执行面向对象的条件查询来检索对象。
缓存对Hibernate很重要,它采用了多级缓存方案下文所述:
第一级缓存是Session的缓存,是一个强制性的缓存,通过它所有的请求都必须通过。 Session对象不断自身的动力的对象,提交到数据库之前。
如果发出多个更新一个对象,Hibernate试图拖延尽可能长的时间做了更新,以减少发出的更新SQL语句的数量。如果您关闭会话,所有被缓存的对象都将丢失,要么持久,或在数据库中更新。
二级缓存是可选的缓存和一级缓存,总是会征询任何试图找到一个对象的二级缓存之前。第二级缓存可以在每个类和每个集合基础上进行配置,主要负责在会话缓存的对象。
任何第三方缓存可以使用Hibernate。org.hibernate.cache.CacheProvider接口提供,必须实施提供Hibernate一个句柄缓存实现。
参考博客:二级缓存配置