Spring整合Hibernate的文章.docx

上传人:b****6 文档编号:7584162 上传时间:2023-01-25 格式:DOCX 页数:22 大小:39.63KB
下载 相关 举报
Spring整合Hibernate的文章.docx_第1页
第1页 / 共22页
Spring整合Hibernate的文章.docx_第2页
第2页 / 共22页
Spring整合Hibernate的文章.docx_第3页
第3页 / 共22页
Spring整合Hibernate的文章.docx_第4页
第4页 / 共22页
Spring整合Hibernate的文章.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

Spring整合Hibernate的文章.docx

《Spring整合Hibernate的文章.docx》由会员分享,可在线阅读,更多相关《Spring整合Hibernate的文章.docx(22页珍藏版)》请在冰豆网上搜索。

Spring整合Hibernate的文章.docx

Spring整合Hibernate的文章

6.5 Spring整合Hibernate

时至今日,可能极少有J2EE应用会直接以JDBC方式进行持久层访问。

毕竟,用面向对象的程序设计语言来访问关系型数据库,是一件让人沮丧的事情。

大部分时候,J2EE应用都会以ORM框架来进行持久层访问,在所有的ORM框架中,Hibernate以其灵巧、轻便的封装赢得了众多开发者的青睐。

Spring具有良好的开放性,能与大部分ORM框架良好整合。

下面将详细介绍Spring与Hibernate的整合。

6.5.1 Spring提供的DAO支持

DAO模式是一种标准的J2EE设计模式,DAO模式的核心思想是,所有的数据库访 问,都通过DAO组件完成,DAO组件封装了数据库的增、删、改等原子操作。

而业务逻辑组件则依赖于DAO组件提供的数据库原子操作,完成系统业务逻辑的实现。

对于J2EE应用的架构,有非常多的选择,但不管细节如何变换,J2EE应用都大致可分为如下3层:

  ●表现层。

  ●业务逻辑层。

  ●数据持久层。

轻量级J2EE架构以SpringIoC容器为核心,承上启下。

其向上管理来自表现层的Action,向下管理业务逻辑层组件,同时负责管理业务逻辑层所需的DAO对象。

各层之间负责传值的是值对象,也就是JavaBean实例。

图6.5精确地描绘了轻量级J2EE架构的大致情形。

DAO组件是整个J2EE应用的持久层访问的重要组件,每个J2EE应用的底层实现都难以离开DAO组件的支持。

Spring对实现DAO组件提供了许多工具类,系统的DAO组件可通过继承这些工具类完成,从而可以更加简便地实现DAO组件。

Spring的DAO支持,允许使用相同的方式、不同的数据访问技术,如JDBC、Hibernate或JDO。

Spring的DAO在不同的持久层访问技术上提供抽象,应用的持久层访问基于Spring的DAO抽象。

因此,应用程序可以在不同的持久层技术之间切换。

Spring提供了一系列的抽象类,这些抽象将被作为应用中DAO实现类的父类。

通过继承这些抽象类,Spring简化了DAO的开发步骤,能以一致的方式使用数据库访问技术。

不管底层采用JDBC、JDO或Hibernate,应用中都可采用一致的编程模型。

图6.5 轻量级J2EE应用架构

应用的DAO类继承这些抽象类,会大大简化应用的开发。

最大的好处是,继承这些抽象类的DAO能以一致的方式访问数据库,意味着应用程序可以在不同的持久层访问技术中切换。

除此之外,Spring提供了一致的异常抽象,将原有的Checked异常转换包装成Runtime异常,因而,编码时无须捕获各种技术中特定的异常。

SpringDAO体系中的异常,都继承DataAccessException,而DataAccessException异常是Runtime的,无须显式捕捉。

通过DataAccessException的子类包装原始异常信息,从而保证应用程序依然可以捕捉到原始异常信息。

Spring提供了多种数据库访问技术的DAO支持,包括Hibernate、JDO、TopLink、iBatis、OJB等。

Spring可以使用相同的访问模式、不同的数据库访问技术。

就Hibernate的持久层访问技术而言,Spring提供了如下3个工具类(或接口)来支持DAO组件的实现:

  ●HibernateDaoSupport。

  ●HibernateTemplate。

  ●HibernateCallBack。

6.5.2 管理Hibernate的SessionFactory

前面介绍Hibernate时已经知道,在通过Hibernate进行持久层访问时,Hibernate的SessionFactory是一个非常重要的对象,它是单个数据库映射关系编译后的内存镜像。

