SpringAccess資料庫(oracle)構造

來源:互聯網
上載者:User

標籤:

陳科朝:http://blog.csdn.net/u013474104/article/details/44279309

================

1.spring 對資料庫訪問的支援

當我們開發持久層的時候。我們面臨著多種選擇。比方使用JDBC、Hibernate、java持久化API或其他持久化架構。幸好的是spring可以支援全部這些持久化機制。

DAO(data access boject)資料訪問對象,這個名字就非常形象描寫敘述了DAO在應用程式中所扮演的角色。

DAO提供了資料的讀取、寫入到資料庫中的一種方式。它們應該以介面的方式公布功能,而應用程式的其他部分就能夠通過介面來進行訪問了。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ3NDEwNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="font-size:18px">

註:服務物件本身並不會處理資料訪問。而是將資料訪問託付給DAO。DAO介面確保其與服務物件的松耦合。

2.配置資料來源

spring提供了在spring上下文中配置資料來源Bean的多種方式,包含:

a.通過JDBC驅動程式定義的資料來源;

b.通過JNDI尋找的資料來源;

c.串連池的資料來源;

接下我們就專門來講講從使用串連池擷取串連的資料來源!

(即c點)

上下文配置Bean的代碼:

<!--配置資料來源 --><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>
註: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例如以下:

<bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="packagesToScan"><!--掃描一下實體檔案夾 --><list><value>com.blog.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>
5.建立自己的基礎DAO類

Spring可以通過Spring的Hibernate模板來保證每一個事務都使用同一個會話。既然Hibernate可以對其自己進行管理,那就不必要使用模板類了。接下我們直接將Hibernate Session裝配到自己的DAO類中。

/** * 基礎dao *  * @author ckz *  * @param <T> */public abstract class BaseDAO<T> {private Class<T> baseEntity;protected BaseDao(Class<T> baseEntity) {this.baseEntity = baseEntity;}/** * 注入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;}/** * 更新 *  * @param entity * @throws Exception */public void update(T entity) throws Exception {getCurrentSession().update(entity);}/** * 儲存或更新 *  * @param entity * @throws Exception */public void saveOrUpdate(T entity) throws Exception {getCurrentSession().saveOrUpdate(entity);}/** * 刪除 *  * @param entity * @throws Exception */public void delete(T entity) throws Exception {getCurrentSession().delete(entity);}/** * 依據id擷取對象 *  * @param Id * @return */@SuppressWarnings("unchecked")public T getById(final Serializable Id) {return (T) getCurrentSession().get(this.baseEntity, Id);}}


註:

1.T表示的是泛型的參數類型,java泛型簡述--http://blog.csdn.net/u013474104/article/details/44337145;

2.T - 由此Class 對象建模的類的類型。

比如,String.class 的類型是 Class<String>

假設將被建模的類未知。則使用Class<?>;


著作權聲明:本文博主原創文章,部落格,未經同意不得轉載。

SpringAccess資料庫(oracle)構造

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.