《Hibernate技术【沐风书苑】》由会员分享,可在线阅读,更多相关《Hibernate技术【沐风书苑】(22页珍藏版)》请在金锄头文库上搜索。
1、Hibernate Hibernate 框框 架架 技技 术术在本讲您能了解如下知识点在本讲您能了解如下知识点pHibernateHibernate技术基础技术基础q为什么要使用为什么要使用HibernateHibernate工具工具q如何提供一致的数据库访问操作如何提供一致的数据库访问操作q什么时候使用什么时候使用HibernateHibernateqHibernateHibernate系统系统qHibernate Hibernate 框中的主要框中的主要APIAPIHibernateHibernate技术基础技术基础1 1、HibernateHibernate基本概念基本概念(1 1)Hi
2、bernateHibernate技术本质上是一个提供数据访问服务的中间件技术本质上是一个提供数据访问服务的中间件qHibernate Hibernate 是一个面向是一个面向Java Java 环境的对象环境的对象/ /关系数据库映射工关系数据库映射工具,它实现具,它实现把把JavaJava类对应到数据库表中类对应到数据库表中,并且采用了,并且采用了xmlxml技技术、术、Java ReflectionJava Reflection技术等。技术等。qHibernateHibernate不仅提供了从不仅提供了从JavaJava类到数据表的映射,也提供了类到数据表的映射,也提供了数据查询和恢复等机
3、制。从而可以大幅度减少开发时人工使数据查询和恢复等机制。从而可以大幅度减少开发时人工使用用SQL SQL 和和JDBC APIJDBC API处理数据的时间。处理数据的时间。(2 2)HibernateHibernate是一个开放源代码的对象关系映射框架是一个开放源代码的对象关系映射框架q它对它对JDBCJDBC进行了非常轻量级的对象封装,从而使用面向对象进行了非常轻量级的对象封装,从而使用面向对象编程思维(编程思维(OOPOOP)来操纵关系型的数据库。)来操纵关系型的数据库。qHibernateHibernate可以应用在任何使用可以应用在任何使用JDBCJDBC的场合,既可以在的场合,既可
4、以在J2SEJ2SE的应用程序中使用,也可以在的应用程序中使用,也可以在J2EE WebJ2EE Web应用系统中使用它。应用系统中使用它。面向开发人员简化面向开发人员简化开发过程开发过程2 2、为什么要应用、为什么要应用HibernateHibernate技术技术-对设计人员而言对设计人员而言对设计人员达到持久层设计上的解耦对设计人员达到持久层设计上的解耦 ,解耦合设计的目标,解耦合设计的目标(1 1)达到业务逻辑与数据逻辑相分离)达到业务逻辑与数据逻辑相分离(业务人员不需要考虑(业务人员不需要考虑数据表的逻辑结构)数据表的逻辑结构)(2 2)达到数据访问逻辑与物理数据库的结构相分离)达到数
5、据访问逻辑与物理数据库的结构相分离(数据(数据访问逻辑的开发者不再关心不同的物理数据库的差异性)访问逻辑的开发者不再关心不同的物理数据库的差异性)注意注意:从设计上来讲,:从设计上来讲,hibernatehibernate通过对集合、继承的支持,使通过对集合、继承的支持,使开发人员能够建立一个关系足够开发人员能够建立一个关系足够“复杂复杂”的对象模型的对象模型面向设计人员达到面向设计人员达到“解耦解耦”设计目标设计目标3 3、为什么要应用、为什么要应用HibernateHibernate技术技术-对开发人员而言对开发人员而言(1 1)提高了编码的效率)提高了编码的效率pHibernateHib
6、ernate是一个是一个ORMORM工具,它不仅仅是实现了数据库访工具,它不仅仅是实现了数据库访问性能优化和与数据库交互的常用操作(问性能优化和与数据库交互的常用操作(CRUDCRUD)p还将数据表与对象进行了关联,让开发人员可以脱离数还将数据表与对象进行了关联,让开发人员可以脱离数据库系统,而直接针对对象来与数据库表进行交互。据库系统,而直接针对对象来与数据库表进行交互。(2 2)提高了数据库访问性能)提高了数据库访问性能开发人员可以不再需要考虑与数据库交互的性能问题,如开发人员可以不再需要考虑与数据库交互的性能问题,如连接池、数据缓存等等连接池、数据缓存等等-因为因为HibernateHi
7、bernate提供了对这些方面提供了对这些方面的功能实现:数据读取和更新、事务管理、数据连接池、查询的功能实现:数据读取和更新、事务管理、数据连接池、查询和实体关系管理等。和实体关系管理等。 (3 3)HibernateHibernate使设计和开发人员达到下面的效果使设计和开发人员达到下面的效果q对设计人员达到持久层设计上的解耦对设计人员达到持久层设计上的解耦q对开发人员达到简化持久层的编程实现对开发人员达到简化持久层的编程实现您写过这样的您写过这样的SQL语句吗语句吗4 4、为什么要提出、为什么要提出HibernateHibernate(1 1)HibernateHibernate是是JD
8、BCJDBC的轻量级的对象封装的轻量级的对象封装 做为做为JDBCJDBC的替代者出现的的替代者出现的-不仅提供不仅提供ORMORM映射服务,还映射服务,还提供数据查询和数据缓存功能提供数据查询和数据缓存功能(2 2)优化)优化EJBEJB中的中的CMB EntityBeanCMB EntityBean 当然当然EJBEJB具有分布式的特性,而具有分布式的特性,而HibernateHibernate则不具备则不具备 简化简化JDBCJDBC和优化和优化EJBEJB当然只能是优化当然只能是优化而不是代替而不是代替(3 3)轻量级的对象封装的具体体现)轻量级的对象封装的具体体现p对对JDBCJDB
9、C的数据访问操作简化:以面向对象的编程形式实现对的数据访问操作简化:以面向对象的编程形式实现对数据库表中数据数据库表中数据 CRUDCRUD操作操作-避免复杂的避免复杂的SQLSQL语句出现。语句出现。p对对JDBCJDBC的功能扩展:采用面向对象中的对象之间的关系如的功能扩展:采用面向对象中的对象之间的关系如“关联、继承、聚合和组合关联、继承、聚合和组合”等形式来解决数据库表之间存在等形式来解决数据库表之间存在一定的关系的数据访问(一定的关系的数据访问(O/R MappingO/R Mapping技术)技术) 。p对对JDBCJDBC的数据访问性能改进:提供了事务管理,多种形式的的数据访问性
10、能改进:提供了事务管理,多种形式的缓存管理技术,数据并发控制技术等方面。缓存管理技术,数据并发控制技术等方面。 5 5、HibernateHibernate和和JDBCJDBC在性能上的对比在性能上的对比(1 1)用)用hibernatehibernate开发的系统能提高开发效率和系统的可重开发的系统能提高开发效率和系统的可重用性等方面用性等方面p因为任何封装在因为任何封装在JDBCJDBC之上的东西都不可能有直接去写之上的东西都不可能有直接去写JDBCJDBC快快( (不考虑不考虑cache)cache)。p但通过适当的封装,这样能够降低开发的复杂性,提高开发但通过适当的封装,这样能够降低开
11、发的复杂性,提高开发效率和使代码易于维护。效率和使代码易于维护。因此我们应用了因此我们应用了hibernatehibernate后后系统的速度可能会有影响系统的速度可能会有影响! !(2 2)能够真正实现面向对象的建模)能够真正实现面向对象的建模 用用HibernateHibernate时最大的便利不是在写代码的时候用对象的时最大的便利不是在写代码的时候用对象的操作代替操作代替SQLSQL语句,而是在建模的时候可以用面向对象的思维语句,而是在建模的时候可以用面向对象的思维把很复杂的逻辑用把很复杂的逻辑用UMLUML图表示出来,然后直接转化成实体。图表示出来,然后直接转化成实体。(3 3)JDB
12、C+HibernateJDBC+Hibernate相互结合相互结合p所以我们应该在性能影响太大的地方采用面向对象和关系相所以我们应该在性能影响太大的地方采用面向对象和关系相结合的方式结合的方式p但在更多的地方仍然只能采用对象关联的方式。但在更多的地方仍然只能采用对象关联的方式。这是一种比较合理的这是一种比较合理的设计设计! !我们家中购买了汽车后,也应该我们家中购买了汽车后,也应该还要保留我们原来的自行车还要保留我们原来的自行车! !6 6、如何为应用系统提供统一的一致的数据库访问操作、如何为应用系统提供统一的一致的数据库访问操作 (1 1)JDBCJDBC技术:它是一套技术:它是一套APIA
13、PI而不是一个框架。而不是一个框架。您写过这样的您写过这样的SQL语句吗语句吗(2 2)使用)使用Hibernate Hibernate 框架访问数据库的原理框架访问数据库的原理 您能够从图您能够从图中看出差中看出差别吗?别吗?(3 3)HibernateHibernate与与JDBCJDBC的主要区别的主要区别qHibernateHibernate是是JDBCJDBC的轻量级的对象封装,它是一个独立的对的轻量级的对象封装,它是一个独立的对象持久层框架,和应用服务器或者和象持久层框架,和应用服务器或者和EJBEJB没有什么必然的联没有什么必然的联系。系。qHibernateHibernate可
14、以用在任何可以用在任何JDBCJDBC可以使用的场合,从某种意义可以使用的场合,从某种意义上来说,上来说,HibernateHibernate在任何场合下取代在任何场合下取代JDBCJDBC。 (3 3)HibernateHibernate与与JDBCJDBC的主要区别的主要区别(续)(续)pHibernateHibernate是一个和是一个和JDBCJDBC密切关联的框架,所以密切关联的框架,所以HibernateHibernate的兼容性和的兼容性和JDBCJDBC驱动,和数据库都有一定的关系,但是和驱动,和数据库都有一定的关系,但是和使用它的使用它的JavaJava程序、应用服务器没有任
15、何关系,也不存在程序、应用服务器没有任何关系,也不存在兼容性问题。兼容性问题。pHibernateHibernate是是做做为为JDBCJDBC的的替替代代者者出出现现的的,不不能能用用来来直直接接和和EJBEJB中中的的Entity Entity BeanBean做做对对比比-不不是是代代替替EJBEJB而而是是优优化化EJBEJB,在轻量级的容器中也能够应用,在轻量级的容器中也能够应用O/R MappingO/R Mapping技术。技术。希望您能够明确这点希望您能够明确这点!(4 4)HibernateHibernate的一些弱点的一些弱点q主要体现在比如对象关系的映射配置过多,控制复杂
16、;事主要体现在比如对象关系的映射配置过多,控制复杂;事务处理也面临各种兼容问题;务处理也面临各种兼容问题;p一个持久性类不能映射到多个表一个持久性类不能映射到多个表pHibernateHibernate内置映射内置映射类型复杂类型复杂化化 pIDID规规定定化化生生成成:HibernateHibernate中中内内置置标标识识符符生生成成器器给给表表单单IDID自自动动生生成提供了方便,但却不能自定义各种成提供了方便,但却不能自定义各种IDID形式。形式。p另另外外不不支支持持动动态态映映射射数数据据库库表表7 7、什么时候使用、什么时候使用HibernateHibernate (1 1)自己
17、没有数据持久层开发能力)自己没有数据持久层开发能力p由于由于hibernatehibernate为我们提供了一套成熟的为我们提供了一套成熟的O/R MappingO/R Mapping的的模型,应用它将能够在短时间内构建适合业务需求的数模型,应用它将能够在短时间内构建适合业务需求的数据持久层的解决方案据持久层的解决方案p当然,前提是要对当然,前提是要对hibernatehibernate有基本的使用开发能力。有基本的使用开发能力。(2 2)对)对JDBCJDBC底层开发不甚熟悉者底层开发不甚熟悉者p由于由于hibernatehibernate实现了对实现了对JDBCJDBC底层的调用封装,这样
18、将能底层的调用封装,这样将能够统一对不同类型的数据库系统的支持。够统一对不同类型的数据库系统的支持。p因此,当开发者在缺乏对因此,当开发者在缺乏对JDBCJDBC底层调用的了解时,使用底层调用的了解时,使用HibernateHibernate则可以达到事半功倍的效果。则可以达到事半功倍的效果。我们不只是我们不只是CRUD,还,还有许多其它的要求!有许多其它的要求!我们的开发人员不能很好地把握我们的开发人员不能很好地把握JDBC在在不同的物理数据库方面的差异性!不同的物理数据库方面的差异性!(3 3)自己开发的数据持久层不能满足业务需求)自己开发的数据持久层不能满足业务需求p如果缺乏对如果缺乏对
19、JDBCJDBC的了解和数据持久层开发的经验,可能自的了解和数据持久层开发的经验,可能自己开发的数据持久层会慢慢的不满足业务需求。己开发的数据持久层会慢慢的不满足业务需求。p比如在数据缓存、连接池管理、多数据库支持等等方面,比如在数据缓存、连接池管理、多数据库支持等等方面,hibernatehibernate在上述方面有比较出色的表现。在上述方面有比较出色的表现。p因此,我们可以在不影响业务功能实现的开发前提下可以因此,我们可以在不影响业务功能实现的开发前提下可以考虑采用该框架。考虑采用该框架。 (4 4)在团队开发中希望能够统一持久层开发)在团队开发中希望能够统一持久层开发p从技术上来分类,
20、我们一般是把从技术上来分类,我们一般是把hibernatehibernate称为称为O/R O/R MappingMapping开发框架。开发框架。p因此,既然是框架,那么如果团队中的各个成员对这个框因此,既然是框架,那么如果团队中的各个成员对这个框架比较熟悉的话,那么我们将可以统一团队的开发过程,架比较熟悉的话,那么我们将可以统一团队的开发过程,从而减少沟通的频率,同时也能够促进协同开发和数据共从而减少沟通的频率,同时也能够促进协同开发和数据共享。享。团队有共同的目标和平台!团队有共同的目标和平台!自己开发不仅费时、而且效自己开发不仅费时、而且效果也不理想的情况下!果也不理想的情况下!(5
21、5)希望我们的应用系统不依赖于某种特定的数据库)希望我们的应用系统不依赖于某种特定的数据库p希望应用系统能够满足不同的物理数据库系统的差别所带来希望应用系统能够满足不同的物理数据库系统的差别所带来的问题的问题 p如何设计适用于多种类型数据库的通用产品而不是提供多个如何设计适用于多种类型数据库的通用产品而不是提供多个产品版本产品版本 u尽量使用标准通用的尽量使用标准通用的SQLSQL语句语句u尽量不使用各数据库方言和某种数据库特有的函数或者数尽量不使用各数据库方言和某种数据库特有的函数或者数据类型等据类型等u将系统的配置参数保存在一个将系统的配置参数保存在一个propertiesproperti
22、es文件或者文件或者* *.xml.xml中,中,然后在代码中利用类似然后在代码中利用类似Configuration.setProperties(Properties pro)Configuration.setProperties(Properties pro)方法载入方法载入配置参数文件。配置参数文件。这可能是我们选择这可能是我们选择Hibernate的的一个主要的考虑!一个主要的考虑!(6 6)优化数据查)优化数据查询询 大量重复查询同一数据源(如淘宝网中重复查询同一大量重复查询同一数据源(如淘宝网中重复查询同一商品);查询中涉及大量关联关系;商品);查询中涉及大量关联关系;8 8、Hib
23、ernateHibernate系统(冬眠)系统(冬眠)(1 1)HibernateHibernate的设计者的设计者Gavin KingGavin King Gavin KingGavin King是是HibernateHibernate的作者,的作者,EJB3.0EJB3.0专家委员会成员,专家委员会成员,JBossJBoss核心成员之核心成员之一。一。HibernateHibernate诞生在诞生在20012001年年1111月。月。(2 2)下载其系统)下载其系统hibernatehibernate是是sourceforgesourceforge的一个子项目,可以从的一个子项目,可以从H
24、ibernate Hibernate 的的网站网站http:/www.hibernate.org/http:/www.hibernate.org/或者或者http:/http:/上面获得下载的连接。上面获得下载的连接。(3 3)其系统架构)其系统架构pHibernateHibernate内部内部封装了通过封装了通过JDBCJDBC访问数据库的操访问数据库的操作,向上层应用作,向上层应用提供了面向对象提供了面向对象的数据访问的数据访问APIAPI。qHibernateHibernate是是JavaJava应用和关系应用和关系数据库之间的桥数据库之间的桥梁,它负责梁,它负责JavaJava对象和关
25、系数据对象和关系数据之间的映射。之间的映射。(4 4)它是)它是“轻型轻型”的体系结构方的体系结构方案案 我们应用系统中的持久类是一种普通的我们应用系统中的持久类是一种普通的JavaBeanJavaBean(JOPOJOPO),因此不依赖于),因此不依赖于HibernateHibernate的的APIAPI。应用系统可以以最小子集的方式被应用,在方式下应用程应用系统可以以最小子集的方式被应用,在方式下应用程序自己提供序自己提供jdbcjdbc连接,并且自行管理事务。连接,并且自行管理事务。您了解您了解“轻量级轻量级”的含义和要求吗的含义和要求吗?(5 5)它是一个)它是一个“全面解决全面解决”
26、的体系结构方案的体系结构方案p它是将应用层从底层的它是将应用层从底层的JDBC/JTA/JNDIJDBC/JTA/JNDI等方面的等方面的APIAPI中抽象中抽象出来,而让出来,而让HibernateHibernate来处理这些技术实现的细节来处理这些技术实现的细节p从而可以使我们的应用系统能够屏蔽各个物理数据库系统从而可以使我们的应用系统能够屏蔽各个物理数据库系统的差别的差别 9 9、Hibernate APIHibernate API中包含的一些主要的类中包含的一些主要的类希望重点掌握这些接希望重点掌握这些接口的用法!口的用法! 所应该注意的是所应该注意的是: :由于在由于在Hiberna
27、teHibernate中使用了中使用了J2EEJ2EE架构中的如架构中的如下技术:下技术:JDBCJDBC、JTAJTA、JNDIJNDI。其中。其中JDBCJDBC是一个支持关系数据库操是一个支持关系数据库操作的一个基础层;它与作的一个基础层;它与JNDIJNDI和和JTAJTA一起结合,使得一起结合,使得HibernateHibernate可以可以方便地集成到方便地集成到J2EEJ2EE应用服务器中去。应用服务器中去。 1010、HibernateHibernate系统可以运行在两种环境下系统可以运行在两种环境下 HibernateHibernate可以与任何一种可以与任何一种JavaJa
28、va应用的运行环境集成,应用的运行环境集成,JavaJava应用的运行环境可分为两种:受管理环境(应用的运行环境可分为两种:受管理环境(Managed Managed environmentenvironment)和不受管理环境()和不受管理环境(Non-managed enviromentNon-managed enviroment)。)。 (1 1)受管理环境)受管理环境应用系统的整个执行过程在容器的控应用系统的整个执行过程在容器的控制之下制之下(2 2)不受管理环境)不受管理环境应用系统的整个执行过程不在容器应用系统的整个执行过程不在容器的控制之下的控制之下 (3 3)Hibernate
29、Hibernate允许允许JavaJava应用在不同的环境中移植应用在不同的环境中移植p当当JavaJava应用从一个环境移植到另一个环境中时,只需要修应用从一个环境移植到另一个环境中时,只需要修改改HibernateHibernate的配置文件的配置文件p而不需要修改或者只需要修改极少量的而不需要修改或者只需要修改极少量的JavaJava源代码。源代码。如从如从“受管理环境受管理环境-不受管理环境不受管理环境” 、在、在“不同的物理数据库不同的物理数据库”之间转换之间转换只有这样,我们的系统才能只有这样,我们的系统才能“适适应变化应变化”和和“满足变化满足变化”!1 1、子曰:、子曰:“学而不思则罔,思而不学则殆。学而不思则罔,思而不学则殆。” “学而时习之学而时习之” 2 2、子曰:子曰:“知之者不如好之者知之者不如好之者, ,好之者不如乐之者好之者不如乐之者”3 3、子曰:、子曰:“三人行三人行, ,必有我师焉必有我师焉”4 4、子曰:子曰:“我非生而知之者我非生而知之者, ,好古好古, ,敏以求之者也敏以求之者也”本讲的简要回顾本讲的简要回顾