大部分情况下,一个J2EE应用对应一个数据库,也即对应一个SessionFactory对象。

在纯粹的Hibernate访问中,应用程序需要手动创建SessionFactory实例,可想而知,这不是一个优秀的策略。

在实际开发中,希望以一种声明式的方式管理SessionFactory实例,直接以配置文件来管理SessionFactory实例,在示范Struts的PlugIn扩展点时,大致示范了这种方式(请参阅2.12.1节的内容)。

Spring的IoC容器则提供了更好的管理方式,它不仅能以声明式的方式配置Session-Factory实例,也可充分利用IoC容器的作用,为SessionFactory注入数据源引用。

下面是Spring配置文件中配置HibernateSessionFactory的示范代码:

xmlversion="1.0"encoding="GBK"?

>

--beans是Spring配置文件的根元素,并且指定了Schema信息-->

//www.springframework.org/schema/beans"

      xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

      xsi:

schemaLocation="http:

//www.springframework.org/schema/beanshttp:

//www.springframework.org/schema/beans/spring-beans.xsd">

   

--定义数据源Bean,使用C3P0数据源实现-->

   

   destroy-method="close">

       

--指定连接数据库的驱动-->

       

       

--指定连接数据库的URL-->

       

mysql:

//localhost/j2ee"/>

       

--指定连接数据库的用户名-->

       

       

--指定连接数据库的密码-->

       

       

--指定连接数据库连接池的最大连接数-->

       

       

--指定连接数据库连接池的最小连接数-->

       

       

--指定连接数据库连接池的初始化连接数-->

       

       

--指定连接数据库连接池的连接最大空闲时间-->

       

   

   

--定义Hibernate的SessionFactory-->

   

   LocalSessionFactoryBean">

       

--依赖注入数据源,正是上文定义的dataSource-->

       

       

--mappingResources属性用来列出全部映射文件-->

       

            

                

--以下用来列出所有的PO映射文件-->

               lee/MyTest.hbm.xml

            

       

         

--定义Hibernate的SessionFactory属性-->

       

           

               

--指定Hibernate的连接方言-->

              org.hibernate.dialect.

               MySQLDialect

               

--配置启动应用时,是否根据Hibernate映射自动创建数据表-->

                update

           

       

   

一旦在Spring的IoC容器中配置了SessionFactoryBean,它将随应用的启动而加载,并可以充分利用IoC容器的功能,将SessionFactoryBean注入任何Bean,比如DAO组件。

一旦DAO组件获得了SessionFactoryBean的引用,就可以完成实际的数据库访问。

当然,Spring也支持访问容器数据源。

如果需要使用容器数据源,可将数据源Bean修改成如下配置:

--此处配置JNDI数据源-->

   

       

--指定数据源的JNDI-->

       java:

comp/env/jdbc/myds

   

可见,以声明式的方式管理SessionFactory实例,可以让应用在不同数据源之间切换。

如果应用更换数据库等持久层资源,只需对配置文件进行简单修改即可。

提示:

以声明式的方式管理SessionFactory,非常类似于早期将数据库服务的相关信息放在web.xml文件中进行配置。

这种方式是为了提供更好的适应性,当持久层服务需要更改时,应用代码无须任何改变。

6.5.3 使用HibernateTemplate

HibernateTemplate提供持久层访问模板,使用HibernateTemplate无须实现特定接口,它只需要提供一个SessionFactory的引用就可执行持久化操作。

SessionFactory对象既可通过构造参数传入,也可通过设值方式传入。

HibernateTemplate提供如下3个构造函数:

  ●HibernateTemplate()。

  ●HibernateTemplate(org.hibernate.SessionFactorysessionFactory)。

  ●HibernateTemplate(org.hibernate.SessionFactorysessionFactory,booleanallowCreate)。

第一个构造函数,构造一个默认的HibernateTemplate实例。

因此,使用Hibernate-Template实例之前,还必须使用方法setSessionFactory(SessionFactorysessionFactory)来为HibernateTemplate传入SessionFactory的引用。

第二个构造函数,在构造时已经传入SessionFactory引用。

第三个构造函数,其boolean型参数表明,如果当前线程已经存在一个非事务性的Session,是否直接返回此非事务性的Session。

在Web应用中,通常启动时自动加载ApplicationContext,SessionFactory和DAO对象都处在Spring上下文管理下,因此无须在代码中显式设置,可采用依赖注入完成Session-Factory和DAO的解耦,依赖关系通过配置文件来设置,如下所示:

