spring持久化

spring持久化可以從幾個方面來看:
 
1.對異常的處理
      spring中提供了DataAccessException,這個異常類是對現有多數據庫拋出異常的封裝,並可以對不同數據庫拋出異常的狀態碼進行解釋。因此,在業務層中方法聲明throws DataAccessException,可以不必擔心拋出我們沒有捕獲到的數據庫操作異常,把精力放在“業務異常”上面。
 
2.模板類
      spring設計爲了更好的管理異常、事務,避免業務方法中重複的try/catch塊,設計出模板類,最重要的兩個爲JdbcTemplate,HibernateTemplate,spring的模板類都是線程安全的,由ThreadLocal進行資源管理。
 
      使用JdbcTemplate,HibernateTemplate必須注入DateSource,SesssionFactory,通過構造方法注入。例:
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
  <property name="url"><value>${jdbc.url}</value></property>
  <property name="username"><value>${jdbc.username}</value></property>
  <property name="password"><value>${jdbc.password}</value></property>
 </bean>
  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-org><ref bean="dataSource"/></constructor-arg>
 </bean>
 
       HibernateTemplate配置與上相同,配置sessionFactory.把配置好的jdbcTemplate,hibernateTemplate注入到我們的DAO或業務類中,即可使用。但是通常我們有很多的DAO類或業務類,這樣做的話我們每個類都要注入一次,解決這樣的問題,我們可以把模板類放到父類中,子類調用即可。
 
       這一切,spring已經都想到了,spring提供了JdbcDaoSupport,HibernateDaoSupport類,這兩個類都是abstract class,不能實例化,我們的業務類繼承這兩個類,通過getJdbcTemplate(),getHibernateTemplate()方法即可得到對應的模板類。當然,我們首先要將模板類注入到這兩個XXXDaoSupport類中。
 
      <bean id = "jdbcDaoSupport" class=" org.springframework.jdbc.core.support.JdbcDaoSupport">
      <property name="jdbcTemplate"><ref bean = "jdbcTemplate"/></property>
    </bean>
 
     JdbcTemplate類用法:
 
     getJdbcTemplate().query("select * from news",new RowCallBackHandler(){
           public void processRow(ResultSet rs ){....}
     }
 
    getJdbcTemplate().update(".....");
 
    getJdbcTemplate().update("update news set title=? where id=?",new PreparedStatementSetter(){
        public void setValue(PreparedStatement pstmt) throws SQLException{
            pstmt.setString("dd");
            pstmt.setInt(2);
       }
   }
 
   getHibernateTemplate().execute(new HibernateCallback(){
       public Object doInHibernate)(Session s) throws HibernateException {
           ......
       }
   }
 
  HibernateTemplate用法:
 
  getHibernateTemplate().execute(new HibernateCallback(){
      public Object doInHibernate(Session s) throws SQLException {
          return s.find("...");
      }
  }
  
    在開發中直接使用這些模板,代碼看起來可能不是很直觀,本身這些模板只是爲我們省了一些異常處理等代碼,只是對原有hibernate session,jdbc connection,datasource的一個封裝。所以,在實際開發中,爲了靈活的使用模板,並充分發揮原有session等功能,還要封裝一個BaseDao類,把常用CRUD、分頁等操作封裝供子類DAO調用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章