<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,  comments - 11,  trackbacks - 0

    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架構以Spring IoC容器為核心,承上啟下。其向上管理來自表現層的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異常,因而,編碼時無須捕獲各種技術中特定的異常。Spring DAO體系中的異常,都繼承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配置文件中配置Hibernate SessionFactory的示范代碼:

    <?xml version="1.0" encoding="GBK"?>

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

    <beans xmlns="http://www.springframework.org/schema/beans"

    ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    ??? <!-- 定義數據源Bean,使用C3P0數據源實現 -->

    ??? <bean id="dataSource" class="com.mchange.v2.c3p0. ComboPooledDataSource"
    ??? destroy-method="close">

    ??????? <!-- 指定連接數據庫的驅動 -->

    ??????? <property name="driverClass" value="com.mysql.jdbc.Driver"/>

    ??????? <!-- 指定連接數據庫的URL -->

    ??????? <property name="jdbcUrl" value="jdbc:mysql://localhost/j2ee"/>

    ??????? <!-- 指定連接數據庫的用戶名 -->

    ??????? <property name="user" value="root"/>

    ??????? <!-- 指定連接數據庫的密碼 -->

    ??????? <property name="password" value="32147"/>

    ??????? <!-- 指定連接數據庫連接池的最大連接數 -->

    ??????? <property name="maxPoolSize" value="40"/>

    ??????? <!-- 指定連接數據庫連接池的最小連接數 -->

    ??????? <property name="minPoolSize" value="1"/>

    ??????? <!-- 指定連接數據庫連接池的初始化連接數 -->

    ??????? <property name="initialPoolSize" value="1"/>

    ??????? <!-- 指定連接數據庫連接池的連接最大空閑時間 -->

    ??????? <property name="maxIdleTime" value="20"/>

    ??? </bean>

    ??? <!-- 定義Hibernate的SessionFactory -->

    ??? <bean id="sessionFactory" class="org.springframework.orm.hibernate3.
    ??? LocalSessionFactoryBean">

    ??????? <!-- 依賴注入數據源,正是上文定義的dataSource -->

    ??????? <property name="dataSource" ref="dataSource"/>

    ??????? <!-- mappingResources屬性用來列出全部映射文件 -->

    ??????? <property name="mappingResources">

    ??????????? <list>

    ??????????????? <!-- 以下用來列出所有的PO映射文件 -->

    ??????????????? <value>lee/MyTest.hbm.xml</value>

    ??????????? </list>

    ??????? </property>

    ????????? <!-- 定義Hibernate的SessionFactory屬性 -->

    ??????? <property name="hibernateProperties">

    ??????? ???? <props>

    ??????????????? <!-- 指定Hibernate的連接方言 -->

    ??????????? ??? <prop key="hibernate.dialect">org.hibernate.dialect.
    ??????????????? MySQLDialect</prop>

    ??????????????? <!-- 配置啟動應用時,是否根據Hibernate映射自動創建數據表 -->

    ??????????? ????? <prop key="hibernate.hbm2ddl.auto">update</prop>

    ?????????? </props>

    ??????? </property>

    ??? </bean>

    </beans>

    一旦在Spring的IoC容器中配置了SessionFactory Bean,它將隨應用的啟動而加載,并可以充分利用IoC容器的功能,將SessionFactory Bean注入任何Bean,比如DAO組件。一旦DAO組件獲得了SessionFactory Bean的引用,就可以完成實際的數據庫訪問。

    當然,Spring也支持訪問容器數據源。如果需要使用容器數據源,可將數據源Bean修改成如下配置:

    <!-- 此處配置JNDI數據源 -->

    <bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

    ??? <property name="jndiName">

    ??????? <!-- 指定數據源的JNDI -->

    ??????? <value>java:comp/env/jdbc/myds</value>

    ??? </property>

    </bean>

    可見,以聲明式的方式管理SessionFactory實例,可以讓應用在不同數據源之間切換。如果應用更換數據庫等持久層資源,只需對配置文件進行簡單修改即可。

    提示:以聲明式的方式管理SessionFactory,非常類似于早期將數據庫服務的相關信息放在web.xml文件中進行配置。這種方式是為了提供更好的適應性,當持久層服務需要更改時,應用代碼無須任何改變。

    6.5.3 使用HibernateTemplate

    HibernateTemplate提供持久層訪問模板,使用HibernateTemplate無須實現特定接口,它只需要提供一個SessionFactory的引用就可執行持久化操作。SessionFactory對象既可通過構造參數傳入,也可通過設值方式傳入。HibernateTemplate提供如下3個構造函數:

    ?? ● HibernateTemplate()。

    ?? ● HibernateTemplate(org.hibernate.SessionFactory sessionFactory)。

    ?? ● HibernateTemplate(org.hibernate.SessionFactory sessionFactory, boolean allowCreate)。

    第一個構造函數,構造一個默認的HibernateTemplate實例。因此,使用Hibernate- Template實例之前,還必須使用方法setSessionFactory(SessionFactory sessionFactory)來為HibernateTemplate傳入SessionFactory的引用。

    第二個構造函數,在構造時已經傳入SessionFactory引用。

    第三個構造函數,其boolean型參數表明,如果當前線程已經存在一個非事務性的Session,是否直接返回此非事務性的Session。

    在Web應用中,通常啟動時自動加載ApplicationContext,SessionFactory和DAO對象都處在Spring上下文管理下,因此無須在代碼中顯式設置,可采用依賴注入完成Session- Factory和DAO的解耦,依賴關系通過配置文件來設置,如下所示:

    <?xml version="1.0" encoding="GBK"?>

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

    <beans xmlns="http://www.springframework.org/schema/beans"

    ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    ??? <!-- 定義數據源Bean,使用C3P0數據源實現 -->

    ??? <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    ??? destroy-method="close">

    ??????? <!-- 指定連接數據庫的驅動 -->

    ??????? <property name="driverClass" value="com.mysql.jdbc.Driver"/>

    ??????? <!-- 指定連接數據庫的URL -->

    ??????? <property name="jdbcUrl" value="jdbc:mysql://localhost/j2ee"/>

    ??????? <!-- 指定連接數據庫的用戶名 -->

    ??????? <property name="user" value="root"/>

    ??????? <!-- 指定連接數據庫的密碼 -->

    ??????? <property name="password" value="32147"/>

    ??????? <!-- 指定連接數據庫連接池的最大連接數 -->

    ??????? <property name="maxPoolSize" value="40"/>

    ??????? <!-- 指定連接數據庫連接池的最小連接數 -->

    ??????? <property name="minPoolSize" value="1"/>

    ??????? <!-- 指定連接數據庫連接池的初始化連接數 -->

    ??????? <property name="initialPoolSize" value="1"/>

    ??????? <!-- 指定連接數據庫連接池的連接最大空閑時間 -->

    ??????? <property name="maxIdleTime" value="20"/>

    ??? </bean>

    ??? <!-- 定義Hibernate的SessionFactory Bean -->

    ??? <bean id="sessionFactory" class="org.springframework.orm.hibernate3.
    ??? LocalSessionFactoryBean">

    ??????? <!-- 依賴注入數據源,注入的正是上文中定義的dataSource -->

    ??????? <property name="dataSource" ref="dataSource"/>

    ??????? <!-- mappingResources屬性用來列出全部映射文件 -->

    ??????? <property name="mappingResources">

    ??????????? <list>

    ??????????????? <!-- 以下用來列出所有的PO映射文件 -->

    ??????????????? <value>lee/Person.hbm.xml</value>

    ??????????? </list>

    ??????? </property>

    ????????? <!-- 定義Hibernate的SessionFactory屬性 -->

    ??????? <property name="hibernateProperties">

    ??????? ???? <props>

    ??????????????? <!-- 指定Hibernate的連接方言 -->

    ??????????? ??? <prop key="hibernate.dialect">org.hibernate.dialect.
    ??????????????? MySQLDialect</prop>

    ??????????????? <!-- 指定啟動應用時,是否根據Hibernate映射文件創建數據表 -->

    ??????????? ????? <prop key="hibernate.hbm2ddl.auto">update</prop>

    ??????? ???? </props>

    ??????? </property>

    ??? </bean>

    ??? <!-- 配置Person持久化類的DAO bean -->

    ??? <bean id="personDao" class="lee.PersonDaoImpl">

    ??? ??? <!-- 采用依賴注入來傳入SessionFactory的引用 -->

    ??????? <property name="sessionFactory" ref="sessionFactory"/>

    ??? </bean>

    </beans>

    在PersonDao組件中,所有的持久化操作都通過HibernateTemplate實例完成,而HibernateTemplate操作數據庫非常簡潔,大部分CRUD操作都可通過一行代碼解決問題。下面介紹如何通過HibernateTemplate進行持久層訪問。

    HibernateTemplate提供了非常多的常用方法來完成基本的操作,比如通常的增加、刪除、修改、查詢等操作,Spring 2.0更增加了對命名SQL查詢的支持,也增加了對分頁的支持。大部分情況下,使用Hibernate的常規用法,就可完成大多數DAO對象的CRUD操作。下面是HibernateTemplate的常用方法簡介:

    ?? ● void delete(Object entity),刪除指定持久化實例。

    ?? ● deleteAll(Collection entities),刪除集合內全部持久化類實例。

    ?? ● find(String queryString),根據HQL查詢字符串來返回實例集合。

    ?? ● findByNamedQuery(String queryName),根據命名查詢返回實例集合。

    ?? ● get(Class entityClass, Serializable id),根據主鍵加載特定持久化類的實例。

    ?? ● save(Object entity),保存新的實例。

    ?? ● saveOrUpdate(Object entity),根據實例狀態,選擇保存或者更新。

    ?? ● update(Object entity),更新實例的狀態,要求entity是持久狀態。

    ?? ● setMaxResults(int maxResults),設置分頁的大小。

    下面是一個完整DAO類的源代碼:

    public class PersonDaoImpl implements PersonDao

    {

    ??? //執行持久化操作的HibernateTemplate實例

    ??? private HibernateTemplate ht = null;

    ??? private SessionFactory sessionFactory;

    ??? //該DAO組件持久化操作所需的SessionFactory對象

    ??? public void setSessionFactory(SessionFactory sessionFactory)

    ??? {

    ??????? this.sessionFactory = sessionFactory;

    ??? }

    ??? //用于根據SessionFactory實例返回HibernateTemplate實例的方法

    ??? private HibernateTemplate getHibernateTemplate()

    ??? {

    ??????? if (ht == null)

    ??????? {

    ??????????? ht = new HibernateTemplate(sessionFactory);

    ??????? }

    ??????? return ht;

    ??? }

    ??? /**

    ???? * 加載人實例

    ???? * @param id 需要加載的Person實例的主鍵值

    ???? * @return 返回加載的Person實例

    ???? */

    ??? public Person get(int id)

    ??? {

    ??????? return (Person)getHibernateTemplate().get(Person.class, new
    ??????? Integer(id));

    ??? }

    ??? /**

    ???? * 保存人實例

    ???? * @param person 需要保存的Person實例

    ???? */???

    ??? public void save(Person person)

    ??? {

    ??????? getHibernateTemplate().save(person);

    ??? }

    ??? /**

    ???? * 修改Person實例

    ???? * @param person 需要修改的Person實例

    ???? */

    ??? public void update(Person person)

    ??? {

    ??????? getHibernateTemplate().update(person);

    ??? }

    ??? /**

    ???? * 刪除Person實例

    ???? * @param id 需要刪除的Person的id

    ???? */

    ??? public void delete(int id)

    ??? {

    ??????? getHibernateTemplate().delete(getHibernateTemplate().get(Person.
    ??????? class,new Integer(id)));

    ??? }

    ??? /**

    ???? * 刪除Person實例

    ???? * @param person 需要刪除的Person實例

    ???? */

    ?? public void delete(Person person)

    ??? {

    ??????? getHibernateTemplate().delete(person);

    ??? }

    ??? /**

    ???? * 根據用戶名查找Person

    ???? * @param name 用戶名

    ???? * @return 用戶名對應的全部用戶

    ???? */

    ??? public List findByName(String name)

    ??? {

    ??????? return getHibernateTemplate().find("from Person p where p.name
    ??????? like ?" , name);

    ??? }

    ??? /**

    ??? * 返回全部的Person實例

    ??? * @return 全部的Person實例

    ??? */

    ??? public List findAllPerson()

    ??? {

    ??????? return getHibernateTemplate().find("from Person ");

    ??? }

    }

    通過上面實現DAO組件的代碼可以看出,通過HibernateTemplate進行持久層訪問的代碼如此清晰,大部分CRUD操作一行代碼即可完成,完全無須Hibernate訪問那些繁瑣的步驟。而且,一旦DAO組件獲得了SessionFactory的引用,即可很輕易地創建HibernateTemplate實例。

    提示:HibernateTemplate是Spring眾多模板工具類之一,Spring正是通過這種簡便地封裝,完成了開發中大量需要重復執行的工作。

    posted on 2009-07-19 10:24 jadmin 閱讀(673) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费无码又爽又刺激高潮视频| 青草草色A免费观看在线| 亚洲丝袜美腿视频| 最近的中文字幕大全免费版| 日日摸夜夜添夜夜免费视频| 久久亚洲精品成人av无码网站| 一个人免费观看视频www| 一级特黄色毛片免费看| 亚洲妓女综合网99| 亚洲精品无码激情AV| 67194熟妇在线永久免费观看| 男人和女人高潮免费网站| 亚洲精品国产成人中文| 亚洲第一区精品日韩在线播放| 免费无码又爽又刺激高潮视频| 黄色片网站在线免费观看| 337p欧洲亚洲大胆艺术| 亚洲国产成人精品91久久久| 免费在线观看视频网站| 久久久受www免费人成| 亚洲 日韩 色 图网站| 亚洲高清视频在线观看| 免费va人成视频网站全| 91精品成人免费国产片| 久久WWW免费人成—看片| 亚洲一区二区三区丝袜| 亚洲精品中文字幕无码蜜桃| 国产免费小视频在线观看| 91精品国产免费入口| 国产精品永久免费视频| 日韩亚洲国产综合高清| 亚洲国产成人久久综合一 | 毛片视频免费观看| 97在线免费观看视频| 综合一区自拍亚洲综合图区| 亚洲AV综合色区无码二区爱AV| 久久久久久久尹人综合网亚洲| 免费va人成视频网站全| 日本a级片免费看| 女人被弄到高潮的免费视频| 91免费在线播放|