xmlversion="1.0"encoding="GBK"?

>

--beans是Spring配置文件的根元素,并且指定了Schema信息-->

//www.springframework.org/schema/beans"

      xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

      xsi:

schemaLocation="http:

//www.springframework.org/schema/beanshttp:

//www.springframework.org/schema/beans/spring-beans.xsd">

   

--定义数据源Bean,使用C3P0数据源实现-->

   

   destroy-method="close">

       

--指定连接数据库的驱动-->

       

       

--指定连接数据库的URL-->

       

mysql:

//localhost/j2ee"/>

       

--指定连接数据库的用户名-->

       

       

--指定连接数据库的密码-->

       

       

--指定连接数据库连接池的最大连接数-->

       

       

--指定连接数据库连接池的最小连接数-->

       

       

--指定连接数据库连接池的初始化连接数-->

       

       

--指定连接数据库连接池的连接最大空闲时间-->

       

   

   

--定义Hibernate的SessionFactoryBean-->

   

   LocalSessionFactoryBean">

       

--依赖注入数据源,注入的正是上文中定义的dataSource-->

       

       

--mappingResources属性用来列出全部映射文件-->

       

            

                

--以下用来列出所有的PO映射文件-->

               lee/Person.hbm.xml

            

       

         

--定义Hibernate的SessionFactory属性-->

       

           

               

--指定Hibernate的连接方言-->

              org.hibernate.dialect.

               MySQLDialect

               

--指定启动应用时,是否根据Hibernate映射文件创建数据表-->

                update

           

       

   

   

--配置Person持久化类的DAObean-->

   

      

--采用依赖注入来传入SessionFactory的引用-->

       

   

在PersonDao组件中,所有的持久化操作都通过HibernateTemplate实例完成,而HibernateTemplate操作数据库非常简洁,大部分CRUD操作都可通过一行代码解决问题。

下面介绍如何通过HibernateTemplate进行持久层访问。

HibernateTemplate提供了非常多的常用方法来完成基本的操作,比如通常的增加、删除、修改、查询等操作,Spring2.0更增加了对命名SQL查询的支持,也增加了对分页的支持。

大部分情况下,使用Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作。

下面是HibernateTemplate的常用方法简介:

  ●voiddelete(Objectentity),删除指定持久化实例。

  ●deleteAll(Collectionentities),删除集合内全部持久化类实例。

  ●find(StringqueryString),根据HQL查询字符串来返回实例集合。

  ●findByNamedQuery(StringqueryName),根据命名查询返回实例集合。

  ●get(ClassentityClass,Serializableid),根据主键加载特定持久化类的实例。

  ●save(Objectentity),保存新的实例。

  ●saveOrUpdate(Objectentity),根据实例状态,选择保存或者更新。

  ●update(Objectentity),更新实例的状态,要求entity是持久状态。

  ●setMaxResults(intmaxResults),设置分页的大小。

下面是一个完整DAO类的源代码:

publicclassPersonDaoImplimplementsPersonDao

{

   //执行持久化操作的HibernateTemplate实例

   privateHibernateTemplateht=null;

   privateSessionFactorysessionFactory;

   //该DAO组件持久化操作所需的SessionFactory对象

   publicvoidsetSessionFactory(SessionFactorysessionFactory)

   {

       this.sessionFactory=sessionFactory;

   }

   //用于根据SessionFactory实例返回HibernateTemplate实例的方法

   private HibernateTemplategetHibernateTemplate()

   {

       if(ht==null)

       {

            ht=newHibernateTemplate(sessionFactory);

       }

       returnht;

   }

   /**

    *加载人实例

    *@paramid需要加载的Person实例的主键值

    *@return返回加载的Person实例

    */

   publicPersonget(intid)

   {

       return(Person)getHibernateTemplate().get(Person.class,new

       Integer(id));

   }

   /**

    *保存人实例

    *@paramperson需要保存的Person实例

    */   

   publicvoidsave(Personperson)

   {

       getHibernateTemplate().save(person);

   }

   /**

    *修改Person实例

    *@paramperson需要修改的Person实例

    */

   publicvoidupdate(Personperson)

   {

       getHibernateTemplate().update(person);

   }

   /**

    *删除Person实例

    *@paramid需要删除的Person的id

    */

   publicvoiddelete(intid)

   {

       getHibernateTe

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1