分類  >  資料庫 >

Spring 使用資料庫(資料庫交互處置)

tags:    時間:2014-03-22 12:31:00
Spring 使用資料庫(資料庫交互處理)
Spring里的數據處理多數採用「模板方法」模式

針對不同的對象/關係映射框架提供的模板有JdbcTemplate、HibernateTemplate、SimpleJdbcTemplate等很多模板。

使用模板的兩種方法:
1)、將其配置為Spring上下文里的Bean,然後將其織入到程序的DAO。
2)、使用Spring的DAO支持類進一步簡化程序DAO。【DAO支持類派生出自己的DAO類:在編寫自己的DAO實現時,可以繼承DAO支持類,然後調用模板獲取方法來直接訪問底層的數據訪問模板。例如程序DAO繼承了JdbcDaoSupport,那麼只需調用getJdbcTemplate()方法就可以獲得一個JdbcTemplate來使用。另外每個DAO支持類都能訪問它與資料庫進行通信所有的類,例如JdbcDAOSupport.getConnection()獲得鏈接。DAO支持類舉例:JdbcDAOSupport、HibernateDAOSupport、simpleJdbcDAOSupport等】

Spring的大多數持久支持選項依賴於數據源,首先需要配置Spring數據源,無論什麼DAO支持類,都需先陪這個。

數據源獲得的幾種途徑(Spring里配數據源的途徑):
1)、jdbc驅動程序定義的數據源;
2)、jndi查詢的數據源;
3)、連接池的數據源;

下面是採用連接池的方式配置數據源,首先配置連接池,需要下載DBCP,然後把jar文件放到classPath下,DBCP裡面有多個提供池功能的數據源,我們採用最常用的一個BasicDataSource,這個使用起來比較簡單,BasicDataSource的配置代碼和常用的配置屬性見P110。

jdbc驅動定義的數據源有兩種:DriverManagerDataSource、SingleConnectionDataSource,這兩種都有弊端,一般不用(一個是沒有進行池管理,一個是只有一個連接,用的很少)。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面首先講解第一部分內容:使用JDBC模板

對於JDBC來說,Spring提供了3個模板類:JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate。
下面是這3個類最基本的類似的使用方式(它們的使用方式非常類似,只是執行查詢、修改等操作時參數不同,配置完全類似):
1、首先聲明Template:
<bean id="jdbcTemplate" class="org.spring......JdbcTemplate">
   <property name="datasource" ref="dataSource"/>
</bean>
2、然後在Dao裡面聲明private JdbcTemplate jdbcTemplate,並聲明set方法。
3、聲明Dao Bean,並注入jdbcTemplate屬性:
<bean id="rantDao" class="com.roadrant......JdbcRantDao">
   <property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
4、接下來就可以在DAO中使用jdbcTemplate操作資料庫了。具體使用方式參考書上使用範例。(書上都有,要詳細查看其中比如更新、查詢、刪除等對應方法)。

注意:上面是JdbcTemplate的大體使用示例及配置,另外兩個NamedParameterJdbcTemplate、SimpleJdbcTemplate的配置基本相同,只需將類名修改下並且DAO是聲明變數時將變數類型修改下即可。具體的操作SQL語句方式示例自己詳細看書。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面講解第二部分內容:Spring對JDBC的DAO支持類:

Spring的JdbcDaoSupport就是用於編寫基於JDBC的DAO類的基類,我們只需讓自己的DAO類繼承它即可(下面是使用步驟):
1、讓自己的DAO類繼承JdbcDaoSupport,例如
public class JdbcRantDao extends JdbcDaoSupport......{.......}
2、接下來聲明自己的DAO,並注入jdbcTemplate(不需要DAO裡面定義jdbcTemplate屬性)或直接將數據源注入(更簡單,這樣就不需要在Spring里聲明jdbcTemplate Bean了)
<bean id="rantDao" class="com.roadrantz......JdbcRantDao">
   <property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
【註:這樣的話就不需要在自己的DAO里定義jdbcTemplate這個屬性了,因為JdbcDaoSupport類里有這個屬性,繼承過來即可。但還需要在Spring里聲明jdbcTemplate Bean】;



<bean id="rantDao" class="com.roadrantz......JdbcRantDao">
   <property name="dataSource" ref="dataSource"/>
</bean>
【註:當JdbcDao的dataSource屬性被設置后,它會在內部創建一個JdbcTemplate實例,這樣我們就不需要自己再Spring里明確聲明一個JdbcTemplate Bean了,並且自己的Dao類里也不需要定義JdbcTemplate屬性了。這種使用方式比較簡單實用】

3、利用JdbcDaoSupport的getJdbcTemplate()方法能方便的訪問JdbcTemplate,然後用它操作SQL語句操作資料庫。具體JdbcTemplate操作SQL語句及各種增刪改查操作示例見書上。

注意:上面是Spring對Jdbc的Dao支持類,使用示例及配置,另外兩個NamedParameterJdbcDaoSupport、SimpleJdbcDaoSupport的配置基本相同,只需將Dao繼承的類名修改下即可,例如getNamedParameterJdbcTemplate()方法即可獲得NamedParameterJdbcTemplate的一個實例。具體操作SQL的使用方式將書上。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面講解第三部分內容:Spring對ORM框架的支持,重點講解Spring里繼承Hibernate:

選擇Hibernate版本:Hibernate2和Hibernate3使用中最重要一點區別是Hibernate3支持註解,Hibernate2不支持。大部分情況下還是使用Hibernate3。

與Hibernate進行狡猾的主要介面是org.hibernat.session,這個session介面提供了基本的數據訪問功能,比如從資料庫保存、更新、和載入對象,通過它,程序能執行任何持久功能。獲得Hibernate Session對象引用的標準方式是實現Hibernate的SessionFactory介面。SessionFactory負責打開、關閉、和管理Hibernate Session,以及其他一些功能。

就像JdbcTemplate把JDBC的繁瑣工作抽離出去一樣,Spring的HibernateTemplate在Hibernate   Session之上提供了一個抽象層,其主要功能是簡化打開和關閉Hibernate會話,並且把Hibernate的特定異常轉化為表Spring ORM異常之一。

下面是Spring集成Hibernate的步驟:
1、聲明hibernateTemplate Bean並注入sessionFactory:
<class id="hibernateTemplate" class="org.springframework.......HibernateTemplate">
   <property name="sessionFactory" ref="sessionFactory"/>
</class>
2、聲明SessionFactory Bean,sessionFactory屬性被設置為org.hibernate.SessionFactory實現的一個引用,這裡提供幾種可選的聲明方式:
  1)、使用Spring的LocalSessionFactoryBean:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalLocalSessionFactoryBean">
   <property name="dataSource" ref="dataSource"/>
   <property name="mappingResources"><!--映射文件-->
      <list>
         <value>com/roadrantz/domain/Rant.hbm.xml</value>
         .................
      </list>
   <property/>
   <property name="hibernateProperties"><!--hibernate配置屬性-->
      <props>
         <prop key="hibernate.dialect">${hibernate.dialect}</prop>
      </props>
   </property>
</bean>
  2)、我們可以選擇使用註解把持久元數據標記到域對象。對於基於註解的Hibernate來說,Spring的AnnotationSessionFactory和上面的LocalSessionFactory Bean很像,只是它基於一個或多個域類里的註解和創建SessionFactory:
<bean id="sessionFactory" class=".............AnnotationSessionFactory">
   <property name="dataSource" ....../>
   <property name="annotatedClasses"><!--包含一個或多個包含持久註解的類-->
      <list>
         <value>com.roadrantz.domain.Rant</value>
         ..............
      </list>
   </property>
   <property name="hibernateProperties">......</property>
</bean>

3、然後在自己的Dao類裡面定義屬性,例如:
private HibernateTemplate hibernateTemplate;並定義此屬性的set方法。
4、聲明Dao Bean,並注入hibernateTemplate屬性:
<bean id="rantDao" class="com.roadrantz........HibernateRantDao">
   <property name="hibernateTemplate" ref="hibernateTemplate">
</bean>
5、接下來就是使用hibernateTemplate操作資料庫了,詳細操作方式看書,。
例如:hibernateTemplate.saveOrUpdate(velicle);

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面講解第四部分內容:Spring對Hibernate的DAO支持類:

為了讓上面講解的一部分的事情簡單一些,Spring提供了HibernateDaoSupport,它能夠讓我們把會話工廠Bean直接裝配到DAO類,會創建一個HibernateTemplate供DAO使用。

下面是使用步驟:
1、讓自己的Dao類繼承HibernateDaoSupport。例如:
public clss HibernateRantDao extends HibernateDaoSupport{....................}
2、在Dao裡面使用getHibernteTemplate()方法獲得由HibernateDaoSupport創建的HibernateTemplate(在Dao裡面不需要自己定義HibernateTemplate屬性了),並用它來操縱資料庫。
例如:
public void saveMotorist(Motorist motorist) {
   getHibernateTemplate().saveOrUpdate(motorist);
}
3、聲明Dao Bean,並把SessionFactory Bean裝配到Dao Bean的SessionFactory屬性:
<bean id="rantDao" class="com.roadrantz.dao.hibernate.HibernateRantDao">
   <property name="sessionFactory" ref="sessionFactory"/>
</bean>
【HibernateRantdao的新父類HibernateDaoSupport需要一個Hibernate SessionFactory,這樣它才能在內部生成一個HibernateTemplate,所以需要把sessionFactory Bean注入到裡面】

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面講解第五部分內容:Hibernate3上下文會話(解決Hibernate與Spring的耦合問題):

HibernateTemplate的缺點是具有一定的侵入性,當我們使用Spring的HibernateTemplate時(無論直接使用還是通過HibernateDaoSupport),HibernateRantDao類都被耦合到Spring API,而Hibernate3的上下文會話可以解決這一問題。
下面是Hibernate3的上下文會話使用方式:
1、在自己的Dao裡面定義SessionFactory sessionFactory屬性,並定義此屬性set方法。
2、配置自己的Dao Bean,並注入sessionFactory屬性:
<bean id="rantDao" class="com.roadrantz.......HibernateRantDao">
   <property name="sessionFactory" ref="sessionFactory"/>
</bean>
【在這個新的HibernateRantDao里,sessionFactory屬性注入了一個sessionFactory引用,由於sessionFactory來自於Hibernate API,所以HibernateRantDao不再依賴於Spring框架,現在我們就要使用sessionFactory來處理當前會話,而不是使用HibernateTemplate來執行持久操作。】
3、使用SessionFactory來處理當前會話:
public void saveRant(Rant rant) {
   sessionFactory.getCurrantSession().saveOrUpdate(rant);
}

推薦閱讀文章

Bookmark the permalink ,來源:互聯網