標籤:
1.spring 對資料庫訪問的支援
當我們開發持久層的時候,我們面臨著多種選擇,比如使用JDBC、Hibernate、java持久化API或其它持久化架構。幸好的是spring能夠支援所有這些持久化機制。
DAO(data access boject)Data Access Objects,這個名字就很形象描述了DAO在應用程式中所扮演的角色。DAO提供了資料的讀取、寫入到資料庫中的一種方式。它們應該以介面的方式發布功能,而應用程式的其它部分就可以通過介面來進行訪問了。
2.配置資料來源
spring提供了在spring上下文中配置資料來源Bean的多種方式,包括:
a.通過JDBC驅動程式定義的資料來源;
b.通過JNDI尋找的資料來源;
c.串連池的資料來源;
接下我們就專門來講講從使用串連池擷取串連的資料來源!(即c點)
上下文配置Bean的代碼:
<span style="font-size:18px;"><!--配置資料來源 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/><property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/><property name="username" value="wwo"/><property name="password" value="wwo"/><!-- 串連池啟動時的初始值 --><property name="initialSize" value="3" /><!-- 串連池的最大值 --><property name="maxActive" value="300" /><!-- 最大空閑值.當經過一個高峰時間後,串連池可以慢慢將已經用不到的串連慢慢釋放一部分,一直減少到maxIdle為止 --><property name="maxIdle" value="2" /><!-- 最小空閑值.當閒置串連數少於閥值時,串連池就會預申請去一些串連,以免洪峰來時來不及申請 --><property name="minIdle" value="1" /><!-- end --></bean></span>
註:JDBC驅動資料來源並沒有池的概念,因此沒有存在池屬性的配置!
好了,到這一步,我們已經完成了通過資料來源建立了與資料庫的串連,接下來就是實際訪問資料庫了。
3.在Spring中整合Hibernate
Hibernate一些特性:
a.消極式載入(Lazy loading):例如一個Bean對象由其屬性及另一個Bean對象組成,如果我們只關注的只是這個Bean對象的屬性,那麼我們可以藉助於消極式載入,只抓取需要的資料;
b.預先抓取(Eager fetching):這與消極式載入是相對的,一個Bean所關聯的其它Bean都會被查詢出來,這就節省了多次查詢的成本;
c.級聯(Cascading):有時候刪除一個Bean對象後,也希望其同時能資料庫中刪除掉與其關聯的其它Bean。
Spring對Hibernate ORM架構的支援提供了與這些框架組成點以及一些附加的服務,如下所示:
a.Spring聲明式事務的整合支援;
b.透明的異常處理;
c.安全執行緒的、輕量級的模板類;
d.DAO支援類;
e.資源管理。
4.聲明會話工廠(Session Factory)
使用Hibernate的主要介面是org.hibernate.Session。Session提供了基本的資料訪問功能,如儲存、更新、刪除以及從資料庫載入對象的功能。
能過藉助於Hibernate的SessionFactory來擷取Session對象,SessionFactory主要負責Hibernate Session的開啟、關閉以及管理。
配置在xml內容相關的Bean如下:
<span style="font-size:18px;"><bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="packagesToScan"><!--掃描一下實體目錄 --><list><value>com.cd.entity</value></list></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.format_sql"> true</prop><prop key="current_session_context_class">thread</prop></props></property></bean></span>
5.建立自己的基礎DAO類
Spring可以通過Spring的Hibernate模板來保證每個事務都使用同一個會話。既然Hibernate能夠對其自己進行管理,那就不必要使用模板類了。接下我們直接將Hibernate Session裝配到自己的DAO類中。
<span style="font-size:18px;">/** * 基礎dao * @param <T> */public abstract class BaseDAO<T> {/** * 注入sessionFactory */@Autowiredprivate SessionFactory sessionFactory;/** * 獲得session * * @return */protected Session getCurrentSession() {return sessionFactory.getCurrentSession();}/** * 儲存 * * @param entity * @throws Exception */public void add(T entity) throws Exception {getCurrentSession().save(entity);}/** * 調用預存程序 * * @param proName * @return */public CallableStatement citePro(final String proName){Session session = getCurrentSession();CallableStatement proc=session.doReturningWork( new ReturningWork<CallableStatement>() { @Override public CallableStatement execute(Connection connection) throws SQLException{ CallableStatement resultSet = connection.prepareCall(proName); return resultSet; } } );return proc;}}</span>
Spring訪問oracle資料庫配置步